雜湊法是利用雜湊函數來計算一個鍵值所對應的位址,進而建立雜湊表格,然後依賴雜湊函數來搜尋找到各鍵值存放在表格中的位址,搜尋速度與資料多少無關,在沒有碰撞和溢位下,一次讀取即可,且保密性高,因為不事先知道雜湊函數就無法搜尋。
除法是最簡單的雜湊法是將資料除以某一個常數後,取餘數來當索引。
例:有11個位置的陣列中,只使用6個位址。那我們可以把陣列內的值除以11,並以其餘數來當索引。
h(key) = key mod B
B=11
索引 | 資料 |
---|---|
0 | 60 |
1 | |
2 | 65 |
3 | |
4 | |
5 | |
6 | 70 |
7 | |
8 | 33 |
9 | 98 |
10 | 75 |
中間平方法跟除法類似,它是把資料乘以自己,再取中間的某段數字做索引。
例:用中間平方法,將它放在100個位址裡
1.將60,65,70,33,98,75平方後
3600,4225,4900,1089,9604,5625
2.取百位數和十位數作為鍵值
60,22,90,08,60,62
這六個數的數列就是原先的60,65,70,33,98,75存放在100個位址空間的索引值。
f(60) = 60
f(22) = 65
f(90) = 70
f(8) = 33
f(60) = 98
f(62) = 75
若實際空間介於0~9,但取百位數及十位數的值介於0~99,所以必須將中間平方法第一次求得的鍵值,再行壓縮1/10才可以將100個可能生產的值對應到10個空間,即將每一個鍵值除以10取整數。
折疊法是將資料轉換成一串數字後,將這串數字拆成數個部分,最後再加起來,就可算出這個鍵值的bucket address。
有一份資料轉換成數字為2365479125443,以每4個字為一部分則可拆為2365,4791,2544,3。將四組數字加起來為索引值。
折疊法的分類
移動折疊法:將每一部分相加所得的值為其bucket address
邊界折疊法:將每一部分的奇數位段或偶數位段,再行相加起來取得其bucket address
數位分析法適用於資料不會更改,且數字型態的資料,再決定雜湊函數時先逐一檢查資料的相對位置及分佈情形,將重複性高的部分刪除。
以電話表為例:
電話表算是有規律性的,再02區碼這邊看,中間三個數變化不大,假設位址空間大小m=999,我們須從下列數字擷取適當的數,及數字比較不集中,分布範圍較為平均,再決定最後那四個數字的末三碼,可得雜湊表。
目前應該不會太難吧🐕🐕!!
要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 🧙🧙🧙。