如何在C ++中构建查找表?

时间:2010-09-29 05:42:05

标签: c++

我是C ++的新手。我试图读取一个文件并构建一个查找表(更像是一个哈希表,只是为了检查字符串值的存在)。该文件有大约30万个条目,我将用它来构建查找表。在此之后,我将对此执行大约100万次查找。这样做最有效的方法是什么?它是地图(谷歌的第一个结果)还是有更好的结构用于此目的?

8 个答案:

答案 0 :(得分:5)

根据该方案,您可能还想查看Tries

答案 1 :(得分:3)

您需要的是TRIE数据结构。使用这种数据结构广泛地实现了字典。此外,它具有O(n)查找时间,其中n是字符串的长度并占用较少的空间。 Trie具有快速搜索,插入和删除条目的能力。

答案 2 :(得分:2)

maplog(n)次查找,但您可以按照建议使用哈希表来实现O(1)。它看起来像STL实现了一个,称为hash_map

答案 3 :(得分:2)

C ++ std::map不是哈希表,但如果需要,可以将它用于查找表。

C ++标准保证其性能特征:

  • 用于搜索元素的O(log n)
  • 用于插入新元素的O(log n)
  • 用于删除元素的O(log n)

肯定会有内存开销,因为std::map通常用树(很可能是红黑树)实现,并且将为地图中的每个节点保留指针。

为了获得更好的性能特征,您可能需要查看Google's Sparsehash

答案 4 :(得分:1)

尝试:http://en.wikipedia.org/wiki/Unordered_map_%28C%2B%2B%29

通常哈希表很好,但如果你想要“最有效的方式”,你将不得不提供更多细节。

答案 5 :(得分:1)

如果您想检查字符串值set的存在就足够了,因为您没有任何键值对。有关文档,请参阅here

答案 6 :(得分:0)

如果您最关心的是查找时间(听起来像是这样),请强烈考虑hashmap。摊销的查询时间为O(1),明显优于O(log n)的常规地图。

答案 7 :(得分:0)

如果您有一个非常好的哈希函数(数据集没有冲突)并且您只需要检查条目是否存在,那么您可以尝试一个位集(例如来自http://bmagic.sourceforge.net/

我相信它可以减少内存需求而且速度非常快。