首页 > 其他分享 >unordered_map比map慢?

unordered_map比map慢?

时间:2025-01-13 14:23:50浏览次数:1  
标签:map 复杂度 插入 查找 哈希 unordered

先说结论:unordered_map不维护键的顺序,因此不能按顺序访问元素,因此如果你需要遍历表时若选用unordered_map就肯定比map慢

1. 数据结构与底层实现

  • unordered_map:基于 哈希表 实现。

    • 优点:平均情况下插入、查找和删除操作的时间复杂度为 O(1)O(1)O(1)。
    • 缺点:最坏情况下,时间复杂度可能退化为 O(n)O(n)O(n)(当哈希冲突严重时)。
    • 无序存储,不能按键排序。
  • map:基于 红黑树(自平衡二叉搜索树) 实现。

    • 优点:插入、查找和删除操作的时间复杂度始终为 O(log⁡n)O(\log n)O(logn)。
    • 缺点:由于需要维护树的平衡,常数因子较大。
    • 按键排序,支持有序遍历。

2. 插入和查找性能

  • unordered_map 优势:在大多数情况下,unordered_map 插入和查找的性能优于 map,因为其平均时间复杂度为 O(1)O(1)O(1)。
  • map 劣势map 的插入和查找性能稍慢,时间复杂度为 O(log⁡n)O(\log n)O(logn)。

例外情况

  1. 哈希冲突严重:如果 unordered_map 的哈希函数设计不佳或数据分布极端(如大量相同的哈希值),性能可能退化为 O(n)O(n)O(n)。
  2. 小规模数据:对于数据规模较小的情况,map 的性能可能优于 unordered_map,因为红黑树的实现有较少的额外开销。

3. 内存使用

  • unordered_map 缺点:由于哈希表需要额外的存储空间(如空槽和链表节点),unordered_map 通常比 map 占用更多内存。
  • map 优势map 是基于树的实现,占用内存相对较少。

4. 顺序访问

  • unordered_map 缺点unordered_map 不维护键的顺序,因此不能按顺序访问元素。
  • map 优势map 自动按键的升序(或指定的比较函数)维护元素顺序,支持有序遍历。

5. 插入、删除时对迭代器的影响

  • unordered_map:当发生哈希表的重哈希(rehash)操作时,会使所有迭代器失效。
  • map:插入和删除元素只会影响相关位置的迭代器,其余迭代器不会失效。

6. 适用场景

场景 推荐使用容器 原因
快速查找/插入操作 unordered_map 平均时间复杂度 O(1)O(1)O(1)。
数据需要按键排序 map 支持有序遍历。
数据规模较小 map 红黑树常数因子较小。
内存有限 map unordered_map 占用内存较大。
哈希函数性能不佳或数据分布差 map unordered_map 性能退化明显。

总结

  • 如果需要快速插入、删除和查找操作且不关心顺序,优先选择 unordered_map
  • 如果需要按键排序或者可能遇到哈希冲突问题,选择 map
  • 如果内存占用敏感,选择 map

标签:map,复杂度,插入,查找,哈希,unordered
From: https://www.cnblogs.com/ahappyfool/p/18668496

相关文章

  • 前端必备基础系列(八)Proxy/Reflect/Map/WeakMap
    1.解释JavaScript中的Proxy对象是什么以及它是如何工作的,用于哪些场景?Proxy是ES6引入的一种新特性,允许我们创建一个代理对象来拦截并定制对另一个对象的基本操作。比如获取、设置、删除数据等。Proxy通过一个构造函数创建,接受两个参数:target:希望代理的目标对象handler:一个......
  • 深入探究 Go 语言中 Map 和 Slice 未初始化的情况及应对策略
    目录深入探究Go语言中Map和Slice未初始化的情况及应对策略一、问题误区与正确思路二、Map未初始化的情况(一)代码示例与运行结果(二)原因分析(三)Map初始化的重要性三、Slice未初始化的情况(一)代码示例与运行结果(二)原因分析(三)与Map的区别四、总结在Go语言......
  • ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用
    文章目录ecmascript历程严格模式与常规模式下的区别及注意事项严格模式下的属性删除Array.prototype.flat()和Array.prototype.flatMap()实例应用ecmascript历程变量声明要求常规模式:在常规模式下,使用var关键字声明变量时会出现变量提升现象。这意味着变......
  • LIO-SAM代码解析:mapOptmization.cpp(二)
    文章目录1.cornerOptimization1.点集中心计算2.协方差矩阵计算3.特征值分解4.主方向选择5.距离与权重计算6.优化目标2.surfOptimization1.平面方程拟合2.平面方程归一化3.点到平面的距离4.权重因子计算5.优化系数1.cornerOptimizationvoidcornerOp......
  • 05容器篇(D2_集合 - D6_容器源码分析篇 - D3_HashMap)
    目录本章目标一、基本介绍1.什么是HashMap?2.HashMap类的继承关系二、原理分析1.哈希表2.存储数据过程1>存储过程中相关属性2>存储过程图解3>存储过程源码分析3.底层数据1>什么是数据结构?2>HashMap的数据结构3>数据结构的源码三、源码分析1.HashMa......
  • LIO-SAM代码解析:mapOptmization.cpp(一)
    文章目录主流程1.`loopInfoHandler`1.1`updateInitialGuess`1.2`extractSurroundingKeyFrames`1.3`downsampleCurrentScan`1.4`scan2MapOptimization`1.5`saveKeyFramesAndFactor`1.6`correctPoses`1.7`publishOdometry`1.8`publishFrames`主流程1.loo......
  • 【机器人学和计算机视觉】SLAM(Simultaneous Localization and Mapping)原理与技术实现
    引言SLAM(SimultaneousLocalizationandMapping,即时定位与地图构建)是机器人学和计算机视觉领域的一项关键技术。它允许机器人在未知环境中自主导航,同时构建环境的地图并确定自身的精确位置。SLAM技术在机器人、无人驾驶、增强现实和无人机等领域有着广泛的应用。本文将......
  • Vue - 解决报错 TypeError: transpileDependencies.map is not a function(vue项目运行
    前言关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。在vue项目开发中,解决项目运行报错:ERRORTypeError:transpileDependencies.mapisnotafunction,莫名其妙非常恶心的错误,另外项目打包build时也可能会提示错误,vue项目跑不起来了,无论是新老项目......
  • Golang笔记——hashmap
    本文详细介绍golang的哈希表的底层实现、扩容机制、插入查询过程以及并发安全性。文章目录定义Key无序性Key唯一性Key可比性基本使用底层实现哈希表实现hmapbucket数据结构bmap链地址法哈希冲突负载因子扩容增量扩容等量扩容查找过程插入过程删除流程非并发安全......
  • 网安知识系列:Nmap识别目标机器服务指纹
    Nmap识别目标机器服务指纹Nmap识别目标机器服务指纹Nmap端口探测——识别目标主机的服务和版本服务指纹:识别服务的参数Nmap识别服务指纹(-sV)Nmap侵略性的探测使用命令1:使用命令2:使用nmap-sC-sV-OIP地址来探测目标机器的操作系统、服务等信息。......