我是C ++的新手。我试图读取一个文件并构建一个查找表(更像是一个哈希表,只是为了检查字符串值的存在)。该文件有大约30万个条目,我将用它来构建查找表。在此之后,我将对此执行大约100万次查找。这样做最有效的方法是什么?它是地图(谷歌的第一个结果)还是有更好的结构用于此目的?
答案 0 :(得分:5)
根据该方案,您可能还想查看Tries
答案 1 :(得分:3)
您需要的是TRIE数据结构。使用这种数据结构广泛地实现了字典。此外,它具有O(n)查找时间,其中n是字符串的长度并占用较少的空间。 Trie具有快速搜索,插入和删除条目的能力。
答案 2 :(得分:2)
map
有log(n)
次查找,但您可以按照建议使用哈希表来实现O(1)
。它看起来像STL实现了一个,称为hash_map。
答案 3 :(得分:2)
C ++ std::map
不是哈希表,但如果需要,可以将它用于查找表。
C ++标准保证其性能特征:
肯定会有内存开销,因为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/)
我相信它可以减少内存需求而且速度非常快。