在一般的雜湊表中,有乙個顯著的缺點:無論選擇什麼樣的雜湊函式,總存在一條鍵值輸入序列,這條序列中的每乙個鍵值都會被雜湊對映到同乙個槽中,導致形成的雜湊表只是一條鍊錶,效率較低。
首先需要明確,這個問題的產生是由於雜湊函式的確定性,如果雜湊函式是不定的,則可以解決這個問題。由此引入隨機性。
設u
uu為鍵值的全集,h
hh為雜湊函式的有限集,雜湊表的槽數量為m
mm,若∀x,
y∈u,
x≠y,
∣\forall x,y\in u,x≠y,|
∀x,y∈u
,x
=y,∣
∣ =∣
h∣
m|=\frac
∣=m∣h∣
,即對於任意兩個不同的鍵對,雜湊函式集合中能將其對映到同乙個槽的雜湊函式數量為雜湊函式集合的大小與槽的數量的比值,則該雜湊表稱為全域雜湊表。
在全域雜湊表中,兩個不同鍵值碰撞的概率為1
m\frac
m1,分析如下:隨機從h
hh中選出的雜湊函式能使兩個不同鍵值碰撞的數量為∣h∣
m\frac
m∣h∣
,這個數除以雜湊函式總數∣h∣
|h|∣h
∣,即碰撞概率1
m\frac
m1此外,全域雜湊表有乙個定理:從h
hh中隨機選擇雜湊函式,將n
nn個鍵放入雜湊表中的m
mm個槽中,發生碰撞的總次數的期望值小於填裝因子α=n
m\alpha=\frac
α=mn.
證明略,提示如下:可用隨機變數證明,證明中需要用到期望的線性性質
首先,雜湊表槽數量m
mm需要為質數。將給定鍵值k
kk轉換為r+1位的m
mm進製數,形成乙個序列k0k
1...
kr
k_0k_1...k_r
k0k1
...k
r,同時隨機選取乙個r+1位的m
mm進製數a=a0a
1...
ar
a_0a_1...a_r
a0a1
...a
r。雜湊函式ha(
k)=∑
i=0r
(aik
i)mo
dm
h_a(k)=\sum_^r(a_ik_i)\mod m
ha(k)
=∑i=
0r(
aik
i)m
odm
對於該雜湊函式的全域性,證明如下:
設mmm為乙個質數,z
mz_m
zm是對m
mm取餘後的整數,對於任意不為0的z∈z
mz∈z_m
z∈zm
,存在唯一的乙個z−1
∈z
mz^∈z_m
z−1∈zm
,使得z−1
⋅z≡1
(mod
m)
z^·z≡1 (\mod m)
z−1⋅z≡
1(mo
dm)
演算法筆記 10 雜湊表
雜湊錶用的是陣列支援下標隨機訪問資料的特性,所以雜湊表其實就是陣列的一種擴充套件,由陣列演化而來。通過雜湊函式將元素的鍵值對映為下標,然後將資料儲存在陣列對應下標的位置。我們按照鍵值查詢元素時,我們使用同樣的雜湊函式,將鍵值轉化為陣列下標,從對應的陣列下標位置取資料。雜湊函式計算得到的雜湊值必須是乙...
雜湊表與雜湊演算法學習筆記
雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...
雜湊表演算法
雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...