为什么std::unordered_multiset
插入的最坏情况复杂性是线性的?我理解为什么std::unordered_set
的情况(你必须检查插入的值不在集合中)但是对于multiset我不明白。我错过了一些明显的东西吗?
答案 0 :(得分:3)
std::unordered_multiset::insert()
的最坏情况复杂性是线性的,因为:
例如,考虑将5
,13
和13
插入到具有unordered_multiset
个桶的4
和{{1}的情况}}返回unordered_multiset::key_eq(5, 13)
。在这种情况下,false
会为unordered_multiset::hash_function(5)
和5
返回不同的哈希码。尽管具有不同的哈希码,但这些元素仍然可以插入到同一个桶中。如果一个整数的哈希函数返回整数本身,并且桶索引是哈希码模数桶的数量的结果,那么:
13
被散列到5
,有5
个桶,它被放置在存储桶4
中。1
被散列到13
,有13
个桶,它也会被放入存储桶4
。虽然1
检查以防止在插入期间出现重复,但unordered_set::insert()
标识了插入元素以进行等效键分组的位置。在最坏的情况下,插入最终unordered_multiset::insert()
时,存储区包含[5, 13]
,并且在迭代所有元素时,存储区包含13
。当对所有元素进行迭代时,复杂度在[5, 13, 13]
中是线性的。
值得注意的是,在size()
期间可能会发生重新散列,并且unordered_multiset::insert()
被指定为具有unordered_multiset::rehash()
中的平均情况线性的复杂性,最坏情况是二次的。在重新散列期间,原始哈希表中的所有元素都被迭代并插入到新的哈希表中。由于迭代在size()
中具有线性复杂度,并且如上所述,每个插入在size()
中具有较差的情况线性,最终的最坏情况为size()
。