Вхідні дані: Позитивне ціле число 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).
Сподіваюсь, деякі експерти з питань пошуку інформації можуть пролити більше світла на це питання.