Зная, что в английском словаре около 200 тысяч слов, а в алфавите 26 букв или около того.
Каков размер префиксного дерева (trie), содержащего все английские слова?
Ответы (3)
В этой статье автор построил пример английского слов из файла длиной 935 015 байт. Для этого потребовалось четверть миллиона узлов. Он заявляет о степени сжатия примерно 73%, что довольно близко к тому, что я помню из своей работы с такими структурами данных.
Обратите внимание, что его реализация тратит много памяти, сохраняя массив из 26 дочерних указателей для каждого узла. Гораздо менее дорогая реализация будет поддерживать только те указатели, которые ей нужны, упорядоченные по частоте использования. Например, хранить 26 указателей дочерних узлов для буквы q
в слове — это безумие, учитывая, что крайне маловероятно, что символ после q
будет чем-то другим, кроме u
.
Последовательный поиск занял бы немного больше времени, чем прямая индексация массива, но позволил бы значительно сэкономить память. А экономия памяти может привести к гораздо меньшему количеству промахов в кэше, что с лихвой компенсирует увеличение стоимости линейного поиска.
Если вы хотите сэкономить еще больше места, вы можете создать направленный ациклический граф слов, в котором также используются общие окончания и некоторые другие оптимизации. Например, вы можете сжать висячие окончания в один узел.
При использовании простого дерева префиксов требуемое пространство должно быть O(N*C), где C — среднее количество символов в слове, а N — количество слов. Это связано с тем, что в худшем случае Trie будет хранить каждый символ в каждом слове. Таким образом, справедливой оценкой будет около 1 миллиона сохраненных символов или около 1 МБ.
Wolfram alpha говорит, что средняя длина слова будет 5,1 символа http://www.wolframalpha.com/input/?i=average+english+word+length
Если L=26, количество букв в алфавите и K=5,1 средняя длина английского слова.
=> Я ожидаю, что сложность пространства будет где-то около O (L ^ K) (L в степени K)
Я полагаю, что реализация на реальном языке может отличаться.
L^K
не предполагает общих префиксов. Весь смысл дерева префиксов в том, чтобы использовать общие префиксы. Быстрый поиск показывает эмпирические результаты в диапазоне от (N*K)/4
до (N*K)/3
узлов, где N
— количество слов, а K
— средняя длина слов.
- person Jim Mischel; 05.03.2014