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