如何确定两个大unordered_map是否相等

How to decide whether two LARGE unordered_map are equal?

本文关键字:unordered map 是否 两个 何确定      更新时间:2023-10-16

给定两个大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 ==的实现,因为它可以依赖于标准可能无法保证的内部不变量。