【问题标题】:Merge hashtables with unique keys into one C++将具有唯一键的哈希表合并到一个 C++ 中
【发布时间】:2017-03-02 03:31:07
【问题描述】:

如何将不同的 std::unordered_map 合并为一个?鉴于所有键都是唯一的?

例如:

    std::unordered_map<uint64_t, uint64_t> h1, h2, h3, h4;
    h1.insert({5, 1});
    h1.insert({120, 2});
    h2.insert({7, 4});
    h4.insert({199,1})

std::unordered_map<uint64_t, uint64_t> h5;

是否可以在 O(1) 操作中将 h1、h2、h3、h4 中的所有 KeyValue 对推送到 unordered_map h5 中,或者无需再次对所有键进行哈希处理。

它不必只是 std::unordered_map。 C ++ 14中哈希表的任何化身都可以。这提供了 O(1) 插入和查询。

【问题讨论】:

  • 方法如下:打开文本编辑器;编写几行 C++ 来执行此操作,编译、执行、验证结果、修复任何错误、重复直到代码正常工作。你已经完成了。
  • 如果 merge 是您所追求的,那是 C++17 中的新功能。
  • 哈希运算不是应该足够快而不至于太重要吗?
  • 你真的需要 O(1) 吗?你知道这是否可能吗?应该扩展什么价值?地图数量?条目数?我的建议:按照 Sam 的建议去做。编码它。观察。学习。

标签: c++ c++11 c++14


【解决方案1】:

在 C++17 中,您可以使用 merge 或(extractinsert)来做到这一点。

h5.merge(h1);
h5.merge(h2);
h5.merge(h3);
h5.merge(h4);

任何重复项都将保留在 h1h4 中。可以改为编写更手动的 extract/insert 循环,但由于 merge 完全符合您的要求,因此无需这样做。

这不是 O(1),因为哈希映射需要工作来管理其条目并可能增长。但它不会重新散列,也不会复制任何元素。它只是移动节点。

在 C++11 和 14 中,您无法避免重新散列。

【讨论】:

  • 是的,我正在寻找合并功能。可以采用这种实现的任何指针?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2013-05-04
  • 2021-04-22
  • 2013-01-10
  • 2013-09-12
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多