最近在搞通訊協議,感覺要加強一下雜湊表和雜湊桶的學習,把學習的內容通俗的表達出來,也和大家分享一下,讓新入門的童鞋很快理解。
我們都學過函式,三要素:自變數x,因變數y,對應關係f。
在函式裡x、y通過對映關係f一一對應。
那什麼是雜湊呢?
就是記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f,這裡我們就可以吧這種對應關係f稱之為雜湊(hash)函式。
那雜湊表呢?
採用雜湊函式將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間就稱之為雜湊表(hash table)
看到這你應該是明白定義了吧。
當然雜湊表不僅可以用來儲存,更是可以用來查詢,效率是很高的,因為一一對應嘛!雜湊表的建立的關鍵是雜湊函式的構建,也就是如何形成key和value的對應。
理想情況當然是一一對應的關係最好,但是顯示情況是,難免碰到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...