c – std :: unordered_multiset插入的复杂性

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

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

例如,考虑将5,13和13插入到具有4个桶的unordered_multiset中的情况,并且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()标识了在等效键分组中插入元素的位置.在最坏的情况下,当插入最后的13时,桶包含[5,13],并且在迭代所有元素时,桶包含[5,13,​​13].随着对所有元素的迭代发生,复杂度在size()方面是线性的.

值得注意的是,在unordered_multiset :: insert()期间可能会发生重新散列,并且unordered_multiset :: rehash()被指定为具有平均大小为线性的复杂度()且最坏情况是二次的.在重新散列期间,原始哈希表中的所有元素都被迭代并插入到新的哈希表中.由于迭代具有线性大小()的复杂性,并且如上所述,每个插入在大小()中具有线性较差的情况,所得到的最坏情况是O(size()* size()).

点赞