CLSR 11.2散列表
2015-12-14 10:55
260 查看
11.2-1
对两个不同的关键字 k,lk,l,定义随机变量指示器 Xkl=I{h(k)=h(l)}X_{kl}=I\{h(k)=h(l)\},则 Pr{Xkl=1}=Pr{h(k)=h(l)}=1/mP_r\{X_{kl}=1\}=P_r\{h(k)=h(l)\}=1/m,所以 E[Xkl]=1/mE[X_{kl}]=1/m。
令 YY 表示总的冲突数,所以:
E[Y]=E[∑k≠lXkl]=(n2)1m=n(n−1)2mE[Y]=E[\sum \limits_{k\ne l}{}X_{kl}]=\binom{n}{2}\frac{1}{m}=\frac{n(n-1)}{2m}
11.2-2
11.2-3
链表排序后,查找平均次数为 α/2\alpha /2。
查找成功:我们需要查找的元素任然是哈希表中的任意一个,平均时间 Θ(1+α)\Theta(1+\alpha)。证明和书上查找成功类似。
查找失败:只是平均查找次数变为了 α/2\alpha /2,因此平均时间还是 Θ(1+α)\Theta(1+\alpha)。
插入:由于插入时要排序,插入操作和查找失败操作类似,因此平均时间是 Θ(1+α)\Theta(1+\alpha)。
删除:和查找成功一样,平均时间 Θ(1+α)\Theta(1+\alpha)。
11.2-4
槽的标志位用来指示槽是否是空槽,自由链表由表中所有空槽组成的一个双向链表,因此自由链表中空槽有两个指针。对于已经使用的槽包含一个元素和一个指向下一个散列到该槽的元素的指针(可能为空)。
1) 散列到一个空槽,很简单,直接从自由链表取出空槽,然后存入元素和一个空指针;由于自由链表是双向链表,所以可以在 O(1)O(1) 的时间完成;
2) 一个元素 xx 散列到槽 jj,但是槽 jj 里面已经装了一个元素 yy。若元素 yy 也是散列到 jj (即 x,yx,y 有冲突,若不是则由于在插入的时候元素 yy 是借用的槽 jj),则执行 3),否则执行 4);
3) 从自由链表中取出一个空槽(这个槽不属于元素 xx,这里只是暂时借用),装入元素 xx 并插入到槽 jj 所指向的链表中;
4) 同样先取一个空槽(这个槽不属于 x,yx,y,暂时借用),新槽中写入 yy 的内容(包括值和指针),将原来的槽还给 xx,同时更新原来指向 jj 的槽使之指向这个新槽。
设存在槽 jj 的元素 xx 是要被删除的元素;
1) 散列到槽 jj 的元素只有一个,即元素 xx ,删除这个槽并归还给自由链表;
2) 假设元素 xx 散列到槽 jj,并且元素 xx 属于槽 jj,同时还有其他元素散列到槽 jj,此时删除槽 jj 所指向的链表的第一个元素并释放元素 xx;
3) 假设元素 xx 散列到槽 jj,并且元素 xx 不属于槽 jj,释放 xx 的槽并更新原来指向 xx 的指针使之指向 xx 的后继。
检查关键字散列的槽,若没有则追踪这个槽所指向的链表。
和书上的一样,
11.2-5
由鸽笼原理知:若全域 UU 中所有元素散列到大小为 mm 的散列表中,则必有一个槽的元素数量大于n,否则,当每个槽散列的元素都少于 nn 个时,mm 个槽一共能散列元素小于等于 nmnm 个,与题目矛盾。
11.2-6
采用如下方法:
1) 随机选择一个槽,设散列到该槽的元素个数为 kk;
2) 从 1…L1\dots L 中随机选取一个数 pp,若 p≤kp\le k,则返回,否则重复1)。
现在我们把这个哈希表想象成 mm 行 LL 列的一个表,每个槽中链接的平均元素个数为 n/mn/m,即装填因子 α\alpha,所以一次成功的概率就是 (n/m)/L(n/m)/L,因此找一个槽并返回所需尝试的次数期望是 L∗m/nL*m/n。返回的时候,需要从 O(L)O(L) 长度的链表中取得所需元素,期望运行时间就是 O(L∗(1+m/n))=O(L∗(1+α))O(L * (1 + m / n))=O(L * (1 + \alpha))。
对两个不同的关键字 k,lk,l,定义随机变量指示器 Xkl=I{h(k)=h(l)}X_{kl}=I\{h(k)=h(l)\},则 Pr{Xkl=1}=Pr{h(k)=h(l)}=1/mP_r\{X_{kl}=1\}=P_r\{h(k)=h(l)\}=1/m,所以 E[Xkl]=1/mE[X_{kl}]=1/m。
令 YY 表示总的冲突数,所以:
E[Y]=E[∑k≠lXkl]=(n2)1m=n(n−1)2mE[Y]=E[\sum \limits_{k\ne l}{}X_{kl}]=\binom{n}{2}\frac{1}{m}=\frac{n(n-1)}{2m}
11.2-2
11.2-3
链表排序后,查找平均次数为 α/2\alpha /2。
查找成功:我们需要查找的元素任然是哈希表中的任意一个,平均时间 Θ(1+α)\Theta(1+\alpha)。证明和书上查找成功类似。
查找失败:只是平均查找次数变为了 α/2\alpha /2,因此平均时间还是 Θ(1+α)\Theta(1+\alpha)。
插入:由于插入时要排序,插入操作和查找失败操作类似,因此平均时间是 Θ(1+α)\Theta(1+\alpha)。
删除:和查找成功一样,平均时间 Θ(1+α)\Theta(1+\alpha)。
11.2-4
槽的标志位用来指示槽是否是空槽,自由链表由表中所有空槽组成的一个双向链表,因此自由链表中空槽有两个指针。对于已经使用的槽包含一个元素和一个指向下一个散列到该槽的元素的指针(可能为空)。
INSERT:
1) 散列到一个空槽,很简单,直接从自由链表取出空槽,然后存入元素和一个空指针;由于自由链表是双向链表,所以可以在 O(1)O(1) 的时间完成;
2) 一个元素 xx 散列到槽 jj,但是槽 jj 里面已经装了一个元素 yy。若元素 yy 也是散列到 jj (即 x,yx,y 有冲突,若不是则由于在插入的时候元素 yy 是借用的槽 jj),则执行 3),否则执行 4);
3) 从自由链表中取出一个空槽(这个槽不属于元素 xx,这里只是暂时借用),装入元素 xx 并插入到槽 jj 所指向的链表中;
4) 同样先取一个空槽(这个槽不属于 x,yx,y,暂时借用),新槽中写入 yy 的内容(包括值和指针),将原来的槽还给 xx,同时更新原来指向 jj 的槽使之指向这个新槽。
DELETE:
设存在槽 jj 的元素 xx 是要被删除的元素;
1) 散列到槽 jj 的元素只有一个,即元素 xx ,删除这个槽并归还给自由链表;
2) 假设元素 xx 散列到槽 jj,并且元素 xx 属于槽 jj,同时还有其他元素散列到槽 jj,此时删除槽 jj 所指向的链表的第一个元素并释放元素 xx;
3) 假设元素 xx 散列到槽 jj,并且元素 xx 不属于槽 jj,释放 xx 的槽并更新原来指向 xx 的指针使之指向 xx 的后继。
SEARCH:
检查关键字散列的槽,若没有则追踪这个槽所指向的链表。
和书上的一样,
SEARCH操作的期望运行时间 O(1+α)O(1+\alpha),但是由于 α≤1\alpha \le 1,所以上述操作均在 O(1)O(1) 的期望值。
11.2-5
由鸽笼原理知:若全域 UU 中所有元素散列到大小为 mm 的散列表中,则必有一个槽的元素数量大于n,否则,当每个槽散列的元素都少于 nn 个时,mm 个槽一共能散列元素小于等于 nmnm 个,与题目矛盾。
11.2-6
采用如下方法:
1) 随机选择一个槽,设散列到该槽的元素个数为 kk;
2) 从 1…L1\dots L 中随机选取一个数 pp,若 p≤kp\le k,则返回,否则重复1)。
现在我们把这个哈希表想象成 mm 行 LL 列的一个表,每个槽中链接的平均元素个数为 n/mn/m,即装填因子 α\alpha,所以一次成功的概率就是 (n/m)/L(n/m)/L,因此找一个槽并返回所需尝试的次数期望是 L∗m/nL*m/n。返回的时候,需要从 O(L)O(L) 长度的链表中取得所需元素,期望运行时间就是 O(L∗(1+m/n))=O(L∗(1+α))O(L * (1 + m / n))=O(L * (1 + \alpha))。
相关文章推荐
- 待解决:Connection reset by peer: socket write error
- 中国 省市区县 数据库sql
- Spark 下操作 HBase(1.0.0 新 API)
- 本人亲测100%好用的修改安卓手机MEID和IMEI超级牛的模拟器
- Spring读写xml文件
- C++静态成员变量
- 硬件篇之MMU
- objective-C中的description方法
- java单元测试覆盖率工具:EclEmma
- 中国 省市区县 数据库sql
- HTML图片热点、网页划区、拼接、表单
- android studio 打开.jks文件,获取shai值和md5
- android读取相册照片和相机照片
- 学会利用Ionic官网文档
- Java实现字符串匹配(基于正则)
- netty与tomcat区别
- Android手势的识别
- SAX PULL DOCUMENT解析XML总结
- Gartner评估:众包将掀起IT服务市场的革命
- 安卓PickerView文本框滚动选择器