C++无序映射恒定时间访问
C++ Unordered Map Constant Time Access?
我正在研究C++无序映射容器类型。我只是在验证我从C++网站上读到的关于元素访问的内容。
它说时间复杂度通常是恒定的,但最坏的情况是线性时间。由于我的应用程序必须保证对该映射中元素的持续时间访问,所以我想验证我对该容器的理解。
每当我的应用程序访问这个无序映射中的元素时,它要查找的对象都保证存在,因此容器永远不会尝试添加丢失的元素。由于我只进行查找,这是否意味着无序映射将始终为我提供恒定时间访问?线性时间情况仅适用于将发生插入的某些情况,正确吗?
编辑:保证无序映射中的元素是唯一的。它们保存内存中存在的几个唯一对象的地址。
查找取决于任何现有元素是否存在哈希冲突,在这种情况下,元素被放在同一个桶中,必须使用相等比较进行线性搜索。最糟糕的情况是,一切都在同一个桶里。
因此,可以具有线性查找时间复杂度的只读映射,但如果可以保证现有元素不发生冲突,则可以保证O(1)查找。
错误。
只要不存在哈希冲突,哈希映射对于插入和查找都具有O(1)
时间。如果存在哈希冲突,则复杂度为O(m)
,其中m
是与请求的哈希的冲突次数——如果所有哈希都冲突,则最多为n。
构造一个所有哈希冲突的情况是微不足道的,避免在这种情况下绝非微不足道,尤其是当有恶意攻击者提供密钥时。
如果您想要有保证的时间界限,请使用树映射,即O(log n)
来查找和插入
相关文章:
- 通过方法访问结构
- boost::进程间消息队列引发错误
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- Ardunio UNO解决了多个重叠的定时器循环
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 使用加速进程间创建消息队列 - 内存访问冲突
- 在不违反严格的别名规则的情况下访问进程间共享内存中的对象
- 进程间通信 - C# 和C++.对路径的访问被拒绝