定義
通過散列函數尋找某個關鍵字所存在的位置,利用散列技術存儲在一塊連續的存儲空間中,這塊連續的存儲空間稱為散清單,對應的存儲位置成為散列位址。
沖突
在查找存儲位置的時候會存在關鍵字不同,但是存儲位置相同,即對應的散列函數值相同,這種情況即“沖突”。
散列函數的構造
散列函數有很多構造方法,比如直接定址法、除留餘數法等等,但不是都适用,是以好的散列函數應該具有:計算簡單、散列位址分布均勻的特點
構造方法
-
直接定址法
這個方法比較直接,就和它的名字一樣,直接。比如年齡統計,一個年齡為66的人,那函數就可以直接以66為值。
-
平方取中法
一個值為1234的關鍵字,sqrt(1234)=1522756,在取最後三位即756作為散列位址。這種方法造成沖突的機率比較大。
- 除留餘數法(最常用)
對表長為m,關鍵字為x的散列函數公式可以表示為:f(x)= x mod p(p<=m),為了盡量避免沖突,選好p是關鍵。通常選取p為小于等于表長m的最小質數。
處理散列沖突
f(x)= x mod p;就比如x=37、47,p等于12的時候,37是不是就和47沖突了,是以就要處理沖突來使散列位址釋出均勻。
可以做一下改變:
這樣f(37)=1,而f(32)=2就避免了沖突,但是光這樣無法達到均勻分布,是以可以改善一下di數組: