散列表

散列表的基本概念

  • 散列函數:一個把查找表中的關鍵字映射成該關鍵字對應的地址的函數,記為Hash(key) = Addr
  • 沖突:散列函數可能會把兩個或兩個以上的不同關鍵字映射到統一地址
  • 同義詞:這些發生碰撞的不用關鍵字
  • 散列函數的兩點要求:1.散列函數應盡量減少這樣的沖突 2.設計好處理沖突的方法
  • 散列表:根據關鍵字而直接進行訪問的數據結構,建立了關鍵字和存儲地址之間的中直接映射關系

散列函數的構造方法

在構造散列函數時,必須注意以下幾點:
1)散列函數的定義域必須包含全部需要存儲的關鍵字,而值域的范圍則依賴于散列表的大小或地址范圍
2)散列函數計算出來的地址應該能等概率、均勻地分布在整個空間中,從而減少沖突的發生
3)散列函數因盡量簡單,能夠在較多的時間內計算出任意關鍵字對應的散列地址

常見的散列函數

方法名 函數 優點 缺點
直接定址法 H(key) = a x key + b 不會產生沖突 關鍵字分布不均,造成空間浪費
除留余數法 H(key)= key %p 關鍵字分布較均勻 會產生沖突
數學分析法 分析關鍵字集合選取重復概率較小的數位作關鍵字 更換關鍵字集合需重新構造散列函數
平方取中法 取關鍵字平方值的中間幾位作為關鍵地址 散列地址分布較均勻
折疊法 將關鍵字分割成位數相同的幾個部分然后取這幾個部分的疊加個作為散列地址

處理沖突的方法

1.開放地址法
Hi = (H(key)+di)%m
1)線性探測法:di = 0,1,2,3,...,m-1,沖突法發生時,順序查看表中下一個單元,直到找到一個空閑單元或 查遍全表
2)平方探測法:di = 0*0,1*1,-1*1,2*2,-2*2,...,k*k,-k*k 是一種比較好的處理宏圖的方法,可以避免癡線“堆積”問題,它的缺點是不能探測到散列表上的所有大院,但至少能探測到一半單元
3)再散列法:di = Hash2(key)
4) 偽隨機序列法:當di = 為隨機數序列時

2.拉鏈法
適合經常進行插入和刪除操作

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 散列表(hash table)是實現字典操作的一種有效數據結構,盡管最壞情況下,散列表中的查找一個元素的時間與鏈表...
    Mrsunup閱讀 1,384評論 0 2
  • 說明:該系列博客整理自《算法導論(原書第二版)》,但更偏重于實用,所以晦澀偏理論的內容未整理,請見諒。另外本人能力...
    黑夜0411閱讀 1,478評論 0 2
  • 基本概念 基于線性表、樹表結構的查找方法,這類查找方法都是以關鍵字的比較為基礎的。在查找過程中只考慮各元素關鍵字之...
    官先生Y閱讀 523評論 0 2
  • 還想看更多文章的朋友可以訪問我的個人博客 散列表 散列表(Hash table,也叫哈希表),是根據關鍵碼值(Ke...
    我是才子閱讀 950評論 0 0
  • 1 散列表 散列表的英文叫“Hash Table”,我們平時也叫它“哈希表”或者“Hash 表”,散列表用的就是數...
    貪睡的企鵝閱讀 1,469評論 0 1