c ++哈希表,其中键是字符串,值是字符串的向量

时间:2011-06-15 20:55:17

标签: c++ string data-structures hashtable lookup

我有很多独特的字符串(大约500k)。每个字符串都与一个字符串向量相关联。我目前正在将这些数据存储在

map<string, vector<string> >

它工作正常。但是我希望查看地图比log(n)更快。在这些受限制的情况下,我如何创建支持O(1)查找的哈希表?这似乎应该是可能的,因为我提前知道了所有的密钥......并且所有的密钥都是唯一的(所以我不必考虑碰撞)。

干杯!

4 个答案:

答案 0 :(得分:3)

您可以使用boost::unordered_mapstd::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 Hashgperf通常用于生成这些,但我不知道它如何与这么大的字符串集合一起工作。

答案 3 :(得分:2)

如果您不希望碰撞已知的密钥集合,那么您正在寻找perfect hashCMPH library(我为C而不是C ++道歉)是成熟的,可以为相当大的数据集生成最小的完美哈希。