C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?

C++ - Worst case and Average case insertion time complexity in std::unordered_map <int,int>?

本文关键字:int 情况 map lt unordered gt std 最坏 时间复杂度 插入 C++      更新时间:2023-10-16

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>是一个很好的哈希函数,所以在实践中你不必担心它。

相关文章: