雜湊表查詢 雜湊表 知識點

2021-08-01 20:39:10 字數 3328 閱讀 2414

定義

雜湊表查詢步驟

使用雜湊表存在的問題

雜湊函式的構造方法

處理衝突的方法

相比於比較查詢法,雜湊表的查詢是通過計算來進行實現的,我們只需要通過某個函式f,使得儲存位置=f(關鍵字),使得每個關鍵字key對應乙個儲存位置f(key)。這裡我們把這種對應關係f稱為雜湊函式,又稱為雜湊(hash)函式。故採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表(hash table)。關鍵字對應的記錄儲存位置我們稱為雜湊位址。

第一步,儲存時通過雜湊函式計算記錄的雜湊位址,並按此雜湊位址儲存該記錄。

第二步,查詢時通過同樣的雜湊函式計算記錄的雜湊位址,按此雜湊位址訪問該記錄。

因此,雜湊技術既是一種儲存技術,也是一種查詢方法。

計算簡單:雜湊函式的計算時間不應該超過其他查詢技術與關鍵字比較的時間。

直接定址法

取關鍵字的某個線性函式值為雜湊位址,即:f(key)=a*key+b(a、b為常數)數字分析法

採用抽取的方法,使用關鍵字的一部分來計算雜湊儲存位置的方法。通常適用於處理關鍵字位數比較大的情況,如果事先知道關鍵字的分布且關鍵字的若干位分布較均勻,就可以考慮。

平方取中法

假設關鍵字是1234,那麼他的平方就是1522756,再抽取中間的三位就是227,作為雜湊位址。平方取中法比較適合不知道關鍵字的分布,而位數又不是很大的情況。

摺疊法

摺疊法是將關鍵字從左到右分割成位數相等的幾部分(注意最後一部分位數不夠可以短些),然後將這幾部分疊加求和,並按雜湊表表長,取後幾位作為雜湊位址。比如我們的關鍵字是9876543210,雜湊表表長為三位,我們將它分為四組,987|654|321|0,然後將他們疊加求和得1962,再求後3位得到雜湊位址為962,也可以從一端向另一端來回摺疊後對齊相加。比如我們將987和321反轉,再與654和0相加,變成1566,取566作為雜湊位址。

摺疊法適合事先不需要知道關鍵字的分布,但是位數較多的情況。

除留餘數法

此方法為最常用的構造雜湊函式方法。對於雜湊表長為m的雜湊函式公式為:

f(key)=key mod p (p<=m),關鍵在於選擇合適的p。

根據經驗,若雜湊表長為m,通常p為小於或等於表長(最好接近於m)的最小質數或不包含小於20質因子的合數。

隨機數法

選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。也就是f(key)=random(key)。這裡random函式是隨機函式,當關鍵字的長度不等時,採用這個方法構造雜湊函式是比較合適的。

如果關鍵字是字串,可以轉化為ascii碼或者unicode碼來處理

開放定址法
fi(key) = (f(key)+di) mod m (di=1,2,3,……,m-1)

用開放定址法解決衝突的做法是:當衝突發生時,使用某種探測技術在雜湊表中形成乙個探測序列。沿此序列逐個單元地查詢,直到找到給定的關鍵字,或者碰到乙個開放的位址(即該位址單元為空)為止(若要插入,在探查到開放的位址,則可將待插入的新結點存人該位址單元)。查詢時探測到開放的位址則表明表中無待查的關鍵字,即查詢失敗。

比如說,我們的關鍵字集合為,表長為12。 我們用雜湊函式f(key) = key mod 12,當計算前s個數時,都是沒有衝突的雜湊位址,直接存入:

計算key = 37時,發現f(37) = 1,此時就與25所在的位置衝突。

於是我們應用上面的公式f(37) = (f(37)+1) mod 12 = 2。於是將37存入下標為2的位置。這其實就是房子被人買了於是買下一間的作法:

到了 key=48,我們計算得到f(48) = 0,與12所在的0位置衝突了,不要緊,我們f(48) = (f(48)+1) mod 12 = 1,此時又與25所在的位置衝突。於是f(48) = (f(48)+2) mod 12=2,還是衝突……一直到 f(48) = (f(48)+6) mod 12 = 6時,才有空位,機不可失,趕快存入:

我們把這種解決衝突的開放定址法稱為線性探測法

從這個例子我們也看到,我們在解決衝突的時候,還會碰到如48和37這種本來都不是同義詞卻需要爭奪乙個位址的情況,我們稱這種現象為堆積。很顯然,堆積的出現,使得我們需要不斷處理衝突,無論是存入還是查詢效率都會大大降低。

二次探測法

fi(key) = (f(key)+di) mod m (di = 1平方, -1平方, 2平方, -2平凡發,……, q2, -q2, q <= m/2)

我們可以改進di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),這樣就等於是可以雙向尋找到可能的空位置。我們稱這種方法為二次探測法。

隨機探測法

還有一種方法是,在衝突時,對於位移量 di 採用隨機函式計算得到,我們稱之為隨機探測法。

fi(key) = (f(key)+di) mod m (di是乙個隨機數列)

再雜湊函式法

fi(key)=rhi(key) (i=1,2,…,k)

每當發生雜湊位址衝突時,就換乙個雜湊函式計算,這種方法能夠使得關鍵字不產生聚集,相應的也增加了計算的時間。

鏈位址法將所有關鍵字為同義詞的記錄儲存在乙個單鏈表中,我們稱這種表為同義詞子表,在雜湊表中只儲存所有同義詞子表的頭指標。

對於關鍵字集合,我們用前面同樣的12為除數,進行除留餘數法:

公共溢位區法

衝突的關鍵字放在另外乙個單鏈表中,當無法在雜湊表中查詢時,就在溢位表進行順序查詢。

雜湊表知識點Collection

1.劍指offer 50 hashmap hashmapdic new hashmap char sc s.tochararray 若字元c出現第二次,再次put便是false for char c sc dic.put c,dic.containskey c for char c sc get方法...

查詢 雜湊表查詢(雜湊表)

1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...

雜湊表(雜湊表)查詢

雜湊技術是在記錄的儲存位置和它的關鍵字之間建立起乙個確定的對應關係f,使每個關鍵字key對應乙個儲存位置f key f為雜湊函式,又稱雜湊函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間成為雜湊表 雜湊表。直接用key值的某個線性函式當位址。f key a key b 簡單,不...