条目二十三《考虑用排序的vector替代关联容器》

在看到这个条目的标题的时候,说实话,我一下子是比较懵逼的。这个结论怎么和数据结构的时间复杂度不一致了?

一般来说,像map,set等关联容器的底层因为是红黑树结构,那么即使红黑树的时间复杂度并非是绝对的对数时间,但也是稳定的接近对数时间。

然而类似vector这种序列容器的时间复杂度是线性的。

所以在涉及到对数据有查找操作的时候,在二者之间我基本是选择map或set的。

但是这条目毕竟是大神侯老爷子提出的,必定有其原因。好吧,看完几遍后,总算知道为何了。

适用情况:

这条目适合数据的操作步骤是:设置阶段,查找阶段,重组阶段。而不是元素插入和查找纠缠不清的情况。因为前者数据在设置阶段后可以直接调用sort()对vector排序,然后使用binary_search()等算法快速查找元素。

深究原因:

关联容器是由一个结点构成的树结构,每个节点由左右指针+父指针,元素值组成。而序列容器vector只由值组成,少了三个指针。在数据规模成千上万的情况下,关联容器占有的内存是比vector多了成千上万个指针大小的3倍。最要命的是占有的内存越多,分配的页内存就越多,所以系统花费更多的时间在页切换上,这个时间在数据规模非常大的时候是很乐观的。所以这种情况下排序的vector会比关联容器更快。

注意了,在stl中,还是对关键容器的内存分配做了局部优化处理的,就是通过底层优化,把同一个容器的内存分配尽量的分配在相邻的页中,这样会降低换页的性能消耗。

不过如果我们的环境是 数据经历设置,查找,重组阶段,而不是频繁且交错的插入和查找,最优的方案是排序的vector。反之,肯定是关联容器map或set,不然那将是一场性能灾难。

从这一条目,真的学习到了要把各个知识联系起来才行,不能把各个孤立起来,而是串在一起思考。。。

条目二十三《考虑用排序的vector替代关联容器》的更多相关文章

  1. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  2. (C/C++学习笔记) 二十三. 运行时类型识别

    二十三. 运行时类型识别 ● 定义 运行时类型识别(Run-time Type Identification, RTTI) 通过RTTI, 程序能够使用基类的指针或引用来检查(check)这些指针或引 ...

  3. 条目二十一《总是让比较函数在等值情况下返回false》

    条目二十一<总是让比较函数在等值情况下返回false> 这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的. 对于关联容器来说,比较是等价比较,所以要注意等值的时候,比较子的 ...

  4. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  5. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

  6. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】

    <Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  7. 代码分享:php对二维数组进行排序

    发布:net/PHP编程  编辑:thebaby   2013-06-28 13:12:54  [大 中 小] 转自:http://www.jbxue.com/article/9991.html本文介 ...

  8. 剑指Offer25 二叉搜索树转换为排序双向链表

    /************************************************************************* > File Name: 25_BSTCon ...

  9. iOS安全攻防(二十三):Objective-C代码混淆

    iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...

随机推荐

  1. 如何申请新浪SAE,发布自己的网站

    你是否会看见诸如(***.sinaapp.com)类的域名?是否和新浪有什么关系?抑或想要一个免费的空间展示自己的个人主页;没问题,下面我来分享一下SAE的申请流程吧! 首先,打开SAE(http:/ ...

  2. 利用SHELL脚本修改当前环境变量

    转自http://www.chinaunix.net/old_jh/7/21485.html 1.背景 ---- 在日常的工作中,为了设置一大批环境变量,我们通常编辑了一个shell程序,包含了多个的 ...

  3. SQLServerDBA十大必备工具

    曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了: 诚然,SSMS和Profile足够强大,工作的大 ...

  4. CodeForces 347B Fixed Points (水题)

    题意:给定 n 数,让你交换最多1次,求满足 ai = i的元素个数. 析:很简单么,只要暴力一遍就OK了,先把符合的扫出来,然后再想,最多只能交换一次,也就是说最多也就是加两个,然后一个的判,注意数 ...

  5. zrender源码分析2--初始化Storage

    接上次分析到初始化ZRender的源码,这次关注内容仓库Storage的初始化 入口1:new Storage(); // zrender.js /** * ZRender接口类,对外可用的所有接口都 ...

  6. top命令查看进程列表

    top命令查看进程列表 top命令是linux下常用的性能分析工具,能实时显示系统中各个进程的资源占用状况.和win的资源管理器类似.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态,如 ...

  7. linux查看日志文件内容命令tail、cat、tac、head、echo详解

    linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...

  8. 8、Semantic-UI之其他按钮样式

    8.1 其他按钮样式定义 示例:定义其他按钮样式 定义圆形图标按钮样式 <div class="ui circular icon button"><i class ...

  9. 安装了IntelliJ IDEA中文输入法光标不跟随处理办法

    安装了IntelliJ IDEA 2017.2.3版本发现搜狗输入法中文输入的时候光标不跟随,而且存在卡屏的现象,网上找了很多办法试了之后都不管用.最后在这里找到了解决方案,亲测可用! 首先,将IDE ...

  10. Android 画指南针

    1.无意看到了一个指南针的UI,在这里简单的模仿了一下.其实就是第画布的一些变化而已. 别人的效果图是: 3.简单说一下思路: 1)首先是画一个黑色圆盘 2) 然后画圆盘上的刻度(就是对Canvas一 ...