雜湊表(hash table)是實現字典操作(查詢、插入、刪除)的有效資料結構,具有很高的查詢效率。
一定情況下查詢元素的期望時間是o(1),優於鍊錶(o(n)),和直接定址的陣列(查詢也是o(1))相當。但當實際儲存的關鍵字數比可能的關鍵字總數小的時候,雜湊錶比陣列有效。
一些記號:
直接定址,關鍵字k存放在第k個槽;而雜湊技術下,關鍵字k存放在第h(k)位置下。關鍵字會經過一次雜湊函式求出對映的位置,將關鍵字全域u對映到0到m-1的m個槽。
直接定址技術存在明顯問題,當關鍵字全域u很大的時候,儲存大小為|u|的表t不現實。而實際儲存的關鍵字集合k可能遠小於u,分配給t的大部分空間浪費。因此|
k|<<|u
| 時,雜湊表儲存空間比直接定址表小得多,而查詢元素需o(1)時間時,儲存要求可以降到θ(
|k|)
。 由於|k|一般情況下大於m,因此|k|個關鍵字存在m個槽,必然會存在兩個關鍵字對映到同乙個槽,即collision。有兩種方法可以解決碰撞問題:鏈結法和開放定址法。
簡單一致雜湊(****** uniform hashing):每個關鍵字等可能雜湊在m個槽的任何乙個(均勻分布),這樣能防止形成n長的單鏈表。
最常用的是除法雜湊法,其他的還有乘法雜湊法,全域雜湊。
除法雜湊就是用乙個特定的質數m去除給定的關鍵字k,所得的餘數即為該關鍵字對應的雜湊值。(如果質數和關鍵字分布無關,可以近似滿足「簡單一致雜湊」的假設。)h(
k)=k
modm
m通常是和2的整數冪不接近的質數,這和費馬小定理有關,能保證k在m所在的素數域保證唯一性。《演算法導論》11.3.1節有這麼一句話,如果m=2^p,h(k)就是k的p個最低位數字,怎麼理解呢?
舉個例子,假設k為21,k除以8(2的3次方)的餘數(5)和k的二進位制的低3位(101)是相同的。只要k的二進位制低3位是101,如29、37、45等等,那麼h(k)的值都是5。因此,不同的k對應的h(k)重複的概率大大增加。
演算法導論 雜湊表
include include includeusing namespace std const int length 6 待插入的數列長度 const int tablesize 11 雜湊表的容量 應該打大於數列長度以保證每個元素都有處可放 typedef struct hash hashtab...
演算法導論 雜湊表
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 8 雜湊表 hash table 是一種支援高效插入,查詢,刪除操作的動態集合結構。並且在滿足一些合理假設下,這些操作的平均時間複雜度可以達到 1 這也是雜湊表能夠和二叉搜尋樹 紅黑樹 抗衡的乙個重要方面。一 直接定址表 當關鍵字集合...
演算法導論11(雜湊表)
11.1 直接定址表 struct node node directaddresssearch node t,int k void directaddressinsert node t,node x void directaddressdelete node t,node x 11.2 雜湊表 通過...