条目二十三《考虑用排序的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. Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题

    在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识.   这个标识在Java读取文件的时候,不会被去掉,而且Stri ...

  2. MySQL5.6.35部署

    1.下载软件 [root@localhost src]# wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glib ...

  3. 面向对象的JavaScript-004

    1. // Below is an example of how to use Object.create() to achieve classical inheritance. This is fo ...

  4. Redis学习(3)——认识配置文件redis.conf[转]

    #是否作为守护进程运行  daemonize yes  #配置 pid 的存放路径及文件名,默认为当前路径下  pidfile redis.pid  #Redis 默认监听端口  port 6379  ...

  5. CF 438E The Child and Binary Tree

    BZOJ 3625 吐槽 BZOJ上至今没有卡过去,太慢了卡得我不敢交了…… 一件很奇怪的事情就是不管是本地还是自己上传数据到OJ测试都远远没有到达时限. 本题做法 设$f_i$表示权值为$i$的二叉 ...

  6. [SoapUI] 在Test Step 下加Script Assertion,用 messageExchange 获取当前步骤的response content

    //Get response content of the current request def response = messageExchange.getResponseContent() // ...

  7. JDBC 连接 MySQL 时碰到的小坑

    最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来. 驱动加载: 以前使用 ...

  8. windows server2012安装jdk时报错误代码1603

    解决方法:在控制面板中将其卸载,把jdk8换成jdk7就可以安装上了

  9. IT技术公众号推荐

    获取二维码方法:http://open.weixin.qq.com/qr/code/?username=公众账号,例如:cjscwe_2015   目录 全栈 编程语言 前端开发 移动开发 数据库 操 ...

  10. redis整理の持久化机制

    redis是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到磁盘 来保证持久化.redis 支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另 ...