C++;无序映射恒定时间访问? 我正在研究C++无序的映射容器类型。我只是核实一下我从C++网站上看到的元素访问。

C++;无序映射恒定时间访问? 我正在研究C++无序的映射容器类型。我只是核实一下我从C++网站上看到的元素访问。,c++,performance,algorithm,stl,unordered-map,C++,Performance,Algorithm,Stl,Unordered Map,它说时间复杂度通常是恒定的,但最坏的情况是线性时间。由于我的应用程序必须保证对该映射内部元素的恒定时间访问,因此我想验证我对该容器的理解 每当我的应用程序访问这个无序的_映射中的元素时,它要查找的对象就保证存在,因此容器永远不会尝试添加缺少的元素。由于我只进行查找,这是否意味着无序的_映射将始终为我提供恒定时间访问?线性时间情况仅适用于将发生插入的某些情况,对吗 编辑:无序映射中的元素保证是唯一的。它们保存内存中存在的几个唯一对象的地址。查找取决于任何现有元素是否存在哈希冲突,在这种情况下,元素

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

每当我的应用程序访问这个无序的_映射中的元素时,它要查找的对象就保证存在,因此容器永远不会尝试添加缺少的元素。由于我只进行查找,这是否意味着无序的_映射将始终为我提供恒定时间访问线性时间情况仅适用于将发生插入的某些情况,对吗


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

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

因此,您可以使用具有线性查找时间复杂性的只读映射,但如果您可以保证现有元素不会发生冲突,则可以保证O(1)查找。

错误

只要不存在哈希冲突,哈希映射的插入和查找都有
O(1)
时间。如果存在哈希冲突,则复杂性为
O(m)
,其中
m
是与请求的哈希冲突的次数-如果所有哈希冲突,则最大为n

构造一个所有散列都发生冲突的情况是很简单的,避免这种情况远不是很简单,特别是当有恶意攻击者提供密钥时


如果您想要保证时间界限,请使用树映射,即
O(logn)
进行查找和插入

Ok,这样无序映射中的每个元素也保证是唯一的,因为它只包含几个唯一对象的地址。在这方面,不应该有任何哈希冲突,对吗?@OliverSpryn不,这取决于哈希函数。这是一个多对一的函数。好的,那么您有没有建议使用某种类型的容器来保证非连续键的恒定时间查找(插入不重要)?因此,例如,
向量
数组
不起作用,因为这些键必须是连续的。@OliverSpryn否,但如果您知道键值的域,您可以考虑实现一个完美的哈希函数以确保不发生冲突。例如,见。