二、解決Hash衝突的主要方法

二、解決Hash衝突的主要方法
1、幾個概念
    (1)什麼是hash表?
        散列表(Hash table,也叫哈希表),是根據鍵值對直接進行訪問的數據結構。它通過建立關鍵字和存儲位置之間的一個確定的對應關係f,使得,每個關鍵字與結構中唯一一個存儲位置相對應。這個對應關係f叫做哈希函數,存放記錄的數組叫做哈希表。
    (2)什麼是衝突?
        對於不同的關鍵字可能得到同一哈希地址,即key1 != key2,而f(key1)=f(key2),這種現象稱衝突。


    (3)如何處理衝突?
        假設哈希表的地址集爲0~(n-1),衝突是指由關鍵字得到的哈希地址爲j(0<= j <=n-1)的位置上已存有記錄,則"處理衝突"就是爲該關鍵字的記錄找到另一個"空"的hash地址。
2、處理衝突的幾個方法
    (1)開放定址法
        Hi(key) = (H(key)+di) MOD m i=1,2,...,k(k<=m-1)
        其中:H(key)爲哈希函數;m爲哈希表表長;di爲增量序列
        a、di=1,2,3,...,m-1,稱線性探測再散列
        b、二次探測再散列
        c、di=僞隨機數序列,稱僞隨機探測再散列
        例:在長度爲11的哈希表中已經填有關鍵字分別爲17,60,29的記錄(哈希函數H(key)=key MOD 11),現有第四個記錄,其關鍵字爲38,由哈希函數得到哈希地址爲5,產生衝突。若用稱線性探測再散列的方法處理時,得到下一個地址6仍衝突;下一個7仍衝突;直到哈希地址爲8的位置爲"空"爲止,處理衝突的過程結束。

   (2)再哈希法
        Hi=RHi(key)  i=1,2,…,k
        RHi均是不同的哈希函數,即在同義詞產生地址衝突時計算另一個哈希函數地址,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。
    (3)鏈地址法
        將所有關鍵字對應的值相同(同義詞)的記錄,存儲在同一線性鏈表中。
    (4)建立公共溢出區
        所有關鍵字和基本表中關鍵字爲同義詞的記錄,不管它們由哈希函數得到的哈希地址是什麼,一旦發生衝突,都填入溢出表。
        Hi=RHi(key)  i=1,2,…,k
        RHi均是不同的哈希函數,即在同義詞產生地址衝突時計算另一個哈希函數地址,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。
    (3)鏈地址法
        將所有關鍵字對應的值相同(同義詞)的記錄,存儲在同一線性鏈表中。
    (4)建立公共溢出區
        所有關鍵字和基本表中關鍵字爲同義詞的記錄,不管它們由哈希函數得到的哈希地址是什麼,一旦發生衝突,都填入溢出表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章