Hash表分析基礎

2021-09-02 02:50:46 字數 2142 閱讀 3051

剛剛開始研究資料結構,看的頭大,這裡簡單總結下這兩天學習hash表的結果!各位看官請輕拍!

對於查詢來說,一般來說使用的是關鍵字查詢,關鍵字越特別,查詢的結果越準確。那麼我們在設計乙個查詢表時,關鍵字和查詢方式就是最重要的兩個部分。

雜湊表,又稱為雜湊表,按照資料表中每乙個記錄的關鍵字k對其進行儲存,在理想情況下,通過雜湊函式h在關鍵字與位址之間建立起一一對應的關係,那麼查詢時只需要進行一次計算即可。但是當出現不同的關鍵字對應同乙個儲存位址,即k1≠k2,但是h(k1)=h(k2),那麼這種情況就稱為衝突。把這種具有不同關鍵字值而具有相同雜湊位址的物件稱為「同義詞」。

在構造雜湊表時,需要解決的兩個問題就是:

1.如何設計雜湊函式,使得衝突盡可能少

2.發生衝突後如何解決

hash函式的構造方法:

1.直接定址法

是以關鍵字本身k或者是關鍵字加上某乙個數值常量c作為雜湊位址。

h(k)=k+c

這種雜湊函式計算簡單,並且不可能有衝突發生,當關鍵字的分布基本連續時,可以用直接定址法。若關鍵字的分布不連續,直接定址法將造成記憶體單元的大量浪費。

2.除留餘數法

取關鍵字k除以雜湊表長度m,所得餘數作為雜湊位址。

h(k)=k%m

這是一種比較簡單,也比較常見的構造方法。這種方法的關鍵是選好雜湊表的長度m,使得資料集合中的每乙個關鍵字通過函式轉化後對映到雜湊表上的任意位址的概率相等。在m取素數時,發生衝突的可能性小。

3.平方取中法

取關鍵字的平方後的中間幾位作為雜湊位址。

4.摺疊法

這種方法適合在關鍵字位數較多,且位址區間較小的情況下。將關鍵字分隔成數字相同的幾部分,然後將這幾部分的疊加和作為雜湊位址,若超出範圍可再取模。

5.數值分析法

如果事先知道所有可能的關鍵字的取值,那麼就可以對通過對關鍵字的分析,發現其變化規律,從而構造出相應的雜湊函式,得到雜湊位址。

6.隨機數法:

對長度不等的關鍵字構造雜湊函式。

hash表處理衝突的方法:

處理衝突就是為該關鍵字找到乙個另乙個「空」的雜湊位址。

1.開放定址法

當發生衝突時,形成乙個位址序列,沿著這個序列逐個探測,直到找到乙個「空」的開放位址,將發生衝突的關鍵字值存放到該位址中去。

如  hi=(h(k)+d(i))%m  i=1,2,...,k  (k

其中h(k)為雜湊函式,m為雜湊表的長度,d(i)為增量函式,d(i)=d1,d2,...,dn-1。

根據增量函式的取法不同,可以得到不同的開放定址處理衝突探測方法。

(1)線性探查法

從發生衝突的位址(設為d)開始,依次探查:d+1,d+2,...d+m-1,當探查到表位m-1時,又從0開始探查,直到找到乙個空閒的位置來存放發生衝突的關鍵字。

若整個位址都找遍,仍沒有空位址,則產生溢位。

線性探測法的數序遞推公式為:

d0=h(k)

...d(i)=(d(i-1)+1)%m,直到找到乙個空位址。

利用線性探查法處理衝突容易造成關鍵字的「堆積」問題。這是因為當連續n個單元被占用後,再雜湊到這些單元上的關鍵字和直接雜湊到後面乙個空閒單元上的關鍵字都要占用這個空閒單元,致使該空閒單元很容易被占用,從而發生非同義衝突,造成平均查詢長度的增加。

為了克服堆積問題,則可用下面這個方法

(2)平方探查法

其數學公式為:

d0=h(k)

...d(i)=(d0+i^2)%m

平方探查法可以避免出現堆積問題,但缺點是無法探查到雜湊表上的所有單元,但至少能探查到一半單元。

若解決衝突時,探查到一半單元仍然找不到乙個空閒單元,則表明此雜湊表太滿,需要重現建立雜湊表。

2.鏈位址法

把所有關鍵字為同義詞的記錄儲存在乙個線性鍊錶中,這個鍊錶稱為同義詞鍊錶,並將這些鍊錶的表頭放在陣列中(下標從0到m-1)。

鏈位址法雖然要多費一些儲存空間,但可以徹底解決堆積問題,大大提高查詢效率。

Hash表基礎知識

1.1 除法hash表 h k k mod m,這裡m不應該是2的p冪次,否則對m取模等價於取k的低p位,除非k的低p位足以區分各個記錄。當k 是乙個按基數 2 p解釋的字串時,選 m 2 p 1 不好,因為對 k的各個字元進行排列並不會改變其雜湊值.m的選擇應該取與2的整數冪不太接近的質數。1.2...

hash表 hash演算法

概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...

Hash表和Hash衝突

hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。hash函式有多種構造方法,常見的有直接...