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

时间:2018-09-24 00:34:50

标签: c++ data-structures stl time-complexity unordered-map

std::unordered_map被实现为哈希表。根据{{​​3}}:

  

在插入单个元素的情况下,最差情况的时间复杂度为O(linear in container size)和平均情况   是O(1)

现在我正在使用std::unordered_map<int, int>更新输入数组中元素的频率。

我的问题是我不了解如何确定平均情况和最坏情况发生的时间?

1 个答案:

答案 0 :(得分:1)

在两种情况下,最坏的情况可能发生。首先,如果您的哈希表已满,则必须对其进行扩展,其中包括重新哈希所有元素。如何定义哈希表何时已满?有一个名为 load factor 的参数,定义为比率number_of_elements / number_of_buckets。当负载因子超过max_load_factor时,哈希表将被扩展。默认情况下,unordered_map容器具有max_load_factor of 1.0。因此,如果您的插入触发重新哈希处理,则不会是O(1)

第二种情况取决于哈希表的冲突解决技术的实现。最受欢迎的实现是链接,线性探测,双重哈希。由于C ++标准all practical implementations of std::unordered_map use chaining对冲突解决提出了某些要求。简而言之,链接意味着同一存储桶中的所有条目都被组织为一个链表(在一些最新的实现中为BST),这意味着添加新元素需要遍历该列表。从理论上讲,在使用非均匀哈希函数或通过选择某些病理输入的情况下,所有条目都可能最终落在同一存储桶中,添加新元素的复杂性实际上可能变成O(linear in container size)。正如其他人已经提到的那样,std::hash<int>是一个很好的哈希函数,因此在实践中您不必为此担心很多。