CLRS 11.3 散列函数

来源:互联网 发布:大神小的知错了全文 编辑:程序博客网 时间:2024/06/14 03:58

11.3-1
先根据关键字得出散列值,然后在链表中查找是否有此散列值,对于散列到同样的散列值的关键字,需要再比较关键字。

11.3-2
类似于书上所说的,先将关键字转换为自然数,然后再模 m
设关键字为 x=cr1cr2c0,转换为 n=cr1128r1+cr2128r2++c1128+c0,然后再对 m 取模,即:

n mod m=(cr1128r1+cr2128r2++c1128+c0) mod m=((cr1128r1) mod m+(cr2128r2) mod m++(c1128) mod m+(c0 mod m)) mod m

11.3-3
先假设原字符串为 x=xn1x1x0,通过置换变成 y=xn1x1x0
此时有 xn1+xn2++x1+x0=xn1+xn2++x1+x0
对字符串 x 求散列值为:

hash(x)=(xn1(2p)n1++x1(2p)1+x0(2p)0) mod (2p1)=((xn1(2p)n1) mod (2p1)++(x1(2p)1) mod (2p1)+(x0(2p)0) mod (2p1)) mod (2p1)

又有:
(2p)n1 mod (2p1)=[(2p)n2(2p1)+(2p)n2] mod (2p1)=(2p)n2 mod (2p1)=(2p)1 mod (2p1)=1

所以 hash(x)=(xn1+xn2++x1+x0) mod (2p1)
同样求得 hash(y)==(xn1+xn2++x1+x0) mod (2p1),所以有相同散列值。

11.3-4
h(61)=1000(0.618033961 mod 1)=10000.700)=700
其他类似的 h(62)=318,h(63)=936,h(64)=554,h(65)=172

11.3-5
由于本题带星号且证明略多,证明略,答案请自行参考教师指导手册。

11.3-6
a=<a0,a1,...,an1>,a=<a0,a1,...,an1>,hb(a)=hb(b),hb(a)hb(b)=0
由于 bZp 上最多有 n1 个根,故不同的 b 的个数不大于 n1
Pr{h(a)=h(b)}(n1)/p

0 0