C 雜湊表的原理

2021-10-14 16:48:17 字數 1905 閱讀 8507

什麼是雜湊?

雜湊也稱為雜湊,雜湊是通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排序。

為什麼用雜湊?

通常情況下,我們使用陣列或者鍊錶來進行元素的儲存,在進行資料的查詢時需要不斷的迴圈遍歷,但是通過雜湊計算,就可以大大減少比較次數。

比如:四個資料:,我們需求是查詢元素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稱為雜湊函...