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