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
先根据关键字得出散列值,然后在链表中查找是否有此散列值,对于散列到同样的散列值的关键字,需要再比较关键字。
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
相关文章推荐
- python round() round函数
- iOS之 开发常用到的宏定义
- IE8中伪元素动态作用样式不重绘bug记录
- Qt 使用#define+qDebug()输出调试信息
- nginx日志分析工具awstats
- win10系统屏幕总是旋转该怎么办? win10禁用屏幕旋转的方法
- nginx-1.9.1平滑升级到nginx-1.9.7
- ORACLE 运用RMAN删除过期备份和日志文件 释放空间
- 本地plist文件创建、写入、读取
- 悬浮窗口和利用服务实现流氓广告弹窗
- Mac OS X 开发模式: Enable Developer Mode on this Mac?
- == equals的区分与使用(转)
- tomcat发布修改浏览器中的标志以及登录页面监听回车键登录
- 28 Five pounds too dear五磅也太贵
- C语言中define的用法
- 瞬间解除电脑开机密码
- [Python3.4]通过Redis利用BloomFilter实现数据去重
- iOS开发 ~应用程序设计理念:视图控制器(UIViewController)、视图(UIView)
- 你们好呀
- Android 防止设置大字体导致布局混乱