Розчин на основі хешбела
Не впевнений, чому хештейн ускладнює складність Ω(n2) якщо n- кількість символів (не слів).
Якщо ви повторите кожен символ у документі і, як ви повторюєте, обчисліть хеш-код слова, ви пройшли через nсимволів. Тобто, як тільки зустрічається буква, слово починається, тому починайте обчислювати хеш, поки слово не закінчиться (є деякі особливі випадки пунктуації, але вони не впливають на складність). Після кожного обчислення хешу додайте його до хештету. Це уникнути перебору кожного слова двічі, тобто спочатку перегляньте документ, щоб знайти слова, а потім вставити їх у хешблет, хоча складність у цьому випадку також може бутиΩ(n).
Зіткнення в хештейлі, безумовно, є проблемою, і залежно від того, наскільки великий був оригінальний хештель та наскільки хороший алгоритм хешування, можна було б наблизитися до O(1) для вставки та зберігання рахунків і таким чином O(n)для алгоритму, хоча за рахунок пам’яті. Однак я все ще не можу оцінити, як можна стверджувати про найгірший випадокO(n2) якщо n - кількість символів.
Припущення полягає в тому, що алгоритм хешуваннявання лінійний за часом відносно кількості символів.
Рішення на основі сортування Radix
Крім того, якщо припустити англійську мову, оскільки довжина слів добре відома, я б замість цього створив сітку та застосував сортинг radix, який є O(kN) де k була б максимальна довжина слова в англійській мові та N- загальна кількість слів. Даноn - кількість символів у документі та k є постійною, асимптотично це сума O(n).
Тепер порахуйте частоту кожного слова. Оскільки слова відсортовані, ми будемо порівнювати кожне слово з його попереднім словом, щоб побачити, чи воно одне й те саме чи одне. Якщо це те саме, ми видаляємо слово і додаємо підрахунок до попереднього. Якщо різні, просто зробіть рахунок 1 і рухайтеся далі. Для цього потрібно2n порівняння де n - кількість символів, і таким чином O(n) у складності в цілому.
Кілька найдовших слів англійською мовою є смішно довгими , але тоді можна обмежити довжину слова на розумну кількість (наприклад, 30 чи менших) та обрізати слова, приймаючи похибки, які можуть бути пов'язані з цим.