让我说我正在寻找一个可能会或可能不会出现在95k字词典中的单词 - 我不能使用单词长度来促进搜索。我的问题是在没有进行O(n)查找的情况下找到单词的最快方法。
以下是我的两个想法:
首先,将单词存储在hast表中,查找单词是O(1),这似乎是我心目中的最佳方案,但是也建议使用Trie浏览不同的网站,我的问题是实用的是拥有一个拥有这么多单词的Trie。 在这种情况下,查找将是O(k)。
那么在大字典中查找单词的最佳方式是什么?
答案 0 :(得分:1)
最佳性取决于您的使用案例 - 您是否关心查找正常运行时间或空间? (另外,你是否关心插入新词?)。
你可以做的最好的时间是使用哈希表,但对于字典,它是空间效率低的。 trie压缩空间要求,因为它存储前缀,而不是整个单词,但需要更长时间才能查找。所以,为了回答你的问题,拥有一个包含大量单词的trie比使用哈希表更节省空间。
答案 1 :(得分:1)
如果您只是搜索一个单词,设置哈希表或树结构的成本将超过线性搜索。当这些结构的成本在(非常)多次使用中摊销时,这些结构变得非常有效。
如果对字典进行了排序(以及为什么不会对字典进行排序?),那么您可以在log(n)
时间内查找单个单词,并通过文件进行二进制搜索,无需其他结构。< / p>
答案 2 :(得分:0)
我认为在字典中找到单词的最佳方法是B +树。让我解释一下原因。
假设你有一个10个字符串的根块。块中的字符串是排序的。这10个字符串后跟一个指向10个字符串的另一个单元格的指针,然后就是一个。所以你唯一需要做的就是只是字符串比较你的关键字从第一个开始,直到你找到一个比较小的字(StringCompare)。
如果我们将其作为标准,每个字符串旁边都有一个指针,该指针向单元格显示相对较小的单词,则需要5步和5次比较才能结束最终的数据括号。可能包含也可能不包含您的关键词。
在5个比较中+最后一个括号中的比较,您正在搜索10 * 10 * 10 * 10 * 10个单词的词典。
该算法的对数速度为Log 100000,基数为单元格中的字符串数。如果每个单元格有10个单词,则需要5个步骤。
我必须提到的是,只有树的根必须存储在Ram内存中。所有其他块都可以存储在硬盘中,而不会因为几个步骤而在性能上造成重大损失。
希望我解释正确:D至少我试过了!玩得开心
答案 3 :(得分:0)
Trie是首选,因为此数据结构可能比散列表更快。哈希表仅在理想情况下为O(1)
,在实际应用程序中可能发生冲突。不同类型的trie数据结构不会受此影响。
另一种情况是压缩。 Trie比哈希表更紧凑。哈希表需要一些空间来进行有效的插入操作。如果哈希表的加载因子为100%,则插入操作需要很长时间。
对于哈希表,您必须将您的密钥与字典中的至少一个密钥进行比较,在这种情况下密钥比较需要O(k)
其中k为密钥长度。使用trie,您正在做同样的事情,您的查找操作是O(k)
。
尝试允许有序遍历,哈希表 - 不要。
有许多类型的尝试,例如三元搜索特里在这种特殊情况下是好的。与常规哈希表相比,数组映射的trie也非常快。