關於Vector和Map查詢效率的驚人的實際測試結果
阿新 • • 發佈:2019-01-09
最近在專案中有一種結構體資料需要儲存,資料結構體如下
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更快。