天天看點

hash與map的差別聯系應用

一,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的存儲和查找功能。例如,我要記錄一個人名和相應的存儲,而且随時增加,要快速查找和修改:

上一篇: 監聽器

繼續閱讀