字典的数据结构?

时间:2012-12-24 21:38:58

标签: c++ data-structures

哪个是存储字典的最佳数据结构?哈希表还是特里?考虑以后可以将更多单词添加到字典中的可能性。

2 个答案:

答案 0 :(得分:4)

std::unordered_mapstd::map将是字典的最佳数据结构。 std::unordered_map是哈希表的C ++ 11等价物。虽然std::map是常规关联容器。

答案 1 :(得分:2)

这些数据结构都不比彼此“更好”。这完全取决于您的需求。

如果您主要想回答“我的哈希表中是否存在字符串X?”这个问题,那么字符串的哈希表是好的。它支持(通常)快速查找并且内存占用少;每个字符串只存储一次。但是,它依赖于良好的哈希函数的存在,容易受到病理输入的哈希冲突的影响,并且不允许你进行搜索,例如“什么字符串最接近我的字符串?”

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

您可以考虑除此之外的其他数据结构。 Radix尝试和Patricia树提供了更精简的尝试表示,但是在一些额外的编程复杂性。如果您主要感兴趣的是有效地查找所有字符串“接近”某些初始字符串,则可以使用BK-trees

简而言之,如果内存非常宝贵,或者您不需要进行“密切字符串”搜索,则哈希表是一个不错的选择。如果你需要寻找附近的字符串或进行其他字符串操作,那么trie可能是更好的选择。

希望这有帮助!