文章出處:
線性雜湊是一種動態擴充套件雜湊表的方法。
線性雜湊的數學原理:
假定key = 5 、 9 、13
key % 4 = 1
現在我們對8求餘
5 % 8 = 5
9 % 8=1
13 % 8 = 5
由上面的規律可以得出
(任意key) % n = m
(任意key) %2n = m或 (任意key) %2n = m + n
線性雜湊的具體實現:
我們假設初始化的雜湊表如下:
**點桶編號
桶中已儲存的key
溢位key*0
4,8,12
15,926
37,11,15,19, 23
figure1
為了方便敘述,我們作出以下假定:
1:為了使雜湊錶能進行動態的**,我們從桶0開始設定乙個**點。
2:乙個桶的容量為listsize = 5,當桶的容量超出後就從**點開始進行**。
3:hash函式為 h0 = key %4 h1 = key % 8,h1會在**時使用。
4:整個表初始化包含了4個桶,桶號為0-3,並已提前插入了部分的資料。
**過程如下:
現在插入key = 27
1:進行雜湊運算,h0 = 27 % 4 = 3
2:將key = 27插入桶3,但發現桶3已經達到了桶的容量,所以觸發雜湊**
3:由於現在**點處於0桶,所以我們對0桶進行分割。這裡需要注意雖然這裡是3桶滿了,但我們並不會直接從3桶進行分割,而是從分割點進行分割。這裡為什麼這麼做,在下面會進一步介紹。
4:對分割點所指向的桶(桶0)所包含的key採用新的hash函式(h1)進行分割。
對所有key進行新雜湊函式運算後,將產生如下的雜湊表
**點桶編號
桶中已儲存的key
溢位key08
*15,9263
7,11,15,19, 23274
4,12
figure2
5:雖然進行了**,但桶3並不是**點,所以桶3會將多出的key,放於溢位頁.,一直等到桶3進行**。
6:進行**後,將**點向後移動一位。
一次完整的**結束。
key的讀取:
採用h0對key進行計算。
如果算出的桶號小於了**點,表示桶已經進行的**,我們採用h1進行hash運算,算出key所對應的真正的桶號。再從真正的桶裡取出value
如果算出的桶號大於了**點,那麼表示此桶還沒進行**,直接從當前桶進行讀取value。
說明:
1:如果下一次key插入0、1、2、4桶,是不會觸發**。(沒有超出桶的容量)如果是插入桶3,使用者在實現時可以自己設定,可以一旦插入就觸發,也可以等溢位頁達到listsize再觸發新的**。
2:現在0桶被**了,新資料的插入怎麼才能保證沒**的桶能正常工作,已經**的桶能將部分插入到新**的桶呢?
只要**點小於桶的總數,我們依然採用h0函式進行雜湊計算。
如果雜湊結果小於**號,那麼表示這個key所插入的桶已經進行了分割,那麼我就採用h1再次進行雜湊,而h1的雜湊結果就這個key所該插入的桶號。
如果雜湊結果大於**號,那麼表示這個key所插入的桶還沒有進行**。直接插入。
這也是為什麼雖然是桶3的容量不足,但**的桶是**點所指向的桶。如果直接在桶3進行**,那麼當新的key插入的時候就不能正常的判斷哪些桶已經進行了**。
3:如果使用分割點,就具備了無限擴充套件的能力。當分割點移動到最後乙個桶(桶3)。再出現**。那麼分割點就會回到桶0,到這個時候,h0作廢,h1替代h0, h2(key % 16)替代h1。那麼又可以開始動態分割。那個整個初始化狀態就發生了變化。就好像沒有發生過**。那麼上面的規則就可以迴圈使用。
3:線性雜湊的**中是按上面的規則來進行**的。其實我們可以安裝自己的實際情況來進行改動。
假如我們現在希望去掉分割點,一旦哪個桶滿了,馬上對這個桶進行分割。
可以考慮了以下方案:
1:為所有桶增加乙個標誌位。初始化的時候對所有桶的標誌位清空。
2:一旦某個桶滿了,直接對這個桶進行分割,然後將設定標誌位。當新的資料插入的時候,經過雜湊計算(h0)發現這個桶已經**了,那麼就採用新的雜湊函式(h1)來計算**之後的桶號。在讀取資料的時候處理類似。
Linear hashing 線性雜湊表
section 1 問題描述 分布式或並行資料儲存資料結構的設計 1 需要具有良好的擴充套件性 scalability 能夠支援大規模資料儲存 2 不允許在不同資料節點上產生資料分布不均衡的問題,即避免產生 hotspot nodes 3 在儲存資料增加或者縮減的情況下能夠動態的儲存分配空間 在這樣...
線性之雜湊表
資料結構實驗之查詢七 線性之雜湊表 time limit 1000 ms memory limit 65536 kib submit statistic problem description 根據給定的一系列整數關鍵字和素數p,用除留餘數法定義hash函式h key key p,將關鍵字對映到長度...
雜湊 線性探測法
time limit 1 secs,memory limit 256 mb 使用線性探測 法 linear probin g 可以解決雜湊中的衝突問題,其基本思想是 設雜湊函式為 h key d,並且假定雜湊的儲存結構是迴圈陣列 則當衝突發生時 繼續探測 d 1,d 2 直到衝突得到解決 例如,現有...