雜湊表入門 雜湊桶簡介

2021-10-08 18:32:39 字數 1856 閱讀 9748

最近在搞通訊協議,感覺要加強一下雜湊表和雜湊桶的學習,把學習的內容通俗的表達出來,也和大家分享一下,讓新入門的童鞋很快理解。

我們都學過函式,三要素:自變數x,因變數y,對應關係f。

在函式裡x、y通過對映關係f一一對應。

那什麼是雜湊呢?

就是記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f,這裡我們就可以吧這種對應關係f稱之為雜湊(hash)函式

那雜湊表呢?

採用雜湊函式將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間就稱之為雜湊表(hash table)

看到這你應該是明白定義了吧。

當然雜湊表不僅可以用來儲存,更是可以用來查詢,效率是很高的,因為一一對應嘛!雜湊表的建立的關鍵是雜湊函式的構建,也就是如何形成keyvalue的對應。

理想情況當然是一一對應的關係最好,但是顯示情況是,難免碰到f(key1)=f(key2),我們稱之為衝突,key1同key2我們可以稱為同義詞所以構建雜湊函式,處理衝突也就是很關鍵的事情了。

這裡簡單介紹幾個,但不做深入**,有興趣的童鞋可以自行查詢學習。

1、直接定址法

f(key)=a*key+b

即取關鍵字的某個線性函式作為雜湊(雜湊)位址;但我們需要知道關鍵字的分布,現實情況很少用。

2、數字分析法

對於剛剛入學的童鞋都會有個學號,而前幾位肯定相同,後面幾位每個人都不同,這時(不用)分析便可知道,抽取後面幾位,對這些數字進行操作,使之不相同,總而言之就是提供乙個雜湊函式,能夠讓關鍵字分配到雜湊表中去。

3、平方取中法

也就是說將數字平方,取中間幾位作為關鍵字。

4、除數取餘法

假如你有n個數字

f(key)=key%p(p=key01

2345

6789

1011

value

1225

3815

1629

7867

5621

2247

這裡p=12,嘿嘿嘿。

5、隨機數法

f(key)=random(key)

就是用了random函式

額還有很多不寫了。

然而事實情況是:構建這樣的函式很難,所以要去解決這種衝突

也就是解決key1不等於key2,但f(key1)=f(key2)。

方法不少,列舉一下吧,就不細說了,有興趣的童鞋自行搜尋學習。

1、開發定址法 2、再雜湊函式法 3、鏈位址法

實際上雜湊桶是解決雜湊表衝突的一種方法。

雜湊表中同乙個位置可能存有多個元素,為應對雜湊衝突問題,將雜湊表中的每個位置表示乙個雜湊桶

key被hash(…)到相同的孔,那麼如何解決衝突呢 就是在那個孔放乙個鍊錶

這個孔下面的鍊錶就跟個桶一樣盛著元素。也就是鏈位址法。

我們可以把每個key的位置看作是乙個指標,該指標所指向的位置裡放了乙個鍊錶,可以認為是指標陣列,故該方法也叫開鏈式。

**實現:

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

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

C 開雜湊雜湊表(雜湊桶)

開雜湊概念 開雜湊法又叫鏈位址法 開鏈法 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表連線起來,各鍊錶的頭結點儲存在雜湊表中。開雜湊中每個桶中放的都是發生雜湊衝突的元素。節點定義 template class v s...

雜湊錶開雜湊雜湊桶實現

開雜湊法對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點組成 乙個向量,因此,向量的元素個數與可能的桶數一致。include using namespace std namespace openhas...