STL中map與hash map容器的選擇

2021-04-25 21:58:32 字數 1627 閱讀 1132

實際上這個問題不光c++會遇到,其他所有語言的標準容器的實現及選擇上都是要考慮的。做應用程式你可能覺得影響不大,但是寫演算法或者核心**就要小心了。今天改進**,順便又來溫習基礎功課了。

還記得herb sutter那極有味道的《c++對話系列》麼,在其中《產生真正的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的優勢也因此喪盡了。

1.不錯

hash_map 和 map 的權衡也和他們被呼叫查詢介面的「距離」有關係。hash的演算法也許不能保證cache的命中機率比較大。在元素個數較小的時候,甚至可以考慮直接使用vector。對於情況比較複雜的查詢,可能會結合這三者都使用。根據不同的個數規模和呼叫頻率自我調節。

2.這個「距離」決定介面呼叫的數量級

如果使用int為index key的話,vector效果當然好,但是vector的「插入」和「伸縮」效能又如何呢。或者使用vector是線性查詢,還是折半查詢呢,演算法還是需要選擇與考慮。

問題是:如果使用整數陣列作為關鍵字的話。。。

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 查詢速度快,而...

STL中map用法詳解

map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在 map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說 下map內部資料的組織,map內部自建一顆紅黑樹 一種非嚴格意...

STL中map用法詳解

說明 如果你具備一定的c template知識,即使你沒有接觸過stl,這個文章你也應該可能較輕易的看懂。本人水平有限,不當之處,望大家輔正。一 map概述 map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理...