std :: unordered_multiset插入的复杂性

时间:2014-04-07 20:00:07

标签: c++ c++11 stl time-complexity unordered-multiset

为什么std::unordered_multiset插入的最坏情况复杂性是线性的?我理解为什么std::unordered_set的情况(你必须检查插入的值不在集合中)但是对于multiset我不明白。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:3)

std::unordered_multiset::insert()的最坏情况复杂性是线性的,因为:

  • 支持非唯一键的无序关联容器据说支持等效键。迭代这些容器时,具有等效键的元素在迭代中彼此相邻,形成等效键组
  • 迭代器函数需要不变的摊销时间。

例如,考虑将51313插入到具有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()