Data structures 什么';包含所有英语单词的前缀树(trie)的大小是多少?

Data structures 什么';包含所有英语单词的前缀树(trie)的大小是多少?,data-structures,trie,Data Structures,Trie,知道英语词典中大约有20万个单词,字母表大约有26个字母。Wolfram alpha说单词的平均长度为5.1个字符 如果L=26,字母表中的字母数 K=5.1英语单词的平均长度 =>我预计空间复杂度在O(L^K)左右 (L到K的幂) 我想,实际语言中的实现可能会有所不同。使用简单的前缀树,空间要求应该是O(N*C),其中C是每个单词的平均字符数,N是单词数。这是因为在最坏的情况下,Trie将存储每个单词中的每个字符。因此,一个公平的估计是大约存储了100万个字符,或大约1MB。年,作者从一个9

知道英语词典中大约有20万个单词,字母表大约有26个字母。

Wolfram alpha说单词的平均长度为5.1个字符

如果L=26,字母表中的字母数 K=5.1英语单词的平均长度

=>我预计空间复杂度在O(L^K)左右 (L到K的幂)


我想,实际语言中的实现可能会有所不同。

使用简单的前缀树,空间要求应该是O(N*C),其中C是每个单词的平均字符数,N是单词数。这是因为在最坏的情况下,Trie将存储每个单词中的每个字符。因此,一个公平的估计是大约存储了100万个字符,或大约1MB。

年,作者从一个935015字节长的文件中构建了一个英语单词trie。它需要25万个节点。他声称压缩率约为73%,这与我在处理此类数据结构时的记忆非常接近

注意,他的实现为每个节点存储了26个子指针数组,浪费了大量内存。一个便宜得多的实现将只维护它所需要的指针,按使用频率排序。例如,考虑到
q
后面的字符不太可能是
u
以外的任何字符,在一个单词中存储字母
q
的26个子节点指针有点疯狂

顺序搜索比直接对数组进行索引需要稍长的时间,但这将节省大量内存。而且,节省的内存可以大大减少缓存未命中率,这可以很好地弥补线性搜索增加的成本


如果您对节省更多空间感兴趣,可以创建一个有向无环单词图,它还可以利用公共结尾以及其他一些优化。例如,您可以将悬空结尾压缩到单个节点。

您的估计似乎没有根据。L^K是所有K长度字符串的数字,带有字母表中的L符号,也就是说,它可能估计的唯一相关数字是单词的数量,但这已经给出了,这不是我们试图找到的数量。此外,即使出于这一目的,无论是在理论上(它统计所有可能的字符串,它们的长度与平均英语单词相同,但大多数不是英语单词,许多英语单词的长度不同),还是在实践中(它给出的长度约为88亿而不是20万)。除了@delnan的反对意见,
L^K
编号不采用通用前缀。前缀树的整个要点是利用公共前缀。快速搜索将显示从
(N*K)/4
(N*K)/3
节点的经验结果,其中
N
是单词的数量,
K
是单词的平均长度。您对此有任何参考资料吗?一个600000个英语单词的trie将存储远远少于600000个节点。毫无疑问,我知道商店里有“c”、“ca”和“cat”这三个词。我认为你需要仔细阅读什么是trie以及它是如何存储的。没错,我想到了一种用于子字符串搜索的更复杂的数据结构,它基于Trie。不过,现在我想起来,这也可能是O(NC)。在这种情况下,只有O(NC),其中C是平均字符数,这很高。是的。(N*C)是最坏的情况,只有在没有公共前缀的情况下才会出现。我说过,一个60万个英语单词的trie将存储不到60万个节点。我的意思是,总共60万个字符组成了单词。假设平均字符数是常数,那么字符数和单词数都是O(N)。所以我知道你的意思,即使我没有领会错误。我看了差不多60万次,浏览了你的答案,然后转到你提供的链接,更详细地回顾了它。你的估计很低。据该网站称,至少有25万个英语单词,这还不包括字典没有追踪的技术单词。