Этот алгоритм аналогичен алгоритму Джастина Саймона, но ключевой момент заключается в том, как вычислить медиану (или k-й элемент) S, эффективно используя только пространство O (1).
Вот этот ключевой алгоритм,который рандомизирован:
Установите нижний, равный минимальному элементу S, и верхний, равный максимальному элементу S. Выберите случайный элемент x из S, который находится между нижним и верхним (это стоит не более O (n) ожидаемое время).Вычислить ранг x (O (n) времени).Если ранг х слишком низок, установите значение более низким для преемника времени x (O (n)), иначе установите значение верхнего уровня равным предшественнику времени x (O (n)).Повторяйте до тех пор, пока нижний не будет равен верхнему.
Обратите внимание, что каждая итерация стоит O (n) в ожидании, и есть O (lg n) итераций в ожидании, поэтому ожидаемые затраты времени составляют O (n lg n) и использование пространстваO (1), так как мы храним только нижний и верхний.
Используя эту возможность для выбора k-го элемента, мы можем затем использовать принцип "голубиного отверстия", как предложено в первоначальном вопросе , чтобы найти все более и более малымсегменты S, которые содержат слишком много элементов, чтобы все были различимыми, используют O (lg n) линейное сканирование пространства A и O (1) для хранения соответствующих сумм элементов в каждой области.Каждая такая итерация стоит O (n) в дополнение к O (n lg n) стоимости нахождения k-го элемента, и есть O (lg n) итераций, поэтому общая стоимость составляет O (n lg ^ 2 n).