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

bre*_*ett 5 c++

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

非常感谢你提前.

Jam*_*lis 9

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

  • @brett,正如我的回答所指出的,GNU C++和Microsoft Visual C++都提供了`hash_map`(请参阅我指向的维基百科条目以获取更多详细信息) - 当然还有`hash_set`以防不清楚从我的回答.如果你需要在没有添加组件/库的情况下运行_any_标准兼容的C++,那么`std :: map`(或`std :: set`如果你**只是**想要存在/不存在信息,没有辅助单词数据)是唯一的选择,但那不是哈希图[[或设置; - )] [(它基于红黑树).旧的(仍然是当前的)C++标准中没有散列DS. (2认同)

Pot*_*ter 5

哈希非常好,但最好的结构是trie。你可以从<ext/pb_ds/assoc_container.hpp>GCC 中得到一个尝试。请参阅在线参考

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

伤害的是这在 GCC 之外是行不通的。

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