hash碰撞衝突
我們知道,物件hash的前提是實現equals()和hashcode()兩個方法,那麼hashcode()的作用就是保證物件返回唯一hash值,但當兩個物件計算值一樣時,這就發生了碰撞衝突。如下將介紹如何處理衝突,當然其前提是一致性hash。
1.開放位址法
開放地執法有乙個公式:hi=(h(key)+di) mod m i=1,2,…,k(k<=m-1)
其程式設計客棧中,m為雜湊表的表長。di 是產生衝突的時候的增量序列。如果di值可能為1,2,3,…m-1,稱線性探測再雜湊。
如果di取1,則每次衝突之後,向後移動1個位置.如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),稱二次探測再雜湊。
如果di取值可能為偽隨機數列。稱偽隨機探測再雜湊。
2程式設計客棧.再雜湊法程式設計客棧
當發生衝突時,使用第二個、第三個、雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。
比如上面第一次按照姓首字母進行雜湊,如果產生衝突可以按照姓字母首字母第二位進行雜湊,再衝突,第三位,直到不衝突為止
3.鏈位址法(拉鍊法)
將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。如下:
因此這種方法,可以近似的認為是筒子裡面套筒子
4.建立乙個公共溢位區
假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]用以儲存發生衝突的記錄。
拉鍊法的優缺點:
優點:①拉鍊法處程式設計客棧理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
②由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少衝突,要求裝填因子較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;
④在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。而對開放位址法構造的雜湊表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之後填人雜湊表的同義詞結點的查詢路徑。這是因為各種開放位址法中,空位址單元(即開放位址)都是查詢失敗的條件。因此在 用開放位址法處理衝突的雜湊表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
缺點:指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指標空間用來擴大雜湊表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度。
補充知識:j**a的hashmap如何處理hash碰撞
核心的概念
map是entry的集合,乙個key、value就是乙個entry
**j**a在處理hash衝突的時候使用了鍊錶
圖中的0到10號jtnaimhe 的方塊就是entry(鍵值對),如果發生hashcode的衝突,就會像4號方塊那樣,開始向後追加,注意看4號方塊的next的屬性,那個屬性不是null,而是指向了乙個方塊
本文標題: 快速解決hash碰撞衝突的方法小結
本文位址:
解決Hash碰撞衝突方法總結
目錄 開放定址法 線性探測再雜湊 二次探測再雜湊 偽隨機探測再雜湊 再雜湊法 鏈位址法 建立公共溢位區 優缺點 開放雜湊 open hashing 拉鍊法 針對桶鏈結構 封閉雜湊 closed hashing 開放定址法 通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝...
hash,解決hash衝突的方法
數字分析法 平方取中法 除留餘數法 偽隨機數法 線性探測 二次探測 偽隨機數探測 拉鍊探測。如果負載因子是預設的0.75,hashmap 16 的時候,佔16個記憶體空間,實際上只用到了12個,超過12個就擴容。如果負載因子是1的話,hashmap 16 的時候,佔16個記憶體空間,實際上會填滿16...
解決Hash衝突的方法
線性再雜湊法是形式最簡單的處理衝突的方法。插入元素時,如果發生衝突,演算法會簡單的從該槽位置向後迴圈遍歷hash表,直到找到表中的下乙個空槽,並將該元素放入該槽中 會導致相同hash值的元素挨在一起和其他hash值對應的槽被占用 查詢元素時,首先雜湊值所指向的槽,如果沒有找到匹配,則繼續從該槽遍歷h...