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