C ++中用于在字典中查找字符串的最佳数据结构

时间:2010-08-04 03:51:59

标签: c++

我是C ++的初学者。有人可以告诉我C ++中最好的数据结构,将所有单词存储在字典中,并查找字典中是否存在单词。我知道哈希表是最好的,但我不知道哪个数据结构使用它们?

非常感谢你。

6 个答案:

答案 0 :(得分:9)

您的C ++实现的标准库可能包含unordered_sethash_set。它们基本上是一回事;前者是即将推出的C ++ 0x标准的一部分,并得到一些最新编译器的支持,后者来自最初的SGI STL,并包含在许多标准库实现中。

答案 1 :(得分:4)

哈希非常好,但最好的结构是trie。你可以在GCC中从<ext/pb_ds/assoc_container.hpp>获得一个特里。请参阅the online reference

#include <ext/pb_ds/assoc_container.hpp>
#include <string>
#include <iostream>

int main() {
        pb_ds::trie< std::string, int > dict;

        dict.insert( std::make_pair( "hello", 3 ) );

        std::cerr << ( dict.find( "hello" ) != dict.end() ) << std::endl;
        std::cerr << ( dict.find( "goodbye" ) != dict.end() ) << std::endl;
}

仅提供map - 类似功能,而非纯set。在上面的示例中,我添加了一个虚拟int作为数据来映射到...它应该不会真的受到太大伤害。

在GCC之外,这不会起作用。

另一方面, - 标准哈希表(不是std::ext::任何东西)将允许您只查找近似匹配,即在校验和中搜索单词而不是单词本身。这将是最快,最紧凑的解决方案。基于Bloom filters的词典可以包含几千字的数千个单词。

答案 2 :(得分:2)

hash_map,如果你在C ++的编译器库中有它(例如,GNU C ++或Microsoft Visual C ++)。如果您正在使用其他一些不太广泛的编译器,我怀疑您无论如何都可以找到一个体面的hash_map第三方实现。

即将推出的C ++标准改为使用相同的数据结构std::unordered_map

如果您不想将任何信息与词典中的单词相关联,只需记录其中是否包含单词,您可以使用_set(而不是_map )上述数据结构类型名称的变体。

当然,它们都是模板(作为C ++标准库中的所有容器),因此您需要使用典型的模板语法对它们进行适当的实例化。

答案 3 :(得分:1)

我更喜欢使用Trie。 Trie将是一个很好的数据结构,用于构建具有快速查找的内存高效字典,是的,自动完成。

将其视为哈希表,提供快速查找键值对(或仅查找键),但与哈希表不同,它允许您按排序顺序迭代键。

请参阅Trie - Wiki以获取更多信息/参考。

答案 4 :(得分:0)

如果唯一的要求是决定一个单词是否包含在永不变化的字典中,而不需要任何其他类型的关于单词的信息(例如,拼写检查),那么Bloom filter是这项任务的有效数据结构。

如果有其他数据与需要查找的每个单词相关联,std::map是一个很好的通用起点。

如果需要自动完成(输入部分单词时),可以使用Prefix tree (trie)

答案 5 :(得分:0)

如果您愿意推出自己的解决方案并修复字典,那么perfect hash是一个很好的方法。它保证了恒定的查找时间。