Предположим, что всего n слов, и нам нужны наиболее часто встречающиеся k слова (здесь k = 10).
Если n намного больше, чем k , самый эффективный способ, который я знаю, - это поддерживать минимальную кучу (т. Е. Верхний элемент имеет минимум частота всех элементов в куче). На каждой итерации вы добавляете следующую частоту в кучу, и если куча теперь содержит k + 1 элементов, вы удаляете наименьший . Таким образом, размер кучи поддерживается равным k элементам, содержащим в любое время элементы k с самой высокой частотой, которые когда-либо наблюдались. В конце обработки, считайте элементы k самой высокой частоты в порядке возрастания.
Сложность времени: Для каждого из n слов мы делаем две вещи: вставляем в кучу размером не более k и удаляем минимальный элемент , Каждая операция стоит O (log k) времени, поэтому весь цикл занимает O (nlog k) времени. Наконец, мы считываем элементы k из кучи размером не более k , принимая время O (klog k), за общее время O ((n + k) log к). Поскольку мы знаем, что k <<em> n , O (klog k) в худшем случае O (nlog k), поэтому это можно упростить до O (nlog k).