关于Vector和Map查找效率的惊人的实际测试结果
2017-04-25 18:40
330 查看
最近在项目中有一种结构体数据需要存储,数据结构体如下
原本数据是由一个Vector存储的,Vector<mystruct> m_Vector;
现在需要根据在m_Vector中的每一个结构体的ID来获得其对应的pinwei值,所以就写了一个函数,如下
然后上程序上面测试,对于一个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)。
函数如下
整个程序运行完成大约为15分钟左右,大大提高了运行效率,如果加入多线程会更快缩短程序运行时间。
总结:以前在项目中用惯了STL的Vector,因为其比数组来的方便,不需要定义数组长度,可以不断的pushback(),但是其在大数据量中的查找效率简直令人发指,所以以后在什么时候得根据特定的情况使用特定的容器,不要习惯性的使用Vector。
后来又测试了下,用hash_map更快。
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更快。
相关文章推荐
- 比较测试map、unodered_map、unordered_set性能效率,整型数值查找
- 关于测试Shiro时结果与实际不一致时
- 关于java中Map遍历效率的测试
- 测试Map和List循环查找某个元素的效率
- 简述stl 中set,vector,map的查找效率以及如何实现的?
- 关于INT、GUID与COMB在使用效率上的测试
- 关于Sqlserver视图效率的试验及结果
- 关于sql语句的执行效率测试
- 写了个测试vector,map存取的小程序
- 为C++的map翻案,map实际是排序并且迭代效率不低的
- 关于libpq的使用,内附测试代码及测试结果
- 关于C#数组初始化的效率测试
- 关于容器的用法(vector,deque,list,set,map etc.)
- 关于window script component(简称wsc)的装入效率测试。
- InMemeryWorkspace的效率测试结果
- 关于在str_replace前先strpos能提升效能的实际测试
- 关于在IE和FireFox下ASP.NET AJAX框架的StringBuilder对象效率的测试 [ZT]
- 标准模板库map, vector查找用法
- 关于提高Flex开发效率的模式实践结果
- 测试vector,map存取的小程序