查詢(三)hash 與map

2021-07-05 10:58:58 字數 1816 閱讀 3729

一,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資料結構是不一樣的。

最根本的區別為底層的實現機制不同,map底層實現為紅黑時,hash_map為hash表,所以就有一些其他方面的不同:

1)map儲存的時候為排好序的,所以輸出時候也是排序的。而hash_map不是的。

2)map具有穩定性,底層儲存為樹,這種演算法差不多相當與list線性容器的折半查詢的效率一樣,都是o (log2n)。而hash_map使用hash表來排列配對,hash表是使用關鍵字來計算表位置。當這個表的大小合適,並且計算演算法合適的情況下,hash表的演算法複雜度為o(1)的,但是這是理想的情況下的,如果hash表的關鍵字計算與表位置存在衝突,那麼最壞的複雜度為o(n)。 map在一次查詢中,你可以斷定它最壞的情況下其複雜度不會超過o(log2n)。而hash表就不一樣,是o(1),還是o(n),或者在其之間,你並不能把握。

我覺得如果數量級很小,不到w,那麼使用map和hash_map的區別不大,速度,穩定性都相差不大。但是如果數量級很大,就要考慮是要平均效率高,還是穩定性好了,如果用hash_map那麼可以自己來根據經驗來設定hash函式優化速度。而如果演算法對穩定性要求高的話,首選map。

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

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

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

hash與map的區別聯絡應用

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

hash與map的區別聯絡應用

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

查詢計畫Hash和查詢Hash

在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec requests檢索查詢計畫hash和查詢h...