实现字典的最佳数据结构?

存储字典中所有单词的最佳数据结构是什么?我能想到的最好方法是使用 HashMap,它将映射到 HashTable。基本上,取决于第一个字符,我们将获得相关的 HashTable,然后使用这个,我们可以添加从该字符开始的单词。然后,我们将根据字符串选择一个好的散列函数。

还有更好的办法吗?

76666 次浏览

根据您想要做的事情,有许多好的数据结构。

如果您只想存储单词并询问“这个单词是否在这里?”,一个标准的哈希表没有其他花哨的机器是一个合理的方法。如果这个单词是预先固定的列表,考虑使用 完美的哈希表来获得优秀的性能和空间使用。

如果您希望能够在支持快速查找的同时检查给定的前缀是否存在,那么 试试是一个不错的选择,尽管它可能有点空间效率低下。它还支持快速插入或删除。它还允许在字母顺序中进行迭代,而散列不提供这种功能。这基本上就是您在答案中描述的结构,但是根据用例的不同,尝试的其他表示可能会更好。

如果除了上述内容之外,您还知道单词列表是固定的,那么可以考虑使用 DAWG(有向无环单词图) ,它本质上是语言的最小状态 DFA。它实际上比 trie 更加紧凑,但是支持许多相同的操作。

如果你想尝试的行为,但不想支付巨大的空间罚款,三元搜索树是另一个可行的选择,因为是 红参树。这些都是非常不同的结构,但可以比审判在不同的情况下更好。

如果需要考虑空间问题,但希望尝试使用,那么可以查看 简明扼要表示,该表示具有较慢的查找速度,但在理论上几乎是最佳的空间使用情况。该链接讨论了如何在 JavaScript 中使用它作为传输大量数据的简单方法。另一个可供选择的紧凑表示是 双数组试验双数组试验,尽管我承认我对它知之甚少。

如果您希望使用字典进行拼写检查等操作,需要查找与其他单词相似的单词,那么 BK 树是一个值得考虑的优秀数据结构。

希望这个能帮上忙!