雜湊搜尋(多次探測,雜湊桶)

2021-08-20 23:54:18 字數 884 閱讀 4794

為什麼提出雜湊?

順序搜尋和二叉樹搜尋中,元素儲存位置和元素關鍵碼之間沒有聯絡。因此在查詢乙個資料時,必須經過關鍵碼的多次比較,搜尋效率取決於比較次數。而乙個理想的搜尋是不經過比較,直接拿出資料,建立關鍵碼和儲存位置的關係。

雜湊衝突的產生與解決

不同的關鍵碼通過相同的雜湊函式計算出相同的位址,產生衝突。

因此在設計雜湊函式時,要盡量避免衝突,而衝突是不可完全避免的。

常用hash函式:

直接定址法, hash = key*a + b,需要事先知道關鍵字分布。

除留餘數法, hash = key % p,p是最接近關鍵字個數的最大質數。

平方取中法,適合位數不大,不知道關鍵字分布的情況。

摺疊法,適合位數較大。

而處理hash衝突有兩種解決方案,閉雜湊和開雜湊。

當hash表中未存滿時,就可將資料存入下乙個空位。

尋找空位的兩種方式:

從衝突的位置開始,逐次+1向後尋找空位置,直至遍歷一遍未找到空位置。

缺陷:乙個衝突引起後面的關鍵碼都後移衝突,形成堆積。

從衝突位置開始,每次加 i^2 個位置,i是衝突的第幾次。

負載因子α:元素個數 / 雜湊表長度,a超過0.8導致衝突可能性大

具體實現需要置三個狀態位

刪除:在雜湊桶中不斷判斷值是否相等進行刪除

和多次探測比較,在多執行緒環境下只需要對每個桶進行互斥鎖,減小鎖競爭。

雜湊md5:衝突概率小,不可逆,字串得到的雜湊值定長

雜湊(二)雜湊桶

雜湊桶又被稱作開鏈法,開雜湊法。相比於閉雜湊法雜湊桶更為靈活直觀,存資料時不會浪費空間,開雜湊法存資料時由於避免雜湊衝突,總會有百分之三十的空間浪費,當儲存空間很大時將會造成大量的浪費。同時開雜湊法造成雜湊衝突時不便於查詢資料。所以我們有了雜湊結構中的雜湊桶。雜湊桶與開雜湊法一樣的是需要開一段陣列用...

雜湊拉鍊法(雜湊桶)

昨天寫了雜湊的開放定址法的部落格,今天我們要說的是拉鍊法,還有乙個名字叫雜湊桶。雜湊桶要做的就是,之前我們用的開放定址法,通過將資料對映到陣列中來實現雜湊。這裡每個陣列的位置只能存放乙個資料,如果衝突的話會繼續往下找找到空的位置然後放進去,但是其實大家都能感覺出來上乙個 很簡單,也很扯,感覺實現起來...

HashTable雜湊表 雜湊表(雜湊桶)

處理雜湊衝突的開鏈法 拉鍊法 雜湊桶 使用素數做雜湊表的長度,可以降低雜湊衝突 素數表size t getnextprime size t num 素數表 雜湊桶的節點的定義 template struct hashnode 在插入前檢查容量,以及負載因子。不夠就進行增容,按素數表進行增,以減小雜湊...