【问题标题】:whats the best way to traverse a large dictionary of words?遍历大型词典的最佳方法是什么?
【发布时间】:2012-10-27 00:02:31
【问题描述】:

假设我正在寻找一个单词,它可能出现在 95k 单词的字典中,也可能不在 - 我无法使用单词长度来方便搜索。我的问题是关于在不进行 O(n) 查找的情况下找到单词的最快方法。

这是我的两个想法:

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

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    优化取决于您的用例 - 您关心查找时间还是空间? (另外,你关心插入新词吗?)。

    您可以在时间方面做的最好的事情是使用哈希表,但对于字典来说,它的空间效率很低。 trie 压缩了空间要求,因为它存储前缀,而不是整个单词,但查找时间更长。因此,要回答您的问题,使用包含大量单词的 trie 比哈希表更节省空间。

    【讨论】:

      【解决方案2】:

      如果您只是搜索单个单词,则设置哈希表或树结构的成本将超过线性搜索。当这些结构的成本在(非常)多次使用中摊销时,这些结构变得(非常)高效。

      如果字典已排序(为什么字典不排序?),那么您可以在 log(n) 时间内通过对文件进行二进制搜索来查找单个单词,而无需其他结构。

      【讨论】:

        【解决方案3】:

        我认为在字典中查找单词的最佳方法是 B+ 树。让我解释一下原因。

        假设您有一个包含 10 个字符串的根块。块中的字符串已排序。这 10 个字符串后跟一个指向另一个 10 个字符串单元格的指针,然后就是一个。所以您唯一要做的就是只是字符串比较你的关键字,从第一个开始,直到你找到一个比较小的单词(StringCompare)。

        如果我们将每个字符串旁边都有一个指针作为标准,该指针指向一个带有比较小的单词的单元格,那么您将需要 5 个步骤和 5 个比较才能结束最终的数据括号可能包含也可能不包含您的关键字。

        在 5 次比较 + 最后括号中的比较中,您正在搜索 10*10*10*10*10 单词的字典。

        算法是对数速度Log 100000,以单元格中的字符串数为底。如果每个单元格有10个单词,则需要5个步骤。

        我必须提到,只有树的根必须存储在 RAM 内存中。所有其他块都可以存储在硬盘驱动器中,而不会因为几个步骤而显着降低性能。

        希望我解释正确 :D 至少我试过了!玩得开心

        【讨论】:

          【解决方案4】:

          Trie 更可取,因为这种数据结构可以比哈希表更快。哈希表仅在理想情况下为O(1),在现实世界的应用程序中可能会发生冲突。不同类型的 trie 数据结构不会受此影响。

          另一种情况是压缩。 Trie 比哈希表更紧凑。哈希表需要一些空间来进行高效的插入操作。如果哈希表的负载因子接近 100%,则插入操作需要很长时间。

          对于哈希表,您必须将您的密钥与字典中的至少一个密钥进行比较,在这种情况下,密钥比较采用 O(k) 其中 k 的密钥长度。使用 trie 你做同样的事情,你的查找操作是O(k)

          尝试允许有序遍历,哈希表 - 不要。

          那里有许多类型的尝试,例如三元搜索尝试在这种特殊情况下非常好。与常规哈希表相比,数组映射的 trie 也非常快。

          【讨论】:

            猜你喜欢
            • 2012-07-16
            • 2011-04-24
            • 1970-01-01
            • 2021-03-28
            • 2019-11-20
            • 2012-03-04
            • 1970-01-01
            • 2015-12-31
            • 1970-01-01
            相关资源
            最近更新 更多