重溫資料結構 雜湊 雜湊函式 雜湊表

2021-08-27 03:16:51 字數 3798 閱讀 6720

hash(雜湊),又稱「雜湊」。

雜湊(hash)英文原意是「混雜」、「拼湊」、「重新表述」的意思。

在某種程度上,雜湊是與排序相反的一種操作,排序是將集合中的元素按照某種方式比如字典順序排列在一起,而雜湊通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排列。

在介紹一些集合時,我們總強調需要重寫某個類的 equlas() 方法和 hashcode() 方法,確保唯一性。這裡的 hashcode() 表示的是對當前物件的唯一標示。計算 hashcode 的過程就稱作 雜湊。

我們通常使用陣列或者鍊錶來儲存元素,一旦儲存的內容數量特別多,需要占用很大的空間,而且在查詢某個元素是否存在的過程中,陣列和鍊錶都需要挨個迴圈比較,而通過 雜湊 計算,可以大大減少比較次數

現在有 4 個數 ,需要查詢 13 是否存在。

1.使用陣列儲存,需要新建個陣列 new int,然後需要寫個迴圈遍歷查詢:

int numbers = new int;

for (int i = 0; i < numbers.length; i++)

}

這樣需要遍歷 4 次才能找到,時間複雜度為 o(n)。

2.而假如儲存時先使用雜湊函式進行計算,這裡我隨便用個函式:

h[key] = key % 3;
四個數 對應的雜湊值為:

h[2] = 2 % 3 = 2;

h[5] = 5 % 3 = 2;

h[9] = 9 % 3 = 0;

h[13] = 13 % 3 = 1;

然後把它們儲存到對應的位置。

當要查詢 13 時,只要先使用雜湊函式計算它的位置,然後去那個位置檢視是否存在就好了,本例中只需查詢一次,時間複雜度為 o(1)。

比如你和我一樣是個剁手族買書狂,家裡書一大堆,如果書存放時不分類直接擺到書架上(陣列儲存),找某本書時可能需要腦袋從左往右從上往下轉好幾圈才能發現;如果存放時按照類別分開放,技術書、**、文學等等分開(按照某種雜湊函式計算),找書時只要從它對應的分類裡找,自然省事多了。

雜湊的過程中需要使用雜湊函式進行計算。

表示為:

address = h [key]

除留餘數法 

數字分析法 

平方取中法 

摺疊法(疊加法) 

隨機數法 

構造雜湊函式的方法很多,實際工作中要根據不同的情況選擇合適的方法,總的原則是盡可能少的產生衝突

通常考慮的因素有關鍵字的長度分布情況雜湊值的範圍等。

如:當關鍵字是整數型別時就可以用除留餘數法;如果關鍵字是小數型別,選擇隨機數法會比較好。

選用雜湊函式計算雜湊值時,可能不同的 key 會得到相同的結果,乙個位址怎麼存放多個資料呢?這就是衝突。

常用的主要有兩種方法解決衝突:

1.鏈結法(拉鍊法)

若選定的雜湊表長度為 m,則可將雜湊表定義為乙個由 m 個頭指標組成的指標陣列 t[0..m-1] 。

凡是雜湊位址為 i 的結點,均插入到以 t[i] 為頭指標的單鏈表中。 

t 中各分量的初值均應為空指標。

在拉鍊法中,裝填因子 α 可以大於 1,但一般均取 α ≤ 1。

2.開放定址法

用開放定址法解決衝突的做法是:

用開放定址法解決衝突的做法是:當衝突發生時,使用某種探測技術在雜湊表中形成乙個探測序列。沿此序列逐個單元地查詢,直到找到給定的關鍵字,或者碰到乙個開放的位址(即該位址單元為空)為止(若要插入,在探查到開放的位址,則可將待插入的新結點存人該位址單元)。查詢時探測到開放的位址則表明表中無待查的關鍵字,即查詢失敗。

按照形成探查序列的方法不同,可將開放定址法區分為線性探查法、二次探查法、雙重雜湊法等。

a.線性探查法

hi=(h(key)+i) % m ,0 ≤ i ≤ m-1

基本思想是: 

