Есть много стратегий, доступных для вашей задачи (если вы не сосредотачиваетесь на самобалансирующемся дереве с самого начала).
Обычно это компромиссная скорость / память.Большинство алгоритмов требуют либо изменения массива на месте, либо O(N)
дополнительного хранилища.
Решение с самобалансирующимся деревом относится к последней категории, но здесь это неправильный выбор.Проблема в том, что построение самого дерева занимает O(N*log N)
, что будет доминировать в последующем поисковом запросе и даст окончательную сложность O(N*log N)
.Поэтому вы не лучше, чем просто сортировать массив и использовать сложную структуру данных ...
В общем, проблема во многом зависит от величины i
, связанной с N
.Если подумать минуту, для i == 1
это тривиально, верно?Это называется нахождением максимума.
Ну, та же самая стратегия, очевидно, работает для i == 2
(перенос двух элементов вокруг) в линейном времени.И это также тривиально симметрично: т. Е. Если вам нужно найти N-1-й элемент, просто возьмите с собой 2 минимальных элемента.
Однако он теряет эффективность, когда i
равен N / 2 или N/ 4.Перенос элементов i Maximum означает сортировку массива размером i
... и, таким образом, мы отступаем к стене N*log N
.
Джерри Коффин указал на простое решение, которое хорошо подходит для этого случая.Вот ссылка на Википедия .В полной статье также описывается метод «Медиана медианы»: он более надежен, но требует больше работы и, как правило, медленнее.