Вход: положительное целое число K и большой текст. Фактически текст можно рассматривать как последовательность слов. Поэтому нам не нужно беспокоиться о том, как разбить его на последовательность слов.
Вывод: K наиболее часто встречающихся слов в тексте.
Я думаю так.
используйте хеш-таблицу для записи частоты всех слов при обходе всей последовательности слов. На этом этапе ключом является «слово», а значением - «частота слова». Это занимает O (n) времени.
отсортировать пару (слово, частота слова); и ключ - "частота слов". Это занимает O (n * lg (n)) времени с обычным алгоритмом сортировки.
После сортировки мы берем только первые K слов. Это занимает O (K) времени.
Подводя итог, общее время составляет O (n + n lg (n) + K) , Поскольку K, безусловно, меньше N, то на самом деле это O (n lg (n)).
Мы можем это улучшить. На самом деле, нам просто нужны первые K слов. Частота других слов нас не волнует. Итак, мы можем использовать «частичную сортировку кучи». На шагах 2) и 3) мы не просто выполняем сортировку. Вместо этого мы меняем его на
2 ') построить кучу пар (слово, частота слова) с ключом "частота слова". На создание кучи уходит O (n) времени;
3 ') извлечь из кучи верхних K слов. Каждое извлечение составляет O (lg (n)). Итак, общее время O (k * lg (n)).
Подводя итог, это решение стоит времени O (n + k * lg (n)).
Это просто моя мысль. Я не нашел способа улучшить шаг 1).
Я надеюсь, что некоторые специалисты по информационному поиску смогут пролить больше света на этот вопрос.