[Data Structure & Algorithm] 哈希表
哈希方法(Hashing) - 散列
- 經過函數h將K映射到表T[0..M-1]的下標上,這樣h(Ki)就是對應結點Ki的存儲地址
- 哈希表 - T
- 哈希表長 - M
- 哈希函數 - h
- 衝突(Collision) - 兩個不一樣的關鍵字,經過哈希函數映射到同一個地址
- 優勢 - 直接尋址查找,理想時間複雜度爲O(1),但實際很難作到
- 裝填因子α = 哈希表中關鍵字的個數/哈希表的長度
- α越小 -> 哈希表中的空地址越多 -> 發生衝突的可能性越小 -> 平均查找實踐越小
- 查詢成功平均長度 = 查詢成功的次數/關鍵字的個數
- 若是沒有衝突,則查詢成功的次數 = 1
- 若是爲了解決而偏移過地址,則查詢成功的次數 = 偏移量
- 查詢失敗平均長度 = 查詢失敗的次數/關鍵字的個數
- 若是是空地址,則查詢失敗的次數 = 1
- 若是不是空地址,則查詢失敗的次數 = 從這個地址到最近的空地址的距離
哈希函數的構造
- 要求
- 儘可能減小衝突
- 哈希後的地址隨機分佈在整個地址區間
- 如下方法能夠搭配使用
- 直接定址法
- 經過線性計算, 如h(key) = a*key + b
- 要求 - 關鍵字分佈具備很強的規律性
- 優勢 - 不會產生衝突
- 數據分析法
- 選擇隨機性較強的部分做爲地址,如對於8位數的集合,選擇其中隨機性較強的幾位數,儘可能構成不相同的地址
- 要求
- 平方取中法 - 較爲經常使用
- 先將關鍵字平方,再選擇中間幾位數做爲地址
- 優勢 - 平方後保證關鍵字的每一位都有做用,減少衝突的可能性
- 摺疊法
- 移位摺疊法 - 將關鍵詞分紅幾部分(每部分的位數能夠不一樣),再相加
- 邊界摺疊法
- 除留餘數法
- 將關鍵字除以某個不大於哈希表表長m的數p後,取餘數
- p的選取
- 通常設爲小於哈希表長度的最大質數
- 通常不設爲2的次冪 - 增長衝突的可能性
解決衝突的辦法
- 開放定址法
- 基本思路 - 對於衝突的兩個關鍵字,將後一個關鍵字經過探測方法填入另外一個地址中
- 經常使用探測方法
- 線性探測法 - 從已經被佔用的地址i開始依次向下(i+1,i+2,i+3)探測,直到找到空的地址
- 平方探測法 - 從已經被佔用的地址i開始按平方數向下(i+1,i+4,i+9)探測,直到找到空的地址
- 雙散列 - 有兩個哈希函數h1, h2,當h1計算出的哈希值有衝突時,經過h2計算出的探測地址的增量h2(key),即從已經被佔用的地址i開始從i+h2(key),i+2h2(key),i+3h2(key)探測,直到找到空的地址
- 要求 - h2的值和M互素,爲了使關鍵字較均勻地分佈在整個哈希表中
- 平均查找長度 - 1/2*(1+1/(1-α))
- 鏈地址法
- 基本思路
- 將哈希表的每個地址空間都定義爲一個單鏈表的表頭指針
- 將對應相同哈希地址的關鍵字,連接在該地址的表頭指針後
- 優勢
- 處理衝突簡單,平均查找時間較短
- 刪除結點簡單
- 不會溢出
- 缺點 - 維護指針須要額外的空間
- 適用
- 平均查找長度 - 1+α/2
歡迎關注本站公眾號,獲取更多信息