关于Vector和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)(2为底),查找相对来说较快,1000大小的数据最坏只需要7次就可以查找到,15000只需要10次多就可以查找到。

所以声明一个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更快。

 

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

 

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值