我有很多独特的字符串(大约500k)。每个字符串都与一个字符串向量相关联。我目前正在将这些数据存储在
中map<string, vector<string> >
它工作正常。但是我希望查看地图比log(n)更快。在这些受限制的情况下,我如何创建支持O(1)查找的哈希表?这似乎应该是可能的,因为我提前知道了所有的密钥......并且所有的密钥都是唯一的(所以我不必考虑碰撞)。
干杯!
答案 0 :(得分:3)
您可以使用boost::unordered_map
,std::tr1::unordered_map
或(在C ++ 0x编译器上)std::unordered_map
创建哈希表。这几乎是零努力。 Google sparsehash可能会更快,并且往往会占用更少的内存。 (删除可能很痛苦,但似乎你不需要这样做。)
如果代码仍然不够快,您可以利用其他人建议的最小完美散列来利用密钥的先验知识,以获得有保证的O(1)性能。代码生成工作是否值得,取决于您;将500k密钥放入像gperf
这样的工具中可能需要代码生成器生成器。
您可能还想查看CMPH,它在运行时生成完美的哈希函数,但是通过C API。
答案 1 :(得分:2)
我会考虑为你的桌子创建一个Perfect Hash Function。这将保证不会发生冲突,这是一项昂贵的解决方案。 Perfect Hash Function Generators也可用。
答案 2 :(得分:2)
您要找的是Perfect Hash。 gperf通常用于生成这些,但我不知道它如何与这么大的字符串集合一起工作。
答案 3 :(得分:2)
如果您不希望碰撞已知的密钥集合,那么您正在寻找perfect hash。 CMPH library(我为C而不是C ++道歉)是成熟的,可以为相当大的数据集生成最小的完美哈希。