哈希表(散列表)之乘法哈希(散列)法

乘法哈希法对应的哈希函数 h ( k ) = ( A ∗ k m o d    2 w ) r s h ( w − r ) h(k)=(A*k\mod 2^w )rsh(w-r) h(k)=(Akmod2w)rsh(wr)

w w w为计算机的每一个字的字节长度,即计算机位数,常见的有32位和64位

A A A是一个常数,满足: A A A在二进制下的长度为 w w w

r r r是一个与哈希表大小有关的常数,设哈希表长度为 m m m r = ⌈ log ⁡ 2 m ⌉ r=\lceil\log_2 m\rceil r=log2m

r s h rsh rsh是右移操作,在C++编程语言中的对应代码为>>

举例说明:
假定 m = 8 m=8 m=8,则 r = 3 r=3 r=3;假定 w = 7 w=7 w=7(世界上并不存在7位的计算机),选取 A = 101100 1 ( 2 ) A=1011001_{(2)} A=1011001(2),若 k = 110101 1 ( 2 ) k=1101011_{(2)} k=1101011(2)
哈希函数的计算如下: A ∗ k = 101100 1 ( 2 ) ∗ 110101 1 ( 2 ) = 1001010011001 1 ( 2 ) A*k=1011001_{(2)}*1101011_{(2)}=10010100110011 _{(2)} Ak=1011001(2)1101011(2)=10010100110011(2),可以看到 A ∗ k A*k Ak在二进制下长度为 2 w 2w 2w,实际上,这不是偶然,两个 w w w位二进制数相乘得到的是 2 w 2w 2w位的二进制数。
A ∗ k m o d 2 w = 1001010011001 1 ( 2 ) m o d    2 7 A*kmod2^w=10010100110011_{(2)}\mod2^7 Akmod2w=10010100110011(2)mod27,二进制数对 2 w 2^w 2w取余,只需要截取原二进制数的后 w w w位,这里得到 011001 1 ( 2 ) 0110011_{(2)} 0110011(2)
右移 w − r 位 w-r位 wr,即右移4位,得到 01 1 ( 2 ) 011_{(2)} 011(2),对应十进制数为3

乘法哈希法的优点在于其计算效率较高

你可能感兴趣的:(数据结构与算法,列表,哈希表,hash,数据结构,算法)