hash與map的區別聯絡應用

2021-06-27 16:35:59 字數 1770 閱讀 2378

一,hashtable原理:

雜湊表又名雜湊表,其主要目的是用於解決資料的快速定位問題。考慮如下乙個場景。

一列鍵值對資料,儲存在乙個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我乙個個拿出來比較key啊,呵呵。

大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的陣列空間,就不需要乙個個查詢。而雜湊表就是利用陣列這個能夠快速定位資料的結構解決以上的問題的。

具體如何做呢?大家是否有注意到前面說的話:「陣列可以通過下標直接定位到相應的空間」,對就是這句,雜湊表的做法其實很簡單,就是把key通過一 個固定的演算法函式既所謂的雜湊函式轉換成乙個整型數字,然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標,將value儲存在以該數字為下標 的陣列空間裡,而當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,並定位到該空間獲取value,如此一來,就可以充分 利用到陣列的定位效能進行資料定位。

不知道說到這裡,一些不了解的朋友是否大概了解了雜湊表的原理,其實就是通過空間換取時間的做法。到這裡,可能有的朋友就會問,雜湊函式對key進 行轉換,取餘的值一定是唯一的嗎?這個當然不能保證,主要是由於hashcode會對陣列長度進行取餘,因此其結果由於陣列長度的限制必然會出現重複,所 以就會有「衝突」這一問題,至於解決衝突的辦法其實有很多種,比如重複雜湊的方式,大概就是定位的空間已經存在value且key不同的話就重新進行雜湊 加一併求模陣列元素個數,既 (h(k)+i) mod s , i=1,2,3…… ,直到找到空間為止。還有其他的方式大家如果有興趣的話可以自己找找資料看看。

2 hash_map和map的區別在**?

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

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

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

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

現在知道如何選擇了嗎?權衡三個因素: 查詢速度, 資料量, 記憶體使用。

4 map基本原理介紹:

用過map吧?map提供乙個很常用的功能,那就是提供key-value的儲存和查詢功能。例如,我要記錄乙個人名和相應的儲存,而且隨時增加,要快速查詢和修改:

岳不群-華山派掌門人,人稱君子劍

張三丰-武當掌門人,太極拳創始人

東方不敗-第一高手,葵花寶典

...

這些資訊如果儲存下來並不複雜,但是找起來比較麻煩。例如我要找"張三丰"的資訊,最傻的方法就是取得所有的記錄,然後按 照名字乙個乙個比較。如果要速度快,就需要把這些記錄按照字母順序排列,然後按照二分法查詢。但是增加記錄的時候同時需要保持記錄有序,因此需要插入排 序。考慮到效率,這就需要用到二叉樹。講下去會沒完沒了,如果你使用stl 的map容器,你可以非常方便的實現這個功能,而不用關心其細節。關於map的資料結構細節,感興趣的朋友可以參看

學習stl map, stl set之資料結構基礎

。看看map的實現:

hash與map的區別聯絡應用

2011 02 10 17 11 35 分類 面試 字型大小訂閱 一,hashtable原理 雜湊表又名雜湊表,其主要目的是用於解決資料的快速定位問題。考慮如下乙個場景。一列鍵值對資料,儲存在乙個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我乙個個拿出來比較key啊,呵呵。大家都知道...

查詢(三)hash 與map

一,hashtable原理 雜湊表又名雜湊表,其主要目的是用於解決資料的快速定位問題。考慮如下乙個場景。一列鍵值對資料,儲存在乙個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我乙個個拿出來比較key啊,呵呵。大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標...

hash演算法與應用

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值...