【问题标题】:C++ Unordered Map Constant Time Access?C ++无序映射常量时间访问?
【发布时间】:2014-10-05 06:56:48
【问题描述】:

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

它表示时间复杂度通常是恒定的,但最坏的情况是线性时间。由于我的应用程序必须保证对地图内元素的持续时间访问,我想验证我对这个容器的理解。

每当我的应用程序访问此 unordered_map 内的元素时,它所寻找的对象都保证存在,因此容器永远不会尝试添加缺失的元素。由于我只进行查找,这是否意味着 unordered_map 将始终为我提供恒定时间访问linear time 情况仅适用于 insertion 会发生的某些情况,对吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,所以 unordered_map 中的每个元素也保证是唯一的,因为它只是保存几个唯一对象的地址。顺便说一句,不应该有任何哈希冲突,对吗?
    • @OliverSpryn 不,这取决于散列函数。这是一个多对一的函数。
    • 好的,那么您对某种类型的容器有什么建议吗?可以保证对非连续键进行恒定时间查找(插入无关紧要)?因此,例如,vector<>array<> 将不起作用,因为这些键必须是连续的。
    • @OliverSpryn 不,但如果你知道键值的域,你可以考虑实现一个完美的哈希函数来确保没有冲突。参见例如gperf
    【解决方案2】:

    错了。

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

    构造一个所有哈希都冲突的情况是微不足道的,避免这种情况远非微不足道,尤其是在有敌对攻击者提供密钥的情况下。

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

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多