【发布时间】:2012-04-18 13:20:29
【问题描述】:
存储字典中所有单词的最佳数据结构是什么?我能想到的最好的方法是使用HashMap,它将映射到HashTable。基本上,根据第一个字符,我们将获得关联的HashTable,然后使用它,我们可以添加从该字符开始的单词。然后,我们将根据字符串选择一个好的哈希函数。
有更好的方法吗?
【问题讨论】:
标签: string algorithm dictionary data-structures
存储字典中所有单词的最佳数据结构是什么?我能想到的最好的方法是使用HashMap,它将映射到HashTable。基本上,根据第一个字符,我们将获得关联的HashTable,然后使用它,我们可以添加从该字符开始的单词。然后,我们将根据字符串选择一个好的哈希函数。
有更好的方法吗?
【问题讨论】:
标签: string algorithm dictionary data-structures
根据你想做什么,有很多好的数据结构。
如果您只想存储单词并询问“这个单词是否在这里?”,没有其他花哨机器的标准哈希表是一种合理的方法。如果该单词是预先固定的列表,请考虑使用perfect hash table 以获得出色的性能和空间使用率。
如果您希望能够在支持快速查找的同时检查给定前缀是否存在,trie 是一个不错的选择,尽管它可能会有点空间效率低下。它还支持快速插入或删除。它还允许按字母顺序进行迭代,这是散列不提供的。这本质上是您在答案中描述的结构,但根据用例的不同,尝试的其他表示可能会更好。
如果除上述之外,您知道单词列表是固定的,请考虑使用DAWG(有向无环单词图),它本质上是该语言的最小状态 DFA。它比 trie 更紧凑,但支持许多相同的操作。
如果您想要类似 trie 的行为但又不想支付巨大的空间损失,ternary search tree 是另一个可行的选择,radix tree 也是如此。这些是非常不同的结构,但在不同情况下可能比 trie 更好。
如果空间是一个问题,但您想要尝试一下,请查看succinct trie 表示,它的查找速度较慢,但理论上是最佳的空间使用率。该链接讨论了它如何在 JavaScript 中用作传输大量数据的简单方法。另一种紧凑的表示是double-array trie,尽管我承认我对此知之甚少。
如果您想将字典用于拼写检查等需要查找与其他单词相似的单词的操作,BK-tree 是一个值得考虑的优秀数据结构。
希望这会有所帮助!
【讨论】: