資料結構-雜湊
考研相關文章參考資料為 wjungle 大神提供的筆記
Hashing
- 一種資料儲存與搜尋的機制,當想要存入或取出資料時,先經過
Hashing Function求出Hashing Address,接著到Hash Table中對應的 Bucket 存入或取出資料 Hash Table由 個 Bucket 組成- 每個
Bucket則由 個 Slots 組成- 每個
Slot可儲存一筆資料
- 每個
- 每個
- 優點:
- 資料搜尋前不用經過排序
- 在沒有
Collision的情況下,資料搜尋時間為- Worst case: :
Hashing Function為定值
- Worst case: :
- 保密性、安全性高
- 不知道
Hashing Function則無法存取資料 - 不可回推
- 不知道
- 常用於密碼學、資料壓縮
相關術語
Collision碰撞- 不同資料經過
Hashing Function後得到相同Hashing Address
- 不同資料經過
Overflow溢位Collision發生後對應的 Bucket 沒有多餘空間可存入資料- 有
Collision不一定有Overflow - 當每個 Bucket 只有一個 Slot 則
Collision=Overflow
- Indentifier density & Loading density
- 令 為
Indentifier總數, 為目前使用的Indentifier個數, 為 Hash Table szie,則:- Indentifier density:
- Loading density:
- 令 為
Hashing Function Design
- 良好的
Hashing Function應滿足以下三個條件:- 計算簡單
Collision少- 避免
Hash Table偏重 (局部) 儲存的情況,應該均勻分布
- 相關名詞:
- Perfect Hashing Function: 保證無
Collision發生 - Uniform Hashing Function: 資料均勻分布於
Hash Table- 每個 Bucket 約有 的資料
- Perfect Hashing Function: 保證無
middle square
- 將資料數值
平方後取中間適當位置之數值作為Hashing Address- ex:
Division (Mod)
-
- 的建議選擇:
- 質數
- 不要整除 ,其中 為很小的正數
- 的建議選擇:
Folding Addition
- 將資料切分為幾個相同長度的片段,並將這些片段相加得到
Hashing Address - 這些片段有兩種相加方式:
- Shift (直接相加)
- Boundary (偶數片段反向)
- ex:
- Shift:
- Boundary:
Digits Analysis
- 分析所有資料的各個位數情況:
- 如果該位數的數值很集中,則捨棄該位數
- 如果該位數的數值很分散,則挑選該位數
- 由挑出的位數組合成
Hashing Address - ex:
Overflow 處理
Linear Probing (線性探測)
- 又稱
Linear open addressing mode - 當 發生
overflow,則探測 ,直到有空 Bucket 或是 Table 全滿 (無法存入) 為止 - 優點:
- 簡單,容易實施
- 保證 Table 空間
充分利用
- 缺點:
- 易發生
Primary clustering問題- 相同
Hashing Address的資料會儲存在鄰近的 Bucket 中,增加搜尋時間
- 相同
- 易發生
Quadratic Probing (平方探測)
- 當 發生
overflow,則探測 ,直到有空 Bucket 或是探測之 Bucket 全滿 (無法存入) 為止- or
- 優點:
- 解決
Primary clustering
- 解決
- 缺點:
不保證Table 空間充分利用- 易發生
Secondary clustering問題- 相同
Hashing Address的資料overflow之探測位置皆相同 (具有規律性),增加搜尋時間
- 相同
Double Hashing
- 當 發生
overflow,則探測 ,直到有空 Bucket 或是探測之 Bucket 全滿 (無法存入) 為止- 的意義: 探測距離
- 的形式通常為 , 為質數
- 優點:
- 解決
Secondary clustering
- 解決
- 缺點:
不保證Table 空間充分利用
Chain
- 將具有相同
Hashing Address的資料放入同一 Bucket 中,彼此以 Link list 方式串聯,屬於close addressing mode(介紹的其餘方式皆為open addressing mode)
Rehashing
- 提供一系列的
Hashing Functions,若使用 發生overflow,則改用 ,直到有空 Bucket 或是函數全部用完 (無法存入) 為止





