散列表查找(哈希表)
我們只需要能過某個函數f,使得存儲位置=f(關鍵字)
那樣我們可以通過查找關鍵字不需要比較就可獲得需要的記錄的存儲位置。這就是一種新的存儲技術-----散列技術。
散列技術是在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係f,使得每個關鍵字key對應一個存儲位置f(key)。查找時,根據這個確定的對應關係找到給定值key的映射f(key),若查找集合中存在這個記錄,則必定在f(key)的位置上。
這裏我們把這種對應關係f稱爲散列函數,又稱爲哈希(Hash)函數。按這個思想,採用散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續存儲空間稱爲散列表或哈希表(Hash table)。
散列表查找步驟
整個散列過程其實就兩步:
1. 在存儲時,通過散列函數計算記錄的散列地址,並按此散列地址存儲該記錄。
2. 當查找記錄時,我們通過同樣的散列函數計算記錄的散列地址,按此散列地址訪問該記錄。說起來很簡單,在哪存的,上哪去找,由於存取用的是同一個散列函數,因此結果當然也是相同的
所以說散列技術既是一種存儲方法,也是一種查找方法。
散列技術最適合的求解問題是查找與給定值相等的記錄。
設計一個簡單、均勻、存儲利用率高的散列函數是散列技術中最關鍵的問題。另一個問題是衝突。在理想的情況下,每一個關鍵字,通過散列函數計算出來的地址都是不一樣的,可現實中,這只是一個理想,我們時常會碰到
兩個關鍵字key1≠key2,但是卻有f(key1)=f(key2),這種現象我們稱爲衝突,並把key1和key2稱爲這個散列函數的同義詞。
散列函數的構造方法
1. 散列函數的計算時間不應該超過其通過查找技術與關鍵字比較的時間。
2. 散列地址分佈均勻,這樣就可以保證存儲空間的有效利用,並減少爲處理衝突而耗費的時間
直接定址法
取關鍵字的某個線性函數值爲散列地址
f(key)=aXkey+b
這樣的散列函數優點就是簡單、均勻、也不會產生衝突,問題是這需要事先知道關鍵字的分佈情況,適合查找表較小且連續的情況。由於這樣的限制,在現實應用中,此方法雖然簡單,但卻並不常用。
數字分析法
平方取中法
摺疊法
除留餘數法
隨機數法