8

给定两个大的 unordered_map,比如 map_a、map_b。如何有效判断map_a与map_b的信息相同?例如,如果 map_a 是{'a':3, 'b':2}并且 map_b 是,{'a':3,'b':2}那么它们是相同的。也就是说,对于map_a中的每个key 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() 吗?

Wlog,假设 map_a 和 map_b 具有相同的散列函数和 (key,value) 类型。

4

1 回答 1

6

这个问题比看起来更难,可能是 O(log(load_factor) * size),因为元素不需要在每个映射中的顺序相同。(因此unordered_map。)在比较之前,需要对每对对应的桶进行排序(按哈希值)。

根据 23.2.5/12,

对于 unordered_set 和 unordered_map,operator== 的复杂度(即对 value_type 的 == 运算符的调用次数、对 key_equal() 返回的谓词以及对 hash_function() 返回的 hasher 的调用次数)与 N 成正比在平均情况下,在最坏情况下为 N2,其中 N 是 a.size()。对于 unordered_multiset 和 unordered_multimap,operator== 的复杂度在平均情况下与 ∑Ei2 成正比,在最坏情况下与 N2 成正比,其中 N 是 a.size(),Ei 是一个。然而,如果每对对应的等效密钥组 Eai 和 Ebi 的各个元素以相同的顺序排列(通常是这种情况,例如,如果 a 和 b 是同一容器的未修改副本),

对于这个网站来说,正确格式化的内容相当多,但请注意“N2”应该是 N 2

我的 log(load_factor) 分析可能过于简单:我认为算法实际上不需要分配内存。我的建议是不要在家里尝试这个。您应该依赖标准库的 实现operator ==,因为它可以依赖标准可能无法保证的内部不变量。

于 2013-09-16T00:37:54.860 回答