Чтобы получить верхние k элементов из несортированного списка, вы используете алгоритм Quickselect , чтобы разбить массив таким образом, чтобы первые k элементов были в начале массива.
Быстрый выбор в среднем равен O (n). Однако в патологических случаях это может занять O (n ^ 2) времени.
Используя кучу, выбираем верхние k элементов из списка из n - O (n log k). Если вы берете первые записи журнала (n), тогда k = log(n)
, и ваша сложность составляет O (n log (log (n))).
С точки зрения производительности, использование кучи для выбора элементов верхнего журнала (n) из списка почти наверняка будет быстрее, чем использование Quickselect. Причина в том, что Quickselect, хотя он (в среднем) линейный, имеет высокую постоянную. Для выбора 10 лучших элементов из списка 1 000 000 требуется почти то же время, что и для выбора 100 000 лучших элементов. Но мое исследование показывает, что использование кучи для выбора происходит быстрее, чем быстрый выбор, когда выбираемое число намного меньше (менее 1%) от общего количества элементов. Учитывая, что база журнала 2 из 1 000 000 составляет около 20, почти наверняка алгоритм выбора кучи будет быстрее, чем Quickselect.