演算法導論 第十一章 雜湊表 學習筆記

2021-08-19 14:18:06 字數 3641 閱讀 4150

雜湊表(hash table)是實現字典操作的一種有效資料結構。儘管在最壞的情況下,在雜湊表中的查詢乙個元素的時間與鍊錶中查詢的時間相同,為o(

n)o (n

)。在一下合理的假設下,在雜湊表中查詢乙個元素的時間複雜度為o(

1)o (1

)。在雜湊表中不是直接把關鍵字作為陣列的下標,而是根據關鍵字計算出相應的下標。

當關鍵字的全域

u u

比較小時,直接定址法是簡單而有效的。設u=

0,1,

2,…,

m−1' role="presentation" style="position: relative;">u=0

,1,2

,…,m

−1u=

0,1,

2,…,

m−1,且假設任意兩個元素不具有相同的關鍵字。則陣列的大小應為m。

直接定址技術的顯著缺點是:如果全域

u u

非常大,則在一台標準的計算機可用記憶體中,要儲存大小為|u

|' role="presentation" style="position: relative;">|u|

|u|的一張表

t t

非常不現實。並且,實際儲存的關鍵字集合

k' role="presentation" style="position: relative;">kk相對

u u

來說也許很小。這樣分配給

t' role="presentation" style="position: relative;">t

t的空間就大部分被浪費了。

雜湊錶即:利用雜湊函式(hash function)h(

k)h (k

),有關鍵字

k k

計算出槽的位置,函式

h' role="presentation" style="position: relative;">h

h將關鍵字的全域

u u

對映到雜湊表(hash table)的槽位上。

存在問題:兩個關鍵字可能會對映到同乙個槽中,這叫衝突。如何解決這種衝突?

盡量避免衝突:試圖選擇乙個雜湊函式能避免衝突或使衝突次數最小化。實際上,雜湊這個術語的原意就是隨機混雜和拼湊,即體現了這種思想。

完全避免衝突幾乎是不可能的,所以還是需要有解決衝突的辦法

鏈結法開放定址法

鏈結法操作的時間複雜度:

插入hash_insert(t,x):在煉表表頭進行插入o(1),前提是假設插入的元素沒有出現在表中。否則需要先查詢。

刪除hash_delete(t,x):o(1),前提是假設鍊錶為雙向鍊錶(這裡沒看懂,為什麼雙向鍊錶可以不用在t中找x?)。否則需要先找到x的前驅節點,這樣複雜度就等同於查詢的複雜度。

查詢hash_search(t,k):定義t的裝載因子為α=

n/m' role="presentation" style="position: relative;">α=n

/mα=

n/m,即乙個鍊錶的平均儲存元素個數。則查詢操作的時間複雜度由兩部分組成:

所以查詢操作的時間複雜度為θ(

1+α)

θ (1

)。這意味著,如果雜湊表中槽數至少與表中的元素個數成正比,則查詢操作平均也只需要常數的時間——o(

1)o (1

)思考:

演算法導論練習題:11.2-3

題目:對鍊錶法進行改進,保證鍊錶有序,則雜湊效能能得到較大的提高。試分析這種改動對成功查詢、失敗查詢、插入和刪除的執行時間各有什麼影響?

除法雜湊法

乘法雜湊法

全域雜湊法

所有元素都存放在雜湊表裡,也就是說每個表項或包含動態集合中的乙個元素,或包含nil。當查詢某個元素時,要系統的檢查所有的表項,直到找到所需元素,或最終查明改元素不在表中。與鍊錶法不一樣,這裡既沒有鍊錶,也沒有元素存放在雜湊表以外,因此開放定址法中,雜湊表可能會被填滿,且導致裝載因子

α α

一定不超過1。

因為不用儲存指標,所以用鍊錶法儲存指標的空間在這裡可以用來儲存元素,即用相同的空間儲存了更多的元素槽,潛在的減少了衝突提高了檢索速度。

線性探查h(

k,i)

=(h′

(k)+

i)mo

dm,i

=0,1

,...

,m−1

h (k

,i)=

(h′(

k)+i

)mod

m,i=

0,1,

...,

m−

1存在一次集群現象,隨著連續被占用的槽不斷增加,平均查詢時間也不斷增加。當乙個空槽前有i個滿的槽時,該空槽為下乙個將被占用的概率是(i

+1)/

m (i+

1)/m

。二次探查h(

k,i)

=(h′

(k)+

c1i+

c2i2

)mod

m h(k

,i)=

(h′(

k)+c

1i+c

2i2)

modm

同樣存在二次集群現象,但程度較輕。

雙重雜湊h(

k,i)

=(h1

(k)+

ih2(

k))m

odm h(k

,i)=

(h1(

k)+i

h2(k

))mo

dm

開放定址法分析

像在鍊錶法中一樣,開放定址法的分析也是以雜湊表的裝載因子

α α

來表達的。

定理11.6給定乙個裝載因子為α=

n/m<

1 α=n

/m

<

1的開放定址雜湊表,並假設是均勻雜湊的,則對於每一次不成功的 查詢,其期望探查次數至多為1/

(1−α

) 1/(

1−α)

定理11.8給定乙個裝載因子為α=

n/m<

1 α=n

/m

<

1的開放定址雜湊表,並假設是均勻雜湊的,則對於每一次成功的 查詢,其期望探查次數至多為1α

ln11

−α1 αl

n11−

α。

定理11.7假設採用的是均勻雜湊,平均情況下,向乙個裝載因子為

α α

的開放定址雜湊表中插入乙個元素至多需要1/

(1−α

) 1/(

1−α)

次探查。

當關鍵字是靜態(即關鍵字集合一旦存入後就不改變)時,完全雜湊技術也能提供出色的最壞情況效能,如果用該方法進行查詢,能在最壞情況下用o(

1)o (1

)次訪問完成。

演算法導論學習筆記 第十一章 雜湊表

第十一章 雜湊表總結 這一章講了直接定址表和雜湊表,並介紹了一些雜湊函式等。1.直接定址表 直接將關鍵字作為陣列下標。複雜度 o 1 2.雜湊表 k h k 降低了空間開銷,會產生碰撞,解決碰撞的簡單方法是鏈結法。對鏈結法雜湊,平均情況下,複雜度也是 o 1 3.雜湊函式 1 除法雜湊法 h k k...

演算法導論 第十一章 雜湊表

當將乙個域u中的元素對映到乙個雜湊表t中時,我們如何對映?若對映到同一位置怎麼辦?前乙個問題我們通過hash函式來解決,後乙個問題我們通過 衝突處理 解決。1 除法 h k k mod m m的選取 素數,且不要太靠近 2的冪次方 2 乘法 其中,0 eg 當m 8 2 3,w 7時 3 全域雜湊 ...

演算法導論 第十一章 雜湊表

演算法導論 第十章 雜湊表 雜湊表大概就是把給每個要儲存的資料都用雜湊函式給定乙個關鍵字,對應到乙個槽。由於不同的資訊可能對應同樣的關鍵字,也就是說對應同乙個槽,這時要解決其衝突,解決衝突可以用鏈結法,和開放定址法。對於鏈結法,其對於衝突採取鍊錶進行解決,這樣就保證了資料不會發生衝突。其查詢的平均時...