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

2021-07-25 20:23:09 字數 1519 閱讀 2136

雜湊表是實現字典操作的一種有效資料結構。雜湊表是普通陣列概念的推廣,由於對普通陣列可以直接定址,使得能在o(1)時間內訪問陣列中的任意位置。如果儲存空間允許,我們可以提供乙個陣列,為每個可能的關鍵字保留乙個位置,以利用直接定址技術的優勢。當實際儲存的關鍵字數目比全部的可能關鍵字總數要小時,採用雜湊表就成為直接資料定址的一種有效替代,因為雜湊表使用乙個長度與實際儲存的關鍵字數目成比例的資料來儲存。在雜湊表中,不是直接把關鍵字作為陣列的下標,而是根據關鍵字計算出相應的下標。

直接定址表(direct address table)就是陣列。

direct-address-search(t, k)

return t[k]

direct-address-insert(t, x)

t[x, key]=x

direct-address-delete(t, x)

t[x, key]=null

上述的每乙個操作都只需要o(1)的時間。

對於某些應用,直接定址表本身就可以存放動態集合中的元素。也就是說,並不把每個元素的關鍵字及其衛星資料都放在直接定址表外部的乙個物件中,再由表中某個槽的指標指向該物件,而是直接把該物件存放在表的槽中,從而節省了空間。我們使用物件內的乙個特殊關鍵字來表明該槽為空值。

直接定址技術的缺點是非常明顯的:如果全域u很大,則在一台標準的計算機可用記憶體容量中,要儲存大小為|u|的一張表t也許不太實際,甚至是不可能的。還有,實際儲存的關鍵字集合k相對u來說可能很小,使得分配給t的大部分空間都被浪費掉。這個時候,雜湊表需要的儲存空間比直接定址表要少得多。

在直接定址方式下,具有關鍵字k的元素被存放在槽k中,在雜湊方式下,該元素存放在槽h(k)中,即利用雜湊函式(hash function)h,由關鍵字k計算出槽的位置。

兩個關鍵字對映到同乙個槽中稱為衝突。但我們可以找到有效的方法來解決衝突。

在鏈結法中,把雜湊到同一槽中的所有元素都放在乙個鍊錶中。槽j中有乙個指標,它指向儲存所有雜湊到j的元素的鍊錶的表頭,如果不存在這樣的元素,則槽j中為null。

chain-hash-insert(t, x)

insert x at the head of list t[h(x, key)]

chain-hash-search(t, k)

search for an element with key k in list t[h(k)]

chain-hash-delete(t, x)

delete x from the list t[h(x, key)]

在開放定址法(open addressing)中,所有的元素都存放在雜湊表中。每個表項或包含動態集合的乙個元素,或包含null。當查詢某個元素時,腰息痛的檢查所有的表項,知道找到所需的元素,或者最終查明該元素不在表中。在開放定址法中,雜湊表可能會被填滿,以至於不能查如任何新的元素。該方法導致的乙個結果便是裝載因子α絕對不能超過1.

開放定址法的好處在於它不用指標,而是計算要訪問的槽序列。於是,不用儲存指標而節省的空間,使得可以用同樣的空間來提供更多的槽,潛在的減少了衝突,提高了檢索速度。

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

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

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

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

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

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