字典的数据结构

Data Structure for a dictionary?

本文关键字:数据结构 字典      更新时间:2023-10-16

存储字典的最佳数据结构是什么?哈希表还是尝试?考虑一下以后更多的单词可以被添加到字典中的可能性。

std::unordered_mapstd::map将是字典的最佳数据结构。std::unordered_map相当于c++ 11中的哈希表。而std::map为常规关联容器

这两种数据结构都不是"更好"的。这完全取决于你的需要。

如果你主要对回答"字符串X是否存在于我的哈希表中"这个问题感兴趣,那么字符串哈希表是很好的。它支持(通常)快速查找,并且内存占用很小;每个字符串只存储一次。然而,它依赖于一个好的哈希函数的存在,对于病态输入很容易产生哈希冲突,并且不允许您进行诸如"哪个字符串最接近我的字符串?"

对于存储字符串来说,trie是一种很好的数据结构,它提供了很好的最坏情况查找(您只需要查看输入字符串的每个字符一次)。它还有一个优点,具有类似前缀的字符串可以被紧凑地存储。此外,trie允许您搜索具有给定前缀的字符串,或者高效地进行正则表达式搜索,或者高效地查找附近的单词。它的缺点是,由于存储指针的数量,tree的内存使用量往往比哈希表要高得多。

除了这些,您还可以考虑其他数据结构。基数尝试和Patricia树提供了更精简的尝试表示,但增加了一些编程复杂性。如果你主要感兴趣的是有效地找到与某个初始字符串"接近"的所有字符串,可以使用BK-trees。

简而言之,如果内存很宝贵,或者你不需要做"关闭字符串"搜索,散列表是一个很好的选择。如果您需要查找附近的字符串或执行其他字符串操作,则tree可能是更好的选择。

希望这对你有帮助!