解決hash衝突

2021-07-27 00:27:43 字數 1636 閱讀 5074

開放位址法:

1.線性探測法

線性再雜湊法是形式最簡單的處理衝突的方法。插入元素時,如果發生衝突,演算法會簡單的

從該槽位置向後迴圈遍歷hash表,直到找到表中的下乙個空槽,並將該元素放入該槽中(會導致相同hash值的元素挨在一起和其他hash值對應的槽被占用)。查詢元素時,首先雜湊值所指向的槽,如果沒有找到匹配,則繼續

從該槽遍歷hash表,直到:(1)找到相應的元素;(2)找到乙個空槽,指示查詢的元素不存在,(所以不能隨便刪除元素);(3)整個hash表遍歷完畢(指示該元素不存在並且hash表是滿的)

用線性探測法處理衝突,思路清晰,演算法簡單,但存在下列缺點:

① 處理溢位需另程式設計序。一般可另外設立乙個溢位表,專門用來存放上述雜湊表中放不下的記錄。此溢位表最簡單的結構是順序表,查詢方法可用順序查詢。

② 按上述演算法建立起來的雜湊表,刪除工作非常困難。如果將此元素刪除,查詢的時會發現空槽,則會認為要找的元素不存在。只能標上已被刪除的標記,否則,將會影響以後的查詢。

③ 線性探測法很容易產生堆聚現象。所謂堆聚現象,就是存入雜湊表的記錄在表中連成一片。按照線性探測法處理衝突,如果生成雜湊位址的連續序列愈長 ( 即不同關鍵字值的雜湊位址相鄰在一起愈長 ) ,則當新的記錄加入該錶時,與這個序列發生衝突的可能性愈大。因此,雜湊位址的較長連續序列比較短連續序列生長得快,這就意味著,一旦出現堆聚 ( 伴隨著衝突 ) ,就將引起進一步的堆聚。

2.線性補償探測法

線性補償探測法的基本思想是:將線性探測的步長從 1 改為 q ,即將上述演算法中的

hash = (hash + 1) % m 改為:hash = (hash + q) % m = hash % m + q % m,而且要求 q 與 m 是互質的,以便能探測到雜湊表中的所有單元。

【例】 pdp-11 小型計算機中的匯程式設計序所用的符合表,就採用此方法來解決衝突,所用表長 m = 1321 ,選用 q = 25 。

3.偽隨機探測

隨機探測的基本思想是:將線性探測的步長從常數改為隨機數,即令: hash = (hash + rn) % m ,其中 rn 是乙個隨機數。在實際程式中應預先用隨機數發生器產生乙個隨機序列,將此序列作為依次探測的步長。這樣就能使不同的關鍵字具有不同的探測次序,

拉鍊法拉鍊法 : hashmap

拉鍊法的優點

與開放定址法相比,拉鍊法有如下幾個優點:

①拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

②由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;

③開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;

④在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。

拉鍊法的缺點

拉鍊法的缺點是:指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指標空間用來擴大雜湊表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度。

再雜湊(雙重雜湊,多重雜湊)

建立乙個公共溢位區

假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]用以儲存發生衝突的記錄。

hash衝突解決

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時 衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位 因此,處理衝突和溢位是 雜湊技術中...

Hash衝突解決

hash衝突 解決方法 再雜湊法 鏈位址法 建立公共溢位區 開放定址法也稱再雜湊,假設容量為c,當前hash值為d,則 線性探測再雜湊 依次探測d 1,d 2 c 1,0,1,2,d 1 平方探測再雜湊 依次探測d 12,d 12,d 22,d 22 偽隨機探測再雜湊 隨機序列3,2,5 依次d 3...

解決hash衝突

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位。因此,處理衝突和溢位是 雜湊技術中...