关于Vector和Map查找效率的惊人的实际测试结果
来源:互联网 发布:更改windows系统语言 编辑:程序博客网 时间:2024/05/17 01:05
最近在项目中有一种结构体数据需要存储,数据结构体如下
typedef mystruct{ int ID; ......//其他的数据成员 double pinwei;};
原本数据是由一个Vector存储的,Vector<mystruct> m_Vector;
现在需要根据在m_Vector中的每一个结构体的ID来获得其对应的pinwei值,所以就写了一个函数,如下
/*-----FindpinweiValueInVector(vector<mystruct> pDataField,int ID)---------------------函数功能:根据格网ID在mystruct类型的容器中找到该格网的pinwei值,如果没找到,默认0值函数参数:pDataField:mystruct类型的容器ID:为要搜索的格网ID-------------------------------------------------------------------------------------*/FindpinweiValueInVector(vector<mystruct> &pDataField,int ID){double tempPinwei=0.0;//设置临时品位值for (int i=0;i<pDataField.size();++i){if (pDataField[i].ID==ID)//如果找到某个格网的ID等于所要搜索的ID{tempPinwei=pDataField[i].pinwei;//就把这个ID赋值给临时pinwei变量}}return tempPinwei;//返回临时品位变量}
然后上程序上面测试,对于一个size大约15000的容器,大概每次循环需要进行20次FindpinweiValueInVector()函数的调用,所以在Vector中查找值的最坏的情况是时间复杂度为O(n),即进行15000*20,这还是每次的循环,当一个菜单执行完毕整整花了大概6个半小时左右,程序运行效率低下。
所以,必须要有一种查找效率较高的容器,就想到的map,map为平衡二叉树,查找效率为对数级别,时间复杂度为O(logN),查找相对来说较快,1000大小的数据最坏只需要3次就可以查找到,15000只需要4次多就可以查找到。
所以声明一个map<int,double>型的容器,用于建立mystruct的ID与pinwei之间的对应关系,然后将Vector存储的值插入到map中,然后在map中根据键值(ID)查找Value(pinwei)。
函数如下
map<int,double> map_GridID_pinwei;for (int i=0;i<pDataField.size();++i){map_GridID_pinwei.insert(map<int,double>::value_type(pDataField[i].ID,pDataField[i].pinwei));}/*-----FindpinweiValueInMap()---------------------------------------------------------函数功能:根据格网ID在map中查找对应的品位值,以为在Vector内的查找问题,所以使用map容器来改善查找的时间复杂度,map的时间复杂度最大为logN,即在1000大小的数据中找到数据只需进行三次,而在Vector中则最多需要进行1000次的比较函数参数:map_ID_Pinwi存储格网ID与pinwei相关联的map容器GridID格网ID-------------------------------------------------------------------------------------*/double CImplicitModelView::FindpinweiValueInMap(map<int,double> &map_ID_Pinwi,int ID){double tempPinwei=0.0;//设置临时品位值map<int,double>::iterator tempiter;//声明临时迭代器tempiter=map_ID_Pinwi.find(ID);if (tempiter!=map_ID_Pinwi.end())//如果找到了{tempPinwei=tempiter->second;return tempPinwei;}else//如果没有找到{return tempPinwei;}}
整个程序运行完成大约为15分钟左右,大大提高了运行效率,如果加入多线程会更快缩短程序运行时间。
总结:以前在项目中用惯了STL的Vector,因为其比数组来的方便,不需要定义数组长度,可以不断的pushback(),但是其在大数据量中的查找效率简直令人发指,所以以后在什么时候得根据特定的情况使用特定的容器,不要习惯性的使用Vector。
后来又测试了下,用hash_map更快。
1 0
- 关于Vector和Map查找效率的惊人的实际测试结果
- vector和map的效率简要比较
- map和vector的查找方法
- GetClientRect的实际测试结果
- InMemeryWorkspace的效率测试结果
- 简述stl 中set,vector,map的查找效率以及如何实现的?
- STL中vector和map的查找和删除
- C++测试Map和Vector实现函数的存储
- 关于c++ vector和map的遍历和删除对象
- 关于vector,list的效率比较
- 关于vector,list的效率比较
- 关于vector,list的效率比较
- 滥用C++容器的教训:vector和set的查找效率问题
- 关于map的count和find的效率以及空类调用效率(一)
- 关于map的count和find的效率以及空类调用效率(一)
- 测试vector,map存取的小程序
- 为C++的map翻案,map实际是排序并且迭代效率不低的
- 关于BitmapData画图方法效率的测试和对比
- R 语言学习笔记(一)
- jsp学习
- linux adb无法连接device
- 关于Python的进程线程协程之thread模块
- 移植leveldb到hi3519
- 关于Vector和Map查找效率的惊人的实际测试结果
- redis命令详解与使用场景举例——Transaction(事务)
- JavaScript 学习随笔(一)
- 如何做一个侧滑菜单
- 收集了RxJava常见的使用场景,例子简洁、经典、易懂...
- C++中用new和不用new定义类的对象的区别解答
- 首次在Linux中安装Locust过程总结
- MyBatis学习笔记(一)——配置文件中的别名以及mapper中的namespace
- 转:Solr学习总结-Facet(各种例子,包括facet.query的使用)