1. 程式人生 > >關於Vector和Map查詢效率的驚人的實際測試結果

關於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),查詢相對來說較快,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更快。