什么是遍历大词典的最佳方式?

时间:2012-10-27 00:02:32

标签: algorithm

让我说我正在寻找一个可能会或可能不会出现在95k字词典中的单词 - 我不能使用单词长度来促进搜索。我的问题是在没有进行O(n)查找的情况下找到单词的最快方法。

以下是我的两个想法:

首先,将单词存储在hast表中,查找单词是O(1),这似乎是我心目中的最佳方案,但是也建议使用Trie浏览不同的网站,我的问题是实用的是拥有一个拥有这么多单词的Trie。 在这种情况下,查找将是O(k)。

那么在大字典中查找单词的最佳方式是什么?

4 个答案:

答案 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也非常快。