散列表解決沖突的方式


1. 開放定址法

開放定址法就是一旦發生沖突,就去尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到,並將記錄存入。

H= (H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)為散列函數,m為散列表長,di為增量序列。di可有下列三種取法:

(1)di=1,2,3,…, m-1,稱為線性探測再散列;

  缺點:造成大量元素在相鄰的散列地址上“聚集”,大大降低查找效率。

(2)di=1^2, -(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),稱為二次探測再散列;

  優點:避免出現“堆積”問題。

  缺點:不能探測到散列表上的所有單元,但至少能探測到一半單元。

(3)di=偽隨機數序列,稱為偽隨機探測再散列。

  缺點:用同樣的隨機種子,將得到相同的數列。

 

缺點:

①存儲記錄的數目不能超過桶數組的長度,如果超過就需要擴容,而擴容會導致某次操作的時間成本飆升,這在實時或者交互式應用中可能會是一個嚴重的缺陷
②使用探測序列,有可能其計算的時間成本過高,導致哈希表的處理性能降低
③由於記錄是存放在桶數組中的,而桶數組必然存在空槽,所以當記錄本身尺寸(size)很大並且記錄總數規模很大時,空槽占用的空間會導致明顯的內存浪費
④刪除記錄時,比較麻煩。比如需要刪除記錄a,記錄b是在a之后插入桶數組的,但是和記錄a有沖突,是通過探測序列再次跳轉找到的地址,所以如果直接刪除a,a的位置變為空槽,而空槽是查詢記錄失敗的終止條件,這樣會導致記錄b在a的位置重新插入數據前不可見,所以不能直接刪除a,而是設置刪除標記。這就需要額外的空間和操作。

 

2. 再散列函數法

Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函數(比如除留余數、折疊、平方取中),在同義詞產生地址沖突時就換用另一個散列函數計算散列地址,直到碰撞不再發生。

優點:不易產生“聚集”。

缺點:增加了計算時間。

3. 鏈地址法

將所有關鍵字為同義詞的記錄存儲在一個單鏈表中,稱這種表為同義詞子表,在散列表中只存儲所有同義詞子表的頭指針。

 

優點:

①對於記錄總數頻繁可變的情況,處理的比較好(也就是避免了動態調整的開銷)
②由於記錄存儲在結點中,而結點是動態分配,不會造成內存的浪費,所以尤其適合那種記錄本身尺寸(size)很大的情況,因為此時指針的開銷可以忽略不計了
③刪除記錄時,比較方便,直接通過指針操作即可

缺點:

①存儲的記錄是隨機分布在內存中的,這樣在查詢記錄時,相比結構緊湊的數據類型(比如數組),哈希表的跳轉訪問會帶來額外的時間開銷
②如果所有的 key-value 對是可以提前預知,並之后不會發生變化時(即不允許插入和刪除),可以人為創建一個不會產生沖突的完美哈希函數(perfect hash function),此時封閉散列的性能將遠高於開放散列
 
相對於開放定址法的優點:
①拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;
②由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
④在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之后填人散列表的同義詞結點的查找路徑。這是因為各種開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。因此在 用開放地址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
相對於開放定址法的缺點:
指針需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。
 
總結:
元素少,用開放定址,沖突少,速度快;元素多,用鏈地址。

4. 公共溢出區法

為所有沖突的關鍵字記錄建立一個公共的溢出區來存放。在查找時,對給定關鍵字通過散列函數計算出散列地址后,先與基本表的相應位置進行比對,如果相等,則查找成功;如果不相等,則到溢出表進行順序查找。如果相對於基本表而言,在有沖突的數據很少的情況下,公共溢出區的結構對查找性能來說還是非常高的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM