Этот ответ описывает, как найти второй по величине элемент; Нахождение второго наименьшего можно сделать аналогично. Для простоты мы также предполагаем, что все числа разные.
Чтобы найти величайший элемент, давайте построим дерево «чемпионата»: объединяем элементы в пары, решаем, какой из них больше (тот, кто является «победителем»), затем объединяем в пары победителей, решаем, что больше, и и так далее, пока вы не найдете «чемпиона», который является величайшим элементом. Это занимает n шагов. Теперь, второй по величине элемент должен быть по сравнению с чемпионом. (потому что только чемпион мог победить его). log n элементов были сравнены с чемпионом, поэтому из них выбираем наибольшее; это занимает log n шагов.
В качестве примера давайте посмотрим, как это работает для числового кортежа [6,4,3,5,2,1]. В первом раунде пары (6,4), (3,5), (2,1). Победителями становятся более крупные элементы в каждой паре, то есть 6,5,2. Во втором раунде пары - (6,5), 2. (у 2 здесь нет пары, поэтому он будет автоматически переведен в следующий раунд). Победители второго раунда - 6 и 2, в третьем раунде единственная пара - (6,2), 6 - победитель. Теперь, объединяя элементы в группы и выбирая победителя, мы создали (корневое, двоичное) дерево:
Это дерево обладает тем свойством, что для узла x
и его дочерних элементов y,z
у нас есть x>=y, x>=z
, поэтому
мы знаем, что самый большой элемент - тот, что вверху (в корне). Мы также знаем, что второй по величине элемент w
не добрался до вершины, поэтому у него есть родительский элемент в дереве. Но его родительский элемент больше или равен w
, поэтому на некотором уровне дерева один из дочерних элементов величайшего элемента - w
. (Другими словами, второй величайший элемент может быть «побежден» только величайшим элементом). Поэтому все, что нам нужно сделать, - это вернуться на путь, по которому прошел величайший элемент, и собрать всех прямых детей, мы знаем, что среди них второй по величине. В нашем случае это элементы 2,5,4. (В общем, их около log n
, где log
обозначает основание два логарифма, потому что дерево имеет высоту log n
.). Из этих элементов мы выбираем наибольшее с любым методом, который делает log n
шагов, и мы нашли второй по величине.
Все это может напомнить нам о чемпионате, где цифры обозначают, насколько «хороша» каждая команда, отсюда и термин «дерево чемпионата».