关于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