哈希表(散列表)知识点概述
引言
在查找數據過程中,有很多種方法,但是大部分都是通過數據間的比較進行的,有沒有一種方法可以直接通過關鍵字得到要查找的數據的位置的方法呢?這就需要用到一種新的查找方法,散列查找法;
基本思想
記錄存儲位置與關鍵字之間存在的對應關系f,使得每個關鍵字key對應一個存儲位置f(key);
這里的對應關系f就是散列函數,也稱為哈希函數;
所以哈希表定義也可以是
通過 關鍵字集合 由 哈希函數 推出 存儲地址集合;
而這些集合的存儲空間就是散列表(哈希表);
散列技術既是一種存儲方法也是一種查找方法,它所記錄的數據之間不存在什么邏輯關系,只與關鍵字有關聯,所以可以說,散列表主要是面向查找的存儲結構;
所以散列表查找就有一個很大的優點:
查找速度極快,時間復雜度為O(1),查找效率與元素個數無關;
相關術語
哈希函數(散列函數) :在存儲位置p和其關鍵字key之間建立的一個確定的對應關系f,使f(key) = p,則f為哈希函數,p為哈希地址;
哈希表 :一個有限連續 的地址空間,用以存儲按哈希函數計算得到相應哈希地址的數據記錄。
沖突 :不同的關鍵字映射到同一個哈希地址,即key1 不等于key2,而f(key1) = f(key2);
同義詞 :具有相同函數值的兩個關鍵字,即key1和key2
哈希函數構造方法
構造前需要考慮的因素:
同時,一個好的哈希函數需要遵循以下兩個原則
1,計算簡單
每一個關鍵字只能有一個散列地址與之對應(減少時間)
2,哈希地址分布均勻
函數的值域需要在表長范圍內,這樣計算出來的哈希地址分布均勻,減少沖突(減少空間)
構造哈希函數有好幾種方法,這里就介紹最關鍵的一個方法——除留余數法
這個方法是最常用的構建哈希函數的方法,對于哈希表長為m的哈希函數公式為:
f(key) = key mod p (p <= m)
mod是取模,其實不僅可以對關鍵字取模,還可以在折疊平方中國取中后再取模,可以很直觀的看出,這個方法運用的好壞全都取決于p的選取;
所以一般情況下,若哈希表長為m,通常p為小于或等于表長(最好接近m)的最大質數;
處理沖突的方法
在哈希表的實際運用中,很難避免不出現沖突,這時就需要有處理沖突的方法,處理方法和哈希表的本身組織形式有關,根據組織形式的同,通常分為兩大類,開放定址法和鏈地址法;
開放定址法
基本思想:有沖突時就去尋找下一個空的哈希地址,只要哈希表足夠大,空的哈希地址總能找到,并將數據元素存入;
f(key) = (f(key) + d) mod m (d = 1,2,3,4,5,……m-1)
f為哈希函數,m為哈希表表長,d為增量序列,由d的取值不同,可以分為下列3種探測方法
這里就不詳細介紹這三種方法了,可以自行查閱;
鏈地址法
基本思想:相同哈希地址的記錄連成一個單鏈表,m個哈希地址就設m個單鏈表,然后用一個數組將m個單鏈表的表頭指針存儲起來,形成一個動態的結構;
即不同的key有相同的p,通過相同的p為表頭將這些key連接起來
這個方法很像圖中的 鄰接表 的使用方法,可以類比理解,這里的哈希地址可以類比為鄰接表里的頂點表,每個頂點相連的點就類似于哈希地址相同的關鍵字key;
這里就區別一下開放定址法和鏈地址法的特點
| 無指針域,存儲效率高 | 有指針域,存儲效率低 |
| 有二次聚集現象,查找效率低 | 無二次聚集現象,查找效率高 |
| 不易實現插入和刪除操作 | 易實現插入和刪除操作 |
| 表的大小固定,適用于表長無變化的情況 | 節點動態生成,始于表長經常變化的情況 |
總結
這只是一些基本內容,對于哈希表的代碼實現以后可能會補充,其實現在有很多造好的輪子可以使用,但是底層實現還是需要有了解的,這也是數據結構這門課程的存在原因。
總結
以上是生活随笔為你收集整理的哈希表(散列表)知识点概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 135. 分发糖果(贪心算法)
- 下一篇: 435. 无重叠区间(贪心算法)