如何确定两个大unordered_map是否相等
How to decide whether two LARGE unordered_map are equal?
给定两个大unordered_map,比如map_a,map_b。如何有效地确定map_a具有与map_b相同的信息?例如,如果map_a {'a':3, 'b':2}
而map_b是{'a':3,'b':2}
则它们是相同的。也就是说,对于map_a中的每个键 k,map_a[k]=map_b[k]。
我的问题是如何有效地解决这个问题。我知道最糟糕的时候是O( max{map_a.size(), map_b.size()} )
.但是有一些观察可以很快确定map_a不等同于map_b。例如,map_a.size()!=map_b.size()。
还有其他观察吗?我们可以使用 bucket_count() 和 bucket_size() 吗?
W.l.o.g,假设map_a和map_b具有相同的哈希函数和(键,值)类型。
这个问题比看起来更难,也许是 O( log( load_factor ) * size ),因为元素在每个映射中不需要以相同的顺序排列。(因此unordered_map
。在比较之前,需要对每对相应的存储桶进行排序(按哈希值)。
根据 23.2.5/12,
对于对于 unordered_set 和 unordered_map,运算符 == 的复杂度(即,对 value_type 的 == 运算符、key_equal() 返回的谓词的调用次数以及 hash_function() 返回的哈希器的调用次数)在平均情况下与 N 成正比,在最坏情况下与 N2 成正比,其中 N 是 a.size()。对于unordered_multiset和unordered_multimap,运算符==的复杂度在平均情况下与∑Ei2成正比,在最坏情况下与N2成正比,其中N是a.size(),Ei是a中第i个等效键组的大小。但是,如果每个相应的等效键组 Eai 和 Ebi 对的相应元素以相同的顺序排列(通常的情况是,例如,如果 a 和 b 是同一容器的未修改副本),则 unordered_multiset 和 unordered_multimap 的平均情况复杂度与 N 成正比(但最坏情况复杂度仍然是 O(N2), 例如,对于病态糟糕的哈希函数)。
这个网站来说,正确格式化是相当多的,但请注意,"N2"应该是 N2。
我的log(load_factor)分析可能过于简单化:我认为算法实际上是不分配内存所必需的。我的建议是不要在家里尝试这个。你应该依赖标准库对operator ==
的实现,因为它可以依赖于标准可能无法保证的内部不变量。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