C++中各种<string,T>关联方式的速度对比
把<string,T>(T为任意类型)关联起来,是很常见的需求。如笔者最近要做一个贝叶斯算法的垃圾邮件过滤器,就需要把每个单词与频率对应起来,做成一个表。而当单词很多时,对于每个单词做一遍O(N)的枚举,效率实在不尽人意。而下文讲到的一些关联容器或函数,都可以吧时间复杂度降至O(log2n)或更低。
本文对比4种方法,以实验的方法得到数据,四种方法分别是:map,unordered_map,二分查找(递归),二分查找(非递归)。
实验的源码可在下面的地址下载(Code::Blocks工程类型):maptest.zip(注:代码中引用的“tr1/unordered_map”在不支持C++0X的编译器上可能没有,这时候只需修改引用为“boost/unordered_map.hpp”并把命名空间部分改为boost::unordered_map即可)
实验得出的结果如下(测试环境:Mingw4.8.2,CPU:E3-1230V2,数据N=5000000):
| 耗时(单位:CPU时钟) | unordered_map | map | 二分查找(非递归) | 二分查找(递归) |
| 6586 | 19219 | 12792 | 13182 |
很显然可以看出,四种方法的效率相差甚远(unorered_map>二分查找(非递归)>二分查找(递归)>map)。然而,推测一下便可知,其中二分查找系列的方法,内存肯定是最小的(辅助空间为O(logn)),map与unordered_map应该差不多。所以,我们可以得出一下结论:
- 在数据排好序时,最好用非递归版的二分查找(实验中二分查找的排序时间也算入了总时间内)
- 在数据无序时,小数据可以使用map,大数据则使用unordered_map(当N=50000时,map与unordered_map的耗时相差无几)。
C++中各种<string,T>关联方式的速度对比的更多相关文章
- es8中对string补白的方式
//允许将空字符串或其他字符串添加到原始字符串的开头或结尾for(let i = 1; i < 32; i++) { if(i < 10) { console.log(`0{i}`) }e ...
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- String中的两种实例化方式的区别
直接赋值:(String str = "字符串");只会开辟一块堆内存空间,并且会自动保存在对象池中以供下次重复使用. 构造方法:(String str = new String ...
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
- java中关于String 类型数据 的存储方式
Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个 ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- Mybatis_resultMap的关联方式实现多表查询(一对多)
a)在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应学生的信息. b)通过<resultMap>定义映射关系, 并通过<c ...
- ASP.net 中手工调用WS(POST方式)
ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...
随机推荐
- Delphi- 一些H8记录
CheckOrder方法写在uDataModConn类里.
- 在线性级别时间内找出无序序列中的第k个元素
在一个无序序列中找出第k个元素,对于k很小或者很大时可以采取特殊的方法,比如用堆排序来实现 .但是对于与序列长度N成正比的k来说,就不是一件容易的事了,可能最容易想到的就是先将无序序列排序再遍历即可找 ...
- CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)
此前,CSDN移动频道推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“直接拿来用!最火的Android开源项目”系列文章(一).(二)中,我们也相继盘点了40个GitH ...
- lua string 库
--lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...
- UITabBarController详解
UITabBarController使用详解 UITabBarController是IOS中很常用的一个viewController,例如系统的闹钟程序,ipod程序等.UITabBarControl ...
- Nginx+Tomcat集群部署
为了获取更好的性能,我们常常需要将tomcat进行集群部署.下文通过nginx转发实现tomcat集群,并通过nginx-upstream-jvm-route插件保证session的粘滞. 应用场景环 ...
- document.location的属性
示例html完整路径为: http://10.10.3.117:8500/html/ypt/index.html alert("document.location.href:"+d ...
- careercup-C和C++ 13.8
13.8 编写一个智能指针类.智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制.它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的 ...
- css Hack,用IE11模拟测试的,条件注释要找真IE去测,模拟的无效
<!DOCTYPE html> <!--[if lt IE 7 ]> <html class="ie6 ie"> <![endif]--& ...
- 列式存储 V.S. 行式存储
列式数据库 http://zh.wikipedia.org/wiki/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93 列式存储与行式存储 http://my ...