1. 開放定址法
開放定址法就是一旦發生沖突,就去尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到,並將記錄存入。
Hi = (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=偽隨機數序列,稱為偽隨機探測再散列。
缺點:用同樣的隨機種子,將得到相同的數列。
缺點:
2. 再散列函數法
Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函數(比如除留余數、折疊、平方取中),在同義詞產生地址沖突時就換用另一個散列函數計算散列地址,直到碰撞不再發生。
優點:不易產生“聚集”。
缺點:增加了計算時間。
3. 鏈地址法
將所有關鍵字為同義詞的記錄存儲在一個單鏈表中,稱這種表為同義詞子表,在散列表中只存儲所有同義詞子表的頭指針。
優點:
缺點:
②由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;
④在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之后填人散列表的同義詞結點的查找路徑。這是因為各種開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。因此在 用開放地址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
4. 公共溢出區法
為所有沖突的關鍵字記錄建立一個公共的溢出區來存放。在查找時,對給定關鍵字通過散列函數計算出散列地址后,先與基本表的相應位置進行比對,如果相等,則查找成功;如果不相等,則到溢出表進行順序查找。如果相對於基本表而言,在有沖突的數據很少的情況下,公共溢出區的結構對查找性能來說還是非常高的。