1. 程式人生 > >哈希表之二哈希函數的構造

哈希表之二哈希函數的構造

col 相同 減少 eight 分割 查找 border 如果 一位

了解了hash的思想之後,會發現哈希函數只是將關鍵字對下標的映射,沒有什麽特別的標準,沖突的多少就是衡量其好壞。

若對於關鍵字集合中的任一一個關鍵字,經哈希函數映像到地址集合中任何一個地址的概率是相等的,

則稱此類哈希函數為均勻的(Uniform)哈希函數

如果關鍵字能夠進過哈希函數計算得出的地址能夠均勻地分布在地址區間中,就可以減少沖突。

直接定地址法 H(key)=key或H(key)=a*key+b 直接定址所得地址集合和關鍵字集合的大小相同,對於不同關鍵字不會發生沖突,但是實際使用較少
數字分析法 將關鍵字轉為位數,取其中最不沖突的位數為哈希值,可以疊加求和然後舍去進位作為哈希值
平方取中法 取關鍵字平方後的中間幾位為哈希地址 一個數字平方後的中間幾位和每一位都有關系,由此適用隨機分布的關鍵字得到的哈希地址也是隨機的
折疊法 將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分疊加並舍去進位作為哈希地址 關鍵字位數很多,而且關鍵字每一位上數字分布大致均勻時,可采用折疊法得到哈希地址
除留余數法 H(key)=key MOD p, p<=m

m是哈希表表長,此為最簡單中最常用的構造哈希函數的方法,不僅可以直接取模,還可以通過折疊、平方取中後再取模;p的選擇為質數或者不小於20的質因子的合數

隨機數法 選擇一個隨機函數,取關鍵字的隨機函數值作為它的哈希地址,H(key)=random(key),其中random為隨機函數 通常關鍵字長度不相等時采用此法構造哈希函數

應視不同的情況采用不同的哈希函數:

(1)計算哈希函數所需的時間(包括硬件指令的因素);

(2)關鍵字的長度

(3)哈希表的大小

(4)關鍵字的分布情況

(5)記錄的查找頻率

哈希表之二哈希函數的構造