【问题标题】:c++ hashtable where keys are strings and values are vectors of stringsc ++哈希表,其中键是字符串,值是字符串的向量
【发布时间】:2011-06-15 20:55:17
【问题描述】:

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

map<string, vector<string> >

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

干杯!

【问题讨论】:

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


【解决方案1】:

您可以使用boost::unordered_mapstd::tr1::unordered_map 或(在 C++0x 编译器上)std::unordered_map 创建哈希表。这几乎是零努力。 Google sparsehash 可能更快,并且往往占用更少的内存。 (删除可能会很痛苦,但您似乎不需要。)

如果代码仍然不够快,您可以按照其他人的建议,利用具有最小完美哈希的密钥的先验知识来获得保证的 O(1) 性能。所花费的代码生成工作是否值得取决于您;将 500k 个密钥放入像 gperf 这样的工具中可能需要一个代码生成器。

您可能还想查看CMPH,它在运行时生成一个完美的哈希函数,虽然通过一个 C API。

【讨论】:

  • 使用 Google Sparsehash 或 MCT and 没有 C++0x 的移动构造函数,您需要小心重新散列。基本上,每次重新散列都会导致移动内部数据数组,在 C++0x 之前,它使用 复制,因此对于向量来说可能非常慢。
【解决方案2】:

我会考虑为您的桌子创建一个Perfect Hash Function。这将保证没有冲突,这是一个昂贵的操作来解决。 Perfect Hash Function Generators 也可以。

【讨论】:

    【解决方案3】:

    您要查找的是Perfect Hashgperf 经常被用来生成这些,但我不知道它对这么大的字符串集合的效果如何。

    【讨论】:

    • gperf 在您进入庞大的集合时会有些限制,因为它会为哈希器输出一些静态的 C 代码。我已经将它与大约 2k 条目一起使用,没有任何大惊小怪。不知道 500k。
    【解决方案4】:

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

    【讨论】:

    • CMPH 看起来很有趣,尤其是那句话 “billion of keys”。我想知道导出生成的哈希函数有多难?
    • @Mark:它会输出一个对其进行编码的文件,您可能可以将其“退回”到一个巨大的.c 文件中。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2019-07-29
    • 2013-04-07
    • 2019-08-08
    • 1970-01-01
    • 2011-04-28
    • 2011-12-02
    • 2013-12-19
    相关资源
    最近更新 更多