[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
相關文章
相關標籤/搜索