有哪些散列函數
- 直接定址法(指恆等轉換)
- 平方取中法(取key平方的中間若干位作為hash值)
- 除留余數法(用除去一個數得到的余數作為hash值)
HashTable
HashMap
Question
常用的hash函數是選一個數m取模(余數),這個數在課本中推薦m是素數,但是經常見到選擇m=2^n,因為對2^n求余數更快,並認為在key分布均勻的情況下,key%m也是在[0,m-1]區間均勻分布的。但實際上,key%m的分布同m是有關的。
證明如下: key%m = key - xm,即key減掉m的某個倍數x,剩下比m小的部分就是key除以m的余數。顯然,x等於key/m的整數部分,以floor(key/m)表示。假設key和m有公約數g,即key=ag, m=bg, 則 key - xm = key - floor(key/m)m = key - floor(a/b)m。由於0 <= a/b <= a,所以floor(a/b)只有a+1中取值可能,從而推導出key%m也只有a+1中取值可能。a+1個球放在m個盒子里面,顯然不可能做到均勻。
由此可知,一組均勻分布的key,其中同m公約數為1的那部分,余數后在[0,m-1]上還是均勻分布的,但同m公約數不為1的那部分,余數在[0, m-1]上就不是均勻分布的了。把m選為素數,正是為了讓所有key同m的公約數都為1,從而保證余數的均勻分布,降低沖突率。
1.線性探查法
2.平方探查法
3.鏈地址法