std :: unordered_set ::擦除复杂度

用户名

我不明白,为什么在最坏的情况下(其中N是元素数)擦除std :: unordered_set O(N)复杂度的方法为何Standard(n4296)表示在最坏的情况下(a为容器),这三种擦除方法的版本都具有O(a.size())复杂度,并且仅使指向被擦除元素的迭代器无效,而不是使所有迭代器无效(即,重新哈希没有)发生)。即使对于使用一个迭代器参数并且在平均情况下具有恒定复杂度的版本,也是如此。我认为是因为擦除版本将迭代器返回到下一个元素,这需要在被擦除的元素之后找到第一个非空存储桶,这会带来O(a.bucket_count())复杂性,但不会带来O(a.size())!。元素数与桶数不成正比。例如:

#include <iostream>
#include <unordered_set>
using namespace std;

int main()
{
    std::unordered_set<int> aSet;
    aSet.insert ({125, 126});
    aSet.rehash (1000);
    cout << aSet.size() << endl;
    cout << aSet.bucket_count() << endl;
}

输出为

Size: 2
Bucket count: 1031

容器的大小仅为2,bucket_count为1031。将调用擦除方法时,它将查找下一个非空存储桶,该存储桶可以放在末尾,即复杂度为O(a.bucket_count()),但是不是O(a.size())。标准使O(a.size())复杂性的原因是什么?

TC

即使对于使用一个迭代器参数并且在平均情况下具有恒定复杂度的版本,也是如此。

无序关联容器具有正向迭代器-允许通过单个链接列表来实现它们。

擦除节点包括将其前面的节点重新链接到它之后的节点。O(N)在基于单链列表的实现中,在迭代器指向的节点之前找到节点可能是最坏的情况,因为您基本上必须遍历存储桶(在完全冲突的情况下,存储桶可以包含容器中的每个元素)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么 std::unordered_set operator==() 的复杂度是 N^2?

来自分类Dev

C ++ std :: unordered_map复杂度

来自分类Dev

了解`std :: unordered_set`的用法

来自分类Dev

std :: unordered_set插入获取对象

来自分类Dev

何时使用std :: unordered_set代替std :: set?

来自分类Dev

何时使用std :: unordered_set代替std :: set?

来自分类Dev

std :: count的复杂度

来自分类Dev

std :: lower_bound与std :: set的时间复杂度是多少?

来自分类Dev

比较std :: vector或std :: set的时间复杂度-更有效吗?

来自分类Dev

使用std :: unique_ptr的std :: unordered_set

来自分类Dev

std :: unordered_set是否允许插入重复的元素?

来自分类Dev

如何在C ++中使用std :: unordered_set?

来自分类Dev

GCC 4.9的unordered_set和std :: move

来自分类Dev

指向std :: unordered_set中元素的指针/引用

来自分类Dev

std :: unordered_set中的KeyEqual是做什么用的?

来自分类Dev

您如何static_cast std :: unordered_set?

来自分类Dev

std :: unordered_set通过引用与值的返回类型

来自分类Dev

std :: map已知位置擦除摊余的复杂度和红黑树重新着色的次数

来自分类Dev

std :: vector :: erase的时间复杂度

来自分类Dev

std :: partition()的时间复杂度

来自分类Dev

std :: tgamma的复杂度是多少?

来自分类Dev

unordered_set :: find的复杂性是否可以预测?

来自分类Dev

我应该对一组指针使用std :: set还是std :: unordered_set吗?

来自分类Dev

扩展std :: unordered_set <>以与std :: stack <>一起使用

来自分类Dev

从std :: unordered_set <char>有效构造std :: string

来自分类Dev

在std :: unordered_set <std :: unique_ptr>(C ++ 20)中找到指针T *

来自分类Dev

std :: unordered_set :: find和std :: find之间奇怪的性能差异

来自分类Dev

clear()是否会影响std :: unordered_set的存储区计数?

来自分类Dev

函数结束时是否会删除std :: unordered_set中的数据?

Related 相关文章

  1. 1

    为什么 std::unordered_set operator==() 的复杂度是 N^2?

  2. 2

    C ++ std :: unordered_map复杂度

  3. 3

    了解`std :: unordered_set`的用法

  4. 4

    std :: unordered_set插入获取对象

  5. 5

    何时使用std :: unordered_set代替std :: set?

  6. 6

    何时使用std :: unordered_set代替std :: set?

  7. 7

    std :: count的复杂度

  8. 8

    std :: lower_bound与std :: set的时间复杂度是多少?

  9. 9

    比较std :: vector或std :: set的时间复杂度-更有效吗?

  10. 10

    使用std :: unique_ptr的std :: unordered_set

  11. 11

    std :: unordered_set是否允许插入重复的元素?

  12. 12

    如何在C ++中使用std :: unordered_set?

  13. 13

    GCC 4.9的unordered_set和std :: move

  14. 14

    指向std :: unordered_set中元素的指针/引用

  15. 15

    std :: unordered_set中的KeyEqual是做什么用的?

  16. 16

    您如何static_cast std :: unordered_set?

  17. 17

    std :: unordered_set通过引用与值的返回类型

  18. 18

    std :: map已知位置擦除摊余的复杂度和红黑树重新着色的次数

  19. 19

    std :: vector :: erase的时间复杂度

  20. 20

    std :: partition()的时间复杂度

  21. 21

    std :: tgamma的复杂度是多少?

  22. 22

    unordered_set :: find的复杂性是否可以预测?

  23. 23

    我应该对一组指针使用std :: set还是std :: unordered_set吗?

  24. 24

    扩展std :: unordered_set <>以与std :: stack <>一起使用

  25. 25

    从std :: unordered_set <char>有效构造std :: string

  26. 26

    在std :: unordered_set <std :: unique_ptr>(C ++ 20)中找到指针T *

  27. 27

    std :: unordered_set :: find和std :: find之间奇怪的性能差异

  28. 28

    clear()是否会影响std :: unordered_set的存储区计数?

  29. 29

    函数结束时是否会删除std :: unordered_set中的数据?

热门标签

归档