雜湊表(hash table)通過將關鍵碼對映到表中的某個位置來儲存元素,然後根據關鍵碼用同樣的方式進行直接訪問
理想的搜尋方法是可以不經過任何比較,一次直接從表中得到要搜尋的元素。如果構造一種儲存結構,使元素的儲存位置與它的關鍵碼之間建立乙個確定的對應函式關係hash(),那麼每個元素關鍵碼與結構中的乙個唯一的儲存位置相對應:
在插入時,根據待插入元素的關鍵碼,以此函式計算出該元素的儲存位置並按此位置進行存放。在搜尋時,對元素的關鍵碼進行同樣的計算,把求得的函式值當做元素的儲存位置,在結構中按此位置取元素比較,若關鍵碼相等,則搜尋成功。該方式即雜湊方法(hash method),在雜湊方法中使用的轉換函式叫雜湊函式(hash function),構造出來的結構叫雜湊表(hash table)。
設雜湊表中允許的位址數為m,取乙個不大於m,但最接近或者等於m的質數p作為除數。
雜湊函式為:hash(key) = key % p p<=m,將關鍵碼轉換成雜湊位址。
為什麼要取質數(素數)呢?減小雜湊衝突發生的概率
如果n=13, 比如n=12,
g=4, f(g,x)=g*x mod n,則 g=4, f(g,x)=g*x mod n
4*1 mod n = 4
4*1 mod n = 4
4*2 mod n = 8
4*2 mod n = 8
4*3 mod n = 0
4*3 mod n = 12
4*4 mod n = 4
4*4 mod n = 3
4*5 mod n = 8
4*5 mod n = 7
4*6 mod n = 0
4*6 mod n = 11
4*7 mod n = 4
4*7 mod n = 2
4*8 mod n = 8
4*8 mod n = 6
4*9 mod n = 0
4*9 mod n = 10
4*10 mod n = 4
4*10 mod n = 1
4*11 mod n = 8
4*11 mod n = 5
4*12 mod n = 9
設有n個d位數,每一位可能有r種不同的符號,這r種不同的符號在各位上出現的頻率不一定相同,可能在某些位上分布比較均勻,每種符號出現的機會均等,在某些位上分布不均勻只有某幾種符號經常出現。可根據雜湊表的大小,選擇其中各種符號分布均勻的若干位作為雜湊位址。
數字分析法通常適合處理關鍵字位數比較大的情況,如果事先知道關鍵字的分布且關鍵字的若干位分布較均勻的情況。
假設關鍵字是1234,那麼它的平方就是1522756,再抽取中間的3位就是227作為雜湊位址;再比如關鍵字是4321,那麼它的平方就是18671041,抽取中間的3位就可以是671或者710用作雜湊位址。
平方取中法比較適合:不知道關鍵字的分布,而位數又不是很大的情況。
摺疊法是將關鍵字從左到右分割成位數相等的幾部分(注意:最後一部分位數不夠時可以短些),然後將這幾部分疊加起來。有兩種疊加方法:
假定關鍵碼為:key = 23938587841,若儲存空間限定3位,則劃線結果為每段三位:
239 | 385 | 878 | 41
把超出位址位數的最高位刪去,僅保留3位。
選擇乙個隨機函式,取關鍵字的隨機函式值為它的雜湊位址,即h(key) = random(key),其中random為隨機數函式,通常應用於關鍵字長度不等時採用此法。
對於兩個資料元素的關鍵字ki和kj(i != j),有ki != kj(i != j),但hashfun(ki)== hashfun(kj),將該種現象稱為雜湊衝突或雜湊碰撞。把具有不同關鍵碼而具有相同雜湊位址的資料元素稱為「同義詞」,由同義詞引起的衝突稱為同義詞衝突。
閉雜湊也叫開位址法。
設雜湊表的編址為0到m-1,當新增關鍵碼key時通過雜湊函式hash(key)計算key的存放位置,但在存放時發現這個桶已經被另乙個keyx佔據了,即發生雜湊衝突。如果表未被裝滿,表示在給定的範圍內必然還有空位置,則可以把key存放到表中「下乙個」空位中。
簡而言之:一旦發生衝突,就去尋找下乙個空的雜湊表位址,只要雜湊表足夠大,空的雜湊位址總能找到。
線性探查
設給出一組元素,它們的關鍵碼為:37,25,14,36,49,68,57,11,雜湊表為ht[12],表的大小m =12,假設採用hash(x) = x % p; // (p = 11) 11是最接近m的質數,就有:
雜湊情況統計:
要雜湊關鍵碼
3725
1436
4968
5711
初始桶號43
3352
20衝突桶號--
3,43,4,5
5,6-
2,3,4,5,6,7
-最後存入桶號43
5672
80探查次數11
3431
71二次探查
使用二次探查法,在表中尋找「下乙個」空位置的公式為:
hi = (h0 + i^2)%m, hi = (h0 - i^2)%m, i = 1,2,3…,(m-1)/2
h0是通過雜湊函式hash(x)對元素的關鍵碼x進行計算得到的位置,m是表的大小。
假設陣列的關鍵碼為37,25,14,36,49,68,57,11,假設取m=19,這樣可設定為ht[19],採用雜湊函式
雜湊情況統計:
要雜湊關鍵碼
3725
1436
4968
5711
初始桶號186
1417
1111011
衝突桶號--
---11
-11,12
最後存入桶號186
1417
1112010
探查次數11
1112
13雙雜湊法
使用雙雜湊方法,需要兩個雜湊函式。第乙個雜湊函式hash()按關鍵碼key計算其所在的位置h0 =hash(key)。一旦發生衝突,利用第二個雜湊函式rehash()計算該key到達「下乙個」桶的位移,它的取值與key的值有關,要求它的取值應該是小於位址空間大小tablesize,且與tablesize互質的正整
數。 若設表的長度為m = tablesize,則在表中尋找「下乙個」桶的公式為:
j = h0 = hash(key),p = rehash(key); j = (j+p)%m;
p是小於m且與m互質的整數。
開雜湊法又叫鏈位址法(開鏈法)。
開雜湊法首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點組成乙個向量,因此,向量的元素個數與可能的桶數一致。
設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht[12],表的大小為12,雜湊函式為hash(x)= x % 11
捋一捋這HTML Day19
實話說,我曾經不止一次的看到過w3school,而這樣系統的去看確實從來沒有過,它這簡單到有些粗糙的頁面實在讓我提不起太多興趣,於是就這麼一再錯過。也是一時心血來潮,也是了解了w3shool到底是什麼,這才想到要來學一下的,可這一看,才發現原來這是多大的一處藏寶處,它簡單 樸實 配合著例項講解,把乙...
Quick Cocos2d x 捋一捋框架流程
比如很多學習者甚至不知道enterscene mainscene 為什麼裡面可以是個字串?當然如果你已經很熟悉框架了,這篇文章就可以跳過了,呵呵。下面開始吧!一 前置準備 2 關於ide,我使用的ieda,配置匯出的api 提示,還是挺方便的。二 新建乙個工程 1 require new run 1...
捋一捋DDR記憶體相關的各種頻率
首先引用 計算機維修技術 第2版 isbn 978 7 302 20508 1中對記憶體的定義 將直接與cpu進行資料交換的儲存器稱為 內部儲存器 簡稱為記憶體 不能直接與cpu進行資料交換的儲存器稱為 外部儲存器 簡稱為外存 文中的 記憶體 一詞特指 採用dram晶元構成的主要儲存系統,它由安裝在...