C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
C++ - Worst case and Average case insertion time complexity in std::unordered_map <int,int>?
std::unordered_map
被实现为哈希表。据此:
在单元素插入的情况下,最坏情况的时间复杂度为
O(linear in container size)
和平均情况 是O(1)
现在我正在使用std::unordered_map<int, int>
来更新输入数组中元素的频率。
我的问题是我不明白如何确定平均和最坏情况何时发生?
在两种情况下,最坏的情况可能发生。首先,如果你的哈希表已满,则必须对其进行扩展,其中包括对所有元素的重新哈希。如何定义哈希表何时已满?有一个称为负载系数的参数,它定义为比率:number_of_elements / number_of_buckets
。当负载因子超过max_load_factor
时,哈希表被扩展。默认情况下,unordered_map容器的max_load_factor为 1.0。因此,如果您的插入触发重新散列,则不会O(1)
。
第二种情况取决于哈希表冲突解决技术的实现。最流行的实现是链接,线性探测,双哈希。由于C++标准施加的某些要求,std::unordered_map的所有实际实现都使用链接来解决冲突。简而言之,链接意味着同一存储桶中的所有条目都被组织为链表(或最近一些实现中的 BST(,这意味着添加新元素需要遍历列表。从理论上讲,在哈希函数不统一的情况下,或者通过选择一些病理输入,所有条目都可以在同一个桶中结束,添加新元素的复杂性可能真的变得O(linear in container size)
。正如其他人已经提到的,std::hash<int>
是一个很好的哈希函数,所以在实践中你不必担心它。
相关文章:
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 在这种情况下,int**在C中是什么意思
- 如何在不返回 C++ 值的情况下退出 int 函数?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- <int> 在不破坏堆栈的情况下获取 C++ 中的堆栈总和
- 为什么在这种情况下使用 int *arr = new int [number]
- 在 int 数组的情况下,新表达式可以"overflow"吗?
- 如何在不复制的情况下更新 std::unordered_map<std::string, std::vector> 中的向量<int>?
- 如何在不使用堆栈或数组的情况下从INT中提取每个数字?(C )
- 读取即将在没有同步的情况下同时增加的int是安全的吗?
- 在没有初始化列表的情况下,在c++的headerfile中为const int赋值
- 如何在<int>不重建数组的情况下将 vector<vector> 转换为 int**?
- 在 priority_queue 内部 pair<int、int> 的情况下决定优先级?
- 有没有什么方法可以在不丢失十进制值的情况下将浮点值转换为int值
- 为什么两种情况下的行为不同1.int i=1,2,3;和第二.int i;i=1,2,3;
- 开关情况下的字符和 int 有什么区别?