Редактировать: Упс, пропустил простую вещь из-за глупости. Это решение не является правильным, хотя я держу его здесь, так как оно все еще среднее (n + log (n)). Спасибо ShreevatsaR за указание на мою глупость. Я рассмотрел поиск по дереву, но совершенно упустил идею возврата назад, чтобы найти второе по величине число в log (n).
В любом случае, здесь следует мое доказательство того, почему подчиненный алгоритм не больше, чем avg (n + log (n)). В реальной жизни он все еще должен работать, по крайней мере, очень хорошо.
- Первое сравнение со вторым по величине записанным числом.
- Только в случае успешного сравнения сравнить с наибольшим записанным числом.
Чтобы доказать, что это в среднем n + log n, нам просто нужно доказать, что первое сравнение в среднем только успешно завершается log (n) раз. И это довольно просто увидеть или продемонстрировать.
- Предположим, что P является фактической позицией текущего второго по величине числа в отсортированной версии списка, и запустите алгоритм
- Если P> 2, то при обнаружении большего числа новый P в среднем будет не более P / 2.
- Если P = 2, то первое сравнение не может быть успешным, поскольку нет числа, которое больше текущего второго по величине числа.
- P может максимально равняться N
- Из 2, 3 и 4 должно быть тривиально видеть, что первое сравнение не может быть успешным в среднем больше, чем log (N) раз.