1. 程式人生 > 實用技巧 >雜湊表(散列表)原理學習

雜湊表(散列表)原理學習

定義:
雜湊表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構
也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。
這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。

重要知識點:
1.記錄的儲存位置=f(關鍵字)
這裡的對應關係f稱為雜湊函式,又稱為雜湊(Hash函式),
採用雜湊技術將記錄儲存在一塊連續的儲存空間中,
這塊連續儲存空間稱為散列表或雜湊表(Hash table)。
2.雜湊表的儲存方式和查詢方式
雜湊表hashtable(key,value) 就是把Key通過
一個固定的演算法函式既所謂的雜湊函式轉換成一個整型數字,
然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標

將value儲存在以該數字為下標的陣列空間裡。
(或者:把任意長度的輸入(又叫做預對映, pre-image),
通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。
這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,
不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。
簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。)
而當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,
並定位到該空間獲取value,如此一來,就可以充分利用到陣列的定位效能進行資料定位。

3.雜湊表的特點
陣列的特點是:定址容易,插入和刪除困難;
而連結串列的特點是:定址困難,插入和刪除容易。
那麼我們能不能綜合兩者的特性,做出一種定址容易,插入刪除也容易的資料結構?
答案是肯定的,這就是我們要提起的雜湊表,雜湊表有多種不同的實現方法,
我接下來解釋的是最常用的一種方法——拉鍊法,我們可以理解為“連結串列的陣列”,如圖:

左邊很明顯是個陣列,陣列的每個成員包括一個指標,

指向一個連結串列的頭,當然這個連結串列可能為空,也可能元素很多。

我們根據元素的一些特徵把元素分配到不同的連結串列中去,

也是根據這些特徵,找到正確的連結串列,再從連結串列中找出這個元素。

Hash的應用:

場景一:

Hash主要用於資訊保安領域中加密演算法,它把一些不同長度的資訊轉化成雜亂的128位的編碼,

這些編碼值叫做Hash值. 也可以說,Hash就是找到一種資料內容和資料存放地址之間的對映關係。

場景二:

查詢:雜湊表,又稱為雜湊,是一種更加快捷的查詢技術。

我們之前的查詢,都是這樣一種思路:集合中拿出來一個元素,

看看是否與我們要找的相等,如果不等,縮小範圍,繼續查詢。

而雜湊表是完全另外一種思路:當我知道key值以後,

我就可以直接計算出這個元素在集合中的位置,根本不需要一次又一次的查詢!

舉一個例子,假如我的陣列A中,第i個元素裡面裝的key就是i,

那麼數字3肯定是在第3個位置,數字10肯定是在第10個位置。

雜湊表就是利用利用這種基本的思想,建立一個從key到位置的函式,然後進行直接計算查詢。

場景三:Hash表在海量資料處理中有著廣泛應用。

Hash Table特點:

Hash Table的查詢速度非常的快,幾乎是O(1)的時間複雜度。

hash就是找到一種資料內容和資料存放地址之間的對映關係。

雜湊法:

定義:元素特徵轉變為陣列下標的方法。

問題:我想大家都在想一個很嚴重的問題:“如果兩個字串在雜湊表中對應的位置相同怎麼辦?”,

畢竟一個數組容量是有限的,這種可能性很大。

解決該問題的方法很多,我首先想到的就是用“連結串列”。

我遇到的很多演算法都可以轉化成連結串列來解決,

只要在雜湊表的每個入口掛一個連結串列,儲存所有對應的字串就OK了。

散列表的查詢步驟:

當儲存記錄時,通過雜湊函式計算出記錄的雜湊地址

當查詢記錄時,我們通過同樣的是雜湊函式計算記錄的雜湊地址,並按此雜湊地址訪問該記錄

ps:

關鍵字——雜湊函式(雜湊函式)——雜湊地址

優點:一對一的查詢效率很高;

缺點:一個關鍵字可能對應多個雜湊地址;需要查詢一個範圍時,效果不好。

雜湊衝突:不同的關鍵字經過雜湊函式的計算得到了相同的雜湊地址。

好的雜湊函式=計算簡單+分佈均勻(計算得到的雜湊地址分佈均勻)

雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。

雜湊表的優缺點:

優點:

不論雜湊表中有多少資料,查詢、插入、刪除(有時包括刪除)只需要接近常量的時間即0(1)的時間級。

實際上,這隻需要幾條機器指令。

雜湊表運算得非常快,在計算機程式中,如果需要在一秒種內查詢上千條記錄通常使用雜湊表

(例如拼寫檢查器)雜湊表的速度明顯比樹快,樹的操作通常需要O(N)的時間級。

雜湊表不僅速度快,程式設計實現也相對容易。

如果不需要有序遍歷資料,並且可以提前預測資料量的大小。

那麼雜湊表在速度和易用性方面是無與倫比的。

缺點:

它是基於陣列的,陣列建立後難於擴充套件,某些雜湊表被基本填滿時,








學習來源:

https://blog.csdn.net/duan19920101/article/details/51579136