探查時從位址 d 開始,首先探查 t[d],然後依次探查 t[d+1],…,直到 t[m-1],此後又迴圈到 t[0],t[1],…,直到探查到有空餘位址或者到 t[d-1]為止。

b.二次探查法

hi=(h(key)+i*i) % m,0 ≤ i ≤ m-1

基本思想是: 

探查時從位址 d 開始,首先探查 t[d],然後依次探查 t[d+1^2],t[d+2^2],t[d+3^2],…,等,直到探查到有空餘位址或者到 t[d-1]為止。

缺點是無法探查到整個雜湊空間。

c.雙重雜湊法

hi=(h(key)+i*h1(key)) % m,0 ≤ i ≤ m-1

該方法使用了兩個雜湊函式 h(key) 和 h1(key),故也稱為雙雜湊函式探查法。

定義 h1(key) 的方法較多,但無論採用什麼方法定義,都必須使 h1(key) 的值和 m 互素,才能使發生衝突的同義詞位址均勻地分布在整個表中,否則可能造成同義詞位址的迴圈計算。

該方法是開放定址法中最好的方法之一。

雜湊表(hash table)是雜湊函式最主要的應用。

雜湊表是實現關聯陣列(associative array)的一種資料結構,廣泛應用於實現資料的快速查詢。

用雜湊函式計算關鍵字的雜湊值(hash value),通過雜湊值這個索引就可以找到關鍵字的儲存位置,即桶(bucket)。雜湊表不同於二叉樹、棧、序列的資料結構一般情況下,在雜湊表上的插入、查詢、刪除等操作的時間複雜度是 o(1)。

查詢過程中,關鍵字的比較次數,取決於產生衝突的多少,產生的衝突少,查詢效率就高,產生的衝突多,查詢效率就低。因此,影響產生衝突多少的因素,也就是影響查詢效率的因素。 

影響產生衝突多少有以下三個因素:

雜湊函式是否均勻;

處理衝突的方法;

雜湊表的載入因子。

雜湊表的載入因子和容量決定了在什麼時候桶數(儲存位置)不夠,需要重新雜湊。

載入因子太大的話桶太多,遍歷時效率變低;太大的話頻繁 rehash,導致效能降低。所以載入因子的大小需要結合時間和空間效率考慮。

在 hashmap 中的載入因子為 0.75,即四分之三。

網路環境下的分布式快取系統一般基於一致性雜湊(consistent hashing)。簡單的說,一致性雜湊將雜湊值取值空間組織成乙個虛擬的環,各個伺服器與資料關鍵字k使用相同的雜湊函式對映到這個環上,資料會儲存在它順時針「遊走」遇到的第乙個伺服器。可以使每個伺服器節點的負載相對均衡,很大程度上避免資源的浪費。

在動態分布式快取系統中,雜湊演算法的設計是關鍵點。使用分布更合理的演算法可以使得多個服務節點間的負載相對均衡,可以很大程度上避免資源的浪費以及部分伺服器過載。 使用帶虛擬節點的一致性雜湊演算法,可以有效地降低服務硬體環境變化帶來的資料遷移代價和風險,從而使分布式快取系統更加高效穩定。

資料結構 雜湊表(雜湊表)hash table

hash table 在計算機中,雜湊表 是 一種實現了關聯陣列 抽象資料型別的資料結構,這種資料結構可以對映 鍵 key 和 值 value 補充 關聯陣列 在電腦科學中,乙個關聯陣列 associative array 對映 map 符號表 symbol table 或者是字典 dictiona...

資料結構 雜湊表 雜湊表 原理

記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜湊函式,又稱為雜湊 hash函式 採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表 hash table 雜湊表hashtable key,value 就是把key通過乙個固定的演算法函式既所謂的雜湊函式轉換成乙個整型...

資料結構 雜湊表查詢(雜湊表)

對於查詢,有順序表直接遍歷,有折半查詢直到查詢成功。但是這都需要不斷的比較,每一次查詢都需要重新遍歷,所以當資料龐大時是非常耗時的。雜湊表是一種可以避免多次比較,直接通過關鍵字就可以得到要查詢的記錄記憶體儲存位置。例如就像是乙個函式,每乙個自變數都對應著乙個函式值,即 這屬於雜湊技術,不需要比較就可...