您的位置:首页 > 其它

CLRS 11.3 散列函数

2015-12-16 10:14 148 查看
11.3-1

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

11.3-2

类似于书上所说的,先将关键字转换为自然数,然后再模 mm。

设关键字为 x=cr−1cr−2…c0x=c_{r-1}c_{r-2}\dots c_0,转换为 n=cr−1∗128r−1+cr−2∗128r−2+⋯+c1∗128+c0n=c_{r-1}*128^{r-1}+c_{r-2}*128^{r-2}+\dots +c_1*128+c_0,然后再对 mm 取模,即:

n mod m=(cr−1∗128r−1+cr−2∗128r−2+⋯+c1∗128+c0) mod m=((cr−1∗128r−1) mod m+(cr−2∗128r−2) mod m+⋯+(c1∗128) mod m+(c0 mod m)) mod m\begin{align}
n\ mod\ m&=(c_{r-1}*128^{r-1}+c_{r-2}*128^{r-2}+\dots +c_1*128+c_0)\ mod\ m\\
&=((c_{r-1}*128^{r-1})\ mod\ m+(c_{r-2}*128^{r-2})\ mod\ m+\dots +(c_1*128)\ mod\ m+(c_0\ mod\ m))\ mod\ m
\end{align}

11.3-3

先假设原字符串为 x=xn−1…x1x0x=x_{n-1}\dots x_1x_0,通过置换变成 y=x′n−1…x′1x′0y=x'_{n-1}\dots x'_1x'_0。

此时有 xn−1+xn−2+⋯+x1+x0=x′n−1+x′n−2+⋯+x′1+x′0x_{n-1}+x_{n-2}+\dots +x_1+x_0=x'_{n-1}+x'_{n-2}+\dots +x'_1+x'_0。

对字符串 xx 求散列值为:

hash(x)=(xn−1∗(2p)n−1+⋯+x1∗(2p)1+x0∗(2p)0) mod (2p−1)=((xn−1∗(2p)n−1) mod (2p−1)+⋯+(x1∗(2p)1) mod (2p−1)+(x0∗(2p)0) mod (2p−1)) mod (2p−1)\begin{align}
hash(x)&=(x_{n-1}*(2^p)^{n-1}+\dots +x_1*(2^p)^1+x_0*(2^p)^0)\ mod\ (2^p-1)\\
&=((x_{n-1}*(2^p)^{n-1})\ mod\ (2^p-1)+\dots +(x_1*(2^p)^1)\ mod\ (2^p-1)\\
&\quad +(x_0*(2^p)^0)\ mod\ (2^p-1))\ mod\ (2^p-1)
\end{align}

又有:

(2p)n−1 mod (2p−1)=[(2p)n−2(2p−1)+(2p)n−2] mod (2p−1)=(2p)n−2 mod (2p−1)…=(2p)1 mod (2p−1)=1\begin{align}
(2^p)^{n-1}\ mod\ (2^p-1)&=[(2^p)^{n-2}(2^p-1)+(2^p)^{n-2}]\ mod\ (2^p-1)\\
&=(2^p)^{n-2}\ mod\ (2^p-1)\\
&\dots\\
&= (2^p)^1\ mod\ (2^p-1)\\
&=1
\end{align}

所以 hash(x)=(xn−1+xn−2+⋯+x1+x0) mod (2p−1)hash(x)=(x_{n-1}+x_{n-2}+\dots +x_1+x_0)\ mod\ (2^p-1)

同样求得 hash(y)==(x′n−1+x′n−2+⋯+x′1+x′0) mod (2p−1)hash(y)==(x'_{n-1}+x'_{n-2}+\dots +x'_1+x'_0)\ mod\ (2^p-1),所以有相同散列值。

11.3-4

h(61)=⌊1000∗(0.6180339∗61 mod 1)⌋=⌊1000∗0.700)⌋=700h(61)=\lfloor 1000*(0.6180339*61\ mod\ 1)\rfloor =\lfloor 1000*0.700)\rfloor=700

其他类似的 h(62)=318,h(63)=936,h(64)=554,h(65)=172h(62)=318,h(63)=936,h(64)=554,h(65)=172

11.3-5

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

11.3-6

令a=<a0,a1,...,an−1>,a′=<a′0,a′1,...,a′n−1>,hb(a)=hb(b),hb(a)−hb(b)=0a=,a'=, h_b(a)=h_b(b),hb(a)-hb(b)=0。

由于 bb 在 ZpZ_p 上最多有 n−1n-1 个根,故不同的 bb 的个数不大于 n−1n-1。

Pr{h(a)=h(b)}≤(n−1)/pP_r\{h(a)=h(b)\}≤(n-1)/p
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: