map和hash map的比較

2021-06-22 02:22:33 字數 1553 閱讀 7661

hash_map和map的區別在**?

建構函式。hash_map需要hash函式,等於函式;map只需要比較函式(小於函式). 

儲存結構。hash_map採用hash表儲存,map一般採用紅黑樹(rb tree)實現。因此其記憶體資料結構是不一樣的。

什麼時候需要用hash_map,什麼時候需要用map?

hash_map 查詢速度會比map快,而且查詢速度基本和資料資料量大小,屬於常數級別;而map的查詢速度是log(n)級別。並不一定常數就比log(n)小,hash還有hash函式的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。但若你對記憶體使用特別嚴格,希望程式盡可能少消耗記憶體,那麼一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map物件特別多時,你就更無法控制了,而且hash_map的構造速度較慢。

選擇map容器,是為了更快的從關鍵字查詢到相關的物件。與使用list這樣的線性表容器相比,一可以簡化查詢的演算法,二可以使任意的關鍵字做索引,並與目標物件配對,優化查詢演算法。在c++的stl中map是使用樹來做查詢演算法,這種演算法差不多相當與list線性容器的折半查詢的效率一樣,都是o (log2n),而list就沒有map這樣易定製和操作了。

相比hash_map,hash_map使用hash表來排列配對,hash表是使用關鍵字來計算表位置。當這個表的大小合適,並且計算演算法合適的情況下,hash表的演算法複雜度為o(1)的,但是這是理想的情況下的,如果hash表的關鍵字計算與表位置存在衝突,那麼最壞的複雜度為o(n)。

那麼有了這樣的認識,我們應該怎麼樣選用演算法呢?前兩天看python文章的時候,不知道哪個小子說python的map比c++的map快,如何如何的。但是他並不知道python是預設使用的 hash_map,而且這些語言特徵本質上是使用c/c++寫出來的,問題在與演算法和手段,而不是在於語言本身的優劣,你熟悉了各種演算法,各種語言的細節、設計思想,還能在這偏激的嚷嚷孰好孰壞(片面與偏激的看待事物只能表明愚昧與無知,任何事物都有存在的價值,包括技術)。顯然c++的stl預設使用樹結構來實現map,是有考究的。

樹查詢,在總查詢效率上比不上hash表,但是它很穩定,它的演算法複雜度不會出現波動。在一次查詢中,你可以斷定它最壞的情況下其複雜度不會超過o(log2n)。而hash表就不一樣,是o(1),還是o(n),或者在其之間,你並不能把握。假若你在開發乙個供外部呼叫的介面,其內部有關鍵字的查詢,但是這個介面呼叫並不頻繁,你是會希望其呼叫速度快、但不穩定呢,還是希望其呼叫時間平均、且穩定呢。反之假若你的程式需要查詢乙個關鍵字,這個操作非常頻繁,你希望這些操作在總體上的時間較短,那麼hash表查詢在總時間上會比其他要短,平均操作時間也會短。這裡就需要權衡了。

這裡總結一下,選用map還是hash_map,關鍵是看關鍵字查詢操作次數,以及你所需要保證的是查詢總體時間還是單個查詢的時間。如果是要很多次操作,要求其整體效率,那麼使用hash_map,平均處理時間短。如果是少數次的操作,使用 hash_map可能造成不確定的o(n),那麼使用平均處理時間相對較慢、單次處理時間恆定的map,考慮整體穩定性應該要高於整體效率,因為前提在操作次數較少。如果在一次流程中,使用hash_map的少數操作產生乙個最壞情況o(n),那麼hash_map的優勢也因此喪盡了。

STL中map與hash map的比較

stl中map與hash map的比較 map c 的stl中map是使用樹來做查詢演算法 時間複雜度 o log2n hash map 使用hash表來排列配對,hash表是使用關鍵字來計算表位置 時間複雜度 o 1 最壞的時間複雜度 o n 總體來說 hash map 比 map 查詢速度快,而...

hash map和map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。4.1 hash map和map的區別在 4.2 什麼時候需要用hash map,什麼時候需要用map?總 體來說,hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n...

hash map和map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。4.1 hash map和map的區別在 4.2 什麼時候需要用hash map,什麼時候需要用map?總 體來說,hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n...