C ++无序映射常量时间访问?

时间:2014-10-05 06:56:49

标签: c++ performance algorithm stl unordered-map

我正在研究C ++ unordered_map容器类型。我只是通过operator[]验证我从C ++网站上读到的有关元素访问的内容。

它说时间复杂度通常是恒定的,但最坏的情况是线性时间。由于我的应用程序必须保证对此映射内部元素的持续时间访问,因此我想验证我对此容器的理解。

每当我的应用程序访问此unordered_map中的元素时,它所寻找的对象都保证存在,因此容器永远不会尝试添加缺少的元素。由于我只是在做查找,这是否意味着unordered_map总是会给我持续时间访问线性时间情况仅适用于会发生插入的某些情况,这是正确的吗?

编辑:unordered_map中的元素保证是唯一的。它们保存内存中存在的几个唯一对象的地址。

2 个答案:

答案 0 :(得分:4)

查找取决于是否存在任何现有元素的哈希冲突,在这种情况下,元素放在同一个桶中,必须使用相等比较进行线性搜索。最糟糕的情况是一切都在同一个桶里。

所以你可以拥有一个具有线性查找时间复杂度的只读地图,但是如果你能保证现有元素没有冲突,那么你可以保证O(1)查找

答案 1 :(得分:4)

错误。

只要没有哈希冲突,哈希映射就会有O(1)次插入和查找。如果存在哈希冲突,则复杂度为O(m),其中m是与请求的哈希冲突的数量 - 如果所有哈希冲突,则最多为n。

构造一个所有哈希冲突的情况是微不足道的,在这种情况下避免是非常微不足道的,特别是如果有一个敌对的攻击者给出了密钥。

如果您需要保证时间范围,请使用O(log n)树形图进行查找和插入