什麼是雜湊?
雜湊也稱為雜湊,雜湊是通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排序。
為什麼用雜湊?
通常情況下,我們使用陣列或者鍊錶來進行元素的儲存,在進行資料的查詢時需要不斷的迴圈遍歷,但是通過雜湊計算,就可以大大減少比較次數。
比如:四個資料:,我們需求是查詢元素13是否存在
使用陣列進行儲存方式
#include
#include
using
namespace std;
intmain()
;for
(int i=
0; i
size()
; i++)}
}
不難發現,想要判斷陣列中是否含有資料13,我們需要進行遍歷4次才能得到,時間複雜度為o(n)
如果我們在使用前進行雜湊函式(雜湊函式有多種,稍後講解)的計算:
舉例的雜湊函式:h[key] = key % 3
我們將四個值均帶入到雜湊函式中進行計算,所得的雜湊值為:
按照這個分類,我們可以進行乙個雜湊表的構建:
為此,當我們查詢資料13的時候,先用雜湊計算出他的位置,然後到計算的位置中檢視是否存在即可
通過上面的例子,我們不難看出,雜湊的實質其實就是先分類,再按照分類進行查詢。
就好比到圖書館看書,先看書籍的分類,再到指定分類找到自己想要的書籍。
雜湊函式的構造方法
直接定址法
數字分析法
平方取中法
摺疊法除留餘數法
隨機數法
什麼是雜湊衝突,及其解決的辦法
雜湊衝突:
回到剛剛的例子:
從上面我們不難看出,資料0 和資料15 在進行雜湊計算的時候,所得到的位址都是0
也就是說,乙個位址需要儲存多個資料,這就發生了雜湊衝突
如何解決雜湊衝突呢?
在上面的例子中,我們使用的就是解決雜湊衝突方法中比較簡單,也較為常用的一種方法:鏈位址法
什麼是鏈式位址法?
就是將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。
假設某雜湊函式產生的雜湊位址在區間[
0, m-
1]上,則設計乙個指標型向量 chain chainhash[m]
;其每個分量的初始狀態都是空指標。
雜湊位址為i的記錄都插入到頭指標為chainhash[i]的鍊錶中。在鍊錶中的插入位置可以在表頭或表尾;
也可以在中間,以保持同義詞在同一線性表中按關鍵字有序。
測試:已知一組關鍵字為,使用雜湊函式:h(key)=key%13;進行雜湊表的建立。
什麼是開放定址法?
h i=
(h(k
ey)+
di)m
odmi
=1,2
,...
..k(
k<=m
−1)h_i = (h(key) + d_i) mod m i=1,2,.....k(k<=m-1)
hi=(h
(key
)+di
)mo
dmi=
1,2,
....
.k(k
<=m
−1)
雜湊表 雜湊表 的實現原理
雜湊表可以表述為,是一種可以根據關鍵字快速查詢資料的資料結構。通常情況下,不論雜湊表中資料有多少,增加,刪除,改寫資料的複雜度平均都是o 1 效率非常高。如果說每乙個資料它都對應著乙個固定的位置,那我們查詢特定乙個資料時,就可以直接檢視這個資料對應的位置是否存在資料。乙個形象的例子就是學生在教室中的...
雜湊表(雜湊表)原理詳解
雜湊表 hash table,也叫雜湊表 是 根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做 雜湊函式 存放記錄的陣列叫做 雜湊表。或者 把任意長度的輸入 又叫做預對映,pre image 通過雜...
雜湊表(雜湊表)原理詳解
t什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜湊函...