以下是我對雜湊表的總結,其中大部分概念性的東西來自嚴蔚敏的資料結構書上的,加了一些我個人的經驗總結,這篇的主要目的
是方便我以後自己看,所以有點類似於提綱性的東西。
1.定義:根據設定的雜湊函數H(key)和處理衝突的方法將一組關鍵字映像到一個有限的連續的地址集(區間)上,並以關鍵
字在地址集中的“像”作為記錄在表中的儲存位置,這種表便稱為雜湊表,這一映像過程稱為雜湊造表或者散列
所得儲存位置稱雜湊地址或散列地址
目的:在記錄位置和關鍵字之間建立一個確定的對應關係,提高尋找的速度
案例:編譯原理當中的符號表,狀態機器當中的狀態尋找等
實現:可以有多種,根據實際情況而定,可以將儲存和尋找分開,一般情況下資料結構要麼是插入快尋找慢或者插入慢尋找快,與其他
資料結構配合可以實現插入和尋找速度都達到滿意的效果,但是一般需要佔用記憶體。另外雜湊表的尋找速度並不是絕對的
還和雜湊函數的構造方法有關,同時也與衝突處理方法有關
2.雜湊函數的構造方法:
(1)直接定址法
(2)數字分析法
(3)平方取中法
(4)摺疊法
(5)除餘留數法(最常用)
(6)隨機數法
以上這些方法可以組合著用,請注意有些雜湊表也可以不是由程式動態產生的,也可以是手動產生的,多見於資料固定的應用當中
,手動產生的雜湊表以直接定址法構造的居多,比如CINT指令碼引擎的擴充函數查詢採用的就是這種方法。
3.雜湊函數考慮的因素有:
(1)計算雜湊函數所需的時間
(2)關鍵字的長度
(3)雜湊表的大小
(4)關鍵字的分布情況
(5)記錄的尋找頻率
4.衝突處理方法
一般情況下,只能減少衝突,很難避免,因此衝突的處理是必要的,方法一般有如下幾種
(1)開放定址法
(2)再雜湊法
(3)鏈地址法
(4)建立一個公用溢出區
一般情況下衝突的機率和裝填因子有關,其中(3)和(4)經過一次處理就可以解決衝突問題,而(1)和(2)有可能需要多次,
(1)的方法有些像試探法,衝突較多時(1)和(2)效率較低, (4)這個方法比較消極,適合於衝突較少的情況,如果衝突較多,(4)的尋找效率
會明顯降低。總之一切都要根據實際應用來進行選取。
5.幾個概念
(1)均勻雜湊函數:若對於關鍵字集合中的任一關鍵字,經雜湊函數映像到地址的集合中的任何一個地址的機率是相等的,則稱此類函數
為均勻的雜湊函數
(2)裝填因子a=(表中填入的記錄數)/(雜湊表的長度),對裝填因子的控制可以減少衝突
(3)衝突:k1!=k2,f(k1)=f(k2)
有空再補例子吧