散列函數


有哪些散列函數

  • 直接定址法(指恆等轉換)
  • 平方取中法(取key平方的中間若干位作為hash值)
  • 除留余數法(用除去一個數得到的余數作為hash值)

HashTable

HashMap

Question

  • hash函數為什么要選擇對素數求余?
常用的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,從而保證余數的均勻分布,降低沖突率。
  • 解決hash沖突的幾種的幾種方法
1.線性探查法

2.平方探查法

3.鏈地址法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM