轉(zhuǎn)自:http://www./art/1543058
list支持快速的插入和刪除,但是查找費(fèi)時(shí); vector支持快速的查找,但是插入費(fèi)時(shí)。 map查找的時(shí)間復(fù)雜度是對(duì)數(shù)的,這幾乎是最快的,hash也是對(duì)數(shù)的。 STL 中的 map 內(nèi)部是平衡二叉樹,所以平衡二叉樹的性質(zhì)都具備。查找數(shù)據(jù)的時(shí)間也是對(duì)數(shù)時(shí)間。 vector,在分配內(nèi)存上一般要比 new 高效的多。 為什么說(shuō) hash_map 是對(duì)數(shù)級(jí)的?在不碰撞的情況下,hash_map是所有數(shù)據(jù)結(jié)構(gòu)中查找最快的,它是常數(shù)級(jí)的。
我想沒(méi)必要懷疑stl::map的查找效率,影響效率最主要的因素是什么?算法,在查找問(wèn)題上,有什么算法比RB_tree更好嗎?至少現(xiàn)在還沒(méi)有。不否 認(rèn)你可以通過(guò)自己寫代碼,設(shè)計(jì)一個(gè)符合你需要的BR—TREE,比stl::map簡(jiǎn)捷那么一點(diǎn),但最多也就每次迭代中少一行指令而已,處理十萬(wàn)個(gè)數(shù)據(jù)多 執(zhí)行十萬(wàn)行指令,這對(duì)你重要嗎?如果你不是在設(shè)計(jì)OS像LINUX,沒(méi)人會(huì)關(guān)注這十萬(wàn)行指令花的時(shí)間。
大多數(shù)程序員寫不出比std::map更好的map,這是當(dāng)然的。然而并不是std::map的所有特性都出現(xiàn)在我們的程序中,自己編寫的可以更適合自己的程序,的確會(huì)比std::map更快一些。
關(guān)于hash_map,它與map的實(shí)現(xiàn)機(jī)制是不一樣的,map內(nèi)部一般用樹來(lái)實(shí)現(xiàn),其查找操作是O(logN)的,這個(gè)沒(méi)有爭(zhēng)議,我就不多說(shuō)了。 ----------------------------------------- BS: "對(duì)于大型容器而言,hash_map能夠提供比map快5至10倍的元素查找速度是很常見(jiàn)的,尤其是在查找速度特別重要的地方.另一方面,如果hash_map選擇了病態(tài)的散列函數(shù),他也可能比map慢得多. " ANSIC++在1998年之后就沒(méi)再有重大改變,并且決定不再向C++標(biāo)準(zhǔn)庫(kù)中做任何重大的變更,正是這個(gè)原因,hash table(包括hash_map)并沒(méi)有被列入標(biāo)準(zhǔn)之中,雖然它理應(yīng)在C++標(biāo)準(zhǔn)之中占有一席之地。
hehe俺也來(lái)湊湊熱鬧。
你的百萬(wàn)級(jí)的數(shù)據(jù)放到vector不大合適。因?yàn)関ector需要連續(xù)的內(nèi)存空間,顯然在初始化這個(gè)容器的時(shí)候會(huì)花費(fèi)很大的容量。
如果內(nèi)存不是考慮的問(wèn)題。用vector比map好。map每插入一個(gè)數(shù)據(jù),都要排序一次。所以速度反不及先安插所有元素,再進(jìn)行排序。 用 binary_search對(duì)已序區(qū)間搜索,如果是隨機(jī)存取iterator,則是對(duì)數(shù)復(fù)雜度。可見(jiàn),在不考慮內(nèi)存問(wèn)題的情況下,vector比map 好。
如果你需要在數(shù)據(jù)中間進(jìn)行插入,list 是最好的選擇,vector 的插入效率會(huì)讓你痛苦得想死。
涉及到查找的話用map比較好,因?yàn)閙ap的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用rb-tree實(shí)現(xiàn),而用vector你只能用線性查找,效率很低。 stl還提供了 hash容器,理論上查找是飛快~~~。做有序插入的話vector是噩夢(mèng),map則保證肯定是按key排序的,list要自己做些事情。
HASH類型的查找肯定快,是映射關(guān)系嘛,但是插入和刪除卻慢,要做移動(dòng)操作, LIST類型的使鏈?zhǔn)疥P(guān)系,插入非??欤遣檎覅s費(fèi)時(shí),需要遍歷~~ , 還是用LIST類型的吧,雖然查找慢點(diǎn), 先快速排序,然后二分查找,效率也不低 |
|
來(lái)自: 看風(fēng)景D人 > 《STL》