Я бы решил эту проблему, используя следующий поток логики:
Извлечение набора суффиксов для каждого слова.Итак, из «ipadnews» мы получаем: «ipadnews», «padnews», «adnews» и так далее.Таким образом, «news» будет одним из суффиксов, но не «ipad».
Чтобы восполнить отсутствующие подстроки на предыдущем шаге, также извлеките префиксы.Мы получаем «ipadnew», «ipadne» и т. Д., Включая «ipad».
Для каждой из приведенных выше подстрок хешируем их в счетчик, например $ hash {$ substr} ++.
В конце у нас будет длинная хеш-таблица с частотой слов в качестве значений.Предположим, что вместо дорогой сортировки вам нужно всего 10 самых популярных слов.Сохраняйте набор с самого начала, критерии которого заключаются в том, что любое слово в нем должно иметь оценку, превышающую текущую минимальную оценку.Вы можете отслеживать слово с минимальной оценкой, а когда вы добавляете 11-й элемент с оценкой, превышающей минимальную оценку, выделяете слово с минимальной оценкой и обновляете указатель минимальной оценки.
Максимальное количествоКлючи в хеш-таблице будут 2 * k * n, где k - средняя длина слов, а n - общее количество слов.