【发布时间】:2014-03-04 21:04:23
【问题描述】:
知道英语词典中大约有 200k 个单词,而字母表有 26 个左右的字母。
【问题讨论】:
-
您的估价偏低。根据Oxford Dictionaries 网站,有至少 25 万个英语单词,这还不包括字典不跟踪的技术单词。
标签: data-structures trie
知道英语词典中大约有 200k 个单词,而字母表有 26 个左右的字母。
【问题讨论】:
标签: data-structures trie
在this article 中,作者从一个 935,015 字节长的文件中构建了一个英语单词 trie。它需要 25 万个节点。他声称压缩率约为 73%,这与我在使用此类数据结构时所记得的非常接近。
请注意,他的实现通过为每个节点存储一个包含 26 个子指针的数组来浪费大量内存。一个更便宜的实现将只维护它需要的指针,按使用频率排序。例如,考虑到q 之后的字符除了u 之外的其他字符非常,在一个单词中存储字母q 的26 个子节点指针有点疯狂。
顺序搜索比直接索引数组花费的时间稍长,但可以节省大量内存。而且节省的内存可以减少很多缓存未命中,这完全可以弥补线性搜索增加的成本。
如果您对节省更多空间感兴趣,可以创建一个有向无环词图,它还利用了常见的结尾以及其他一些优化。例如,您可以将悬空结尾压缩到单个节点中。
【讨论】:
使用简单的前缀树,空间要求应该是 O(N*C),其中 C 是每个单词的平均字符数,N 是单词数。这是因为在最坏的情况下,Trie 将存储每个单词中的每个字符。因此,公平的估计是存储了大约 100 万个字符,或大约 1 MB。
【讨论】:
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 是单词的平均长度。