研究雜湊(Hashing)演算法的體會

2021-05-23 14:32:49 字數 950 閱讀 5783

雜湊,雖然只支援二叉查詢樹所允許的一部分操作,但是雜湊具有以常數平均時間執行插入、刪除和查詢的特點。

為了解決雜湊衝突問題,普遍存在兩種方式,

分離鏈結法(separate chaining),其做法是將雜湊到同乙個位置的元素以乙個鍊錶的方式儲存。通常產生衝突的元素被插入到鍊錶的最前面,這樣不僅方便,而且由於最後插入的元素最有可能不久再使用,這樣在查詢起來效率會增加。分離鏈結實現簡單,但是雙向鍊錶會占用額外的記憶體,衝突嚴重時,查詢效率也會嚴重下降。

探測雜湊表(probing hash tables),其做法是發生衝突時,嘗試使用其他的單元,知道找到空閒的單元為止。因為要確保所有的元素都能插入到表中,所需要的表要比分離鏈結法的表大,其裝填因子應該低於λ=0.5。

探測雜湊表又有三種解決衝突的方法,一種是線性探測,即逐個探測f(i)=i。優點是演算法簡單,缺點是存在"一次聚集"問題(primary clustering)。另一種是平方探測,即f(i)=i2。對於平方探測,表的大小是素數,那麼當表至少有一半是空的時候,總能插入乙個新的元素。雖然平方探測排除了一次聚集,但是雜湊到同一位置上的那些元素將探測相同的備菜單元,即"二次聚集"(secondary clustering)。最後一種是雙雜湊(double hashing),一種流行的選擇是f(i)=i*hash2(x)。這個公式表明需要用到第二個雜湊函式用來解決衝突。諸如hash2(x)=r-(x mod r),r是小於tablesize的素數這樣的函式將起到良好的作用,它可以盡可能做到在第一次雜湊到同樣單元的元素,第二次雜湊到不同的其他元素上,即使會發生最壞的情況,但是非常少。

研究雜湊演算法讓我聯絡到另外乙個應用,就是產生不重複的隨機數,例如卡管理系統。都需要產生不規則的隨機數作為卡號或密碼,記得遇到乙個類似的系統是通過產生可以重複的隨機數(20位左右),利用資料庫唯一索引檢查,避免出現重複。不過執行時間長後,由於資料量越來越大,執行效率低的可怕。現在想起來,其實就是乙個解決插入衝突的問題,分段的hashing演算法就是乙個解決辦法不是。

雜湊(Hashing) 的基本概念

查詢的次數降低到常數級別。即事先知道要查詢的資料項應該出現在什麼位置。雜湊表 hash table,雜湊表 表中的每乙個儲存位置,成為槽 slot 可以用來儲存資料項,每個槽有乙個唯一的名稱。有利於快速的查詢定位。雜湊函式 實現從資料項到儲存槽名稱的轉換的函式。常用的雜湊方法是求餘數,將資料項除以雜...

雜湊演算法的原理

用乙個比喻來說明什麼是雜湊演算法 假設有n只小豬,它們的體重各不相同,一開始我們把它們放在乙個豬圈裡面。如果想尋找其中某只小豬,只能乙個乙個的找,很耗時間。現在我們用雜湊演算法的思想來管理小豬,我們按照小豬的體重來分豬圈 體重當然不能精確到毫克級別,那樣就要分n個豬圈,費用太高。我們考慮到公斤級別級...

hashmap的雜湊演算法

static final int hash object key int h return key null 0 h key.hashcode h 16 三元運算子 條件表示式?表示式1 表示式2 按位異或運算,只要位不同結果為1,不然結果為0 右移 右邊的位被擠掉,右移一位其值相當於除以2。如圖,...