【问题标题】:HashMap implementation optimizationHashMap 实现优化
【发布时间】:2014-06-30 05:56:38
【问题描述】:

我有一个包含大约一百万个条目的哈希图,键是一个字符串,其值来自 5 个不同输入的组合。 (字符串连接)每个输入的域都很小,但是 5 个输入的组合给出了这个巨大的映射(500K 项)。现在我正在考虑优化这个结构。

我的想法是通过散列每个单独的输入并将这 5 个散列组合成一个散列(int 32 或 64)来散列输入(5 个输入的组合),然后查找该散列。

我的问题是有一个已知的数据结构可以很好地处理这种情况吗?是否值得进行优化?我想优化内存和运行时间。

我正在使用C++ 和std::unordered_map,关键是来自 5 个输入的组合字符串,输出是随机的。我没有发现输入和输出(随机或串行)之间的任何关系。

125 458 699 sadsadasd 5  => 56.
125 458 699 sadsadasd 3  => 57.
125 458 699 sadsadasd 4  => 58.
125 458 699 sadsadasd 5  => 25.
125 458 699 gsdfsds 3  => 89.

每个输入的域都很小(第 4 个输入有 2K 个不同的值,而其他输入只能有大约 20 个不同的值)。

【问题讨论】:

  • “数据结构”是什么意思?您是否正在寻找将多个哈希值组合成单个哈希的好函数?
  • 散列连接真的与散列 5 个输入然后以某种方式组合它们不同吗?是什么让您认为这会更优化?
  • @Sneftel 可能是其他数据结构,如树或散列函数,我的计划是为每个输入使用 5 个散列映射以获得 5 个散列,然后将 5 个散列组合成一个散列。但是还有其他数据结构吗?这种优化值得做吗?
  • @Dave 这将通过仅使用 int32 而不是我认为会消耗更多内存的字符串来优化内存。
  • 我不明白。你能举例说明这 5 个输入的作用吗?

标签: c++ data-structures hashmap


【解决方案1】:

您可以使用GNU perf 为您的密钥生成完美的哈希函数。

【讨论】:

  • +1 for GNU perf,对我的情况很有用,因为我已经有了密钥。
【解决方案2】:

在我看来,没有办法减少密钥的大小,从而实现可靠的提取。将 5 个输入散列为 1 个整数是一种单向函数,它会阻止您执行可靠的查找。

解决方法是保留一个转换表,但这实际上开销更大,因为每个不同的输入元组都需要存储 2 个哈希和元组。

我认为您最好在单个地图中使用 std::tuple<int, int, int, std::string, int> 作为键类型。

如果您使用std::map<tuple<>, data_type>,则无需提供散列函数。如果您继续使用unordered_map,则需要提供一个,因为std::tuple 没有默认的hash<> 专业化。

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2013-10-10
    相关资源
    最近更新 更多