CLSR 11.2散列表
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[\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))。
CLSR 11.2散列表相关推荐
- 【算法导论】学习笔记——第11章 散列表
11.1 直接寻址表 当关键字的全域U很小,可采用直接寻址的方式.假设动态集合S的元素都取自全域U={0, 1, ..., m-1}的一个关键字,并且没有两个元素具有相同的关键字. 为表示动态集合,使 ...
- 算法导论答案 第11章:散列表
11.1 直接寻址表 11.1-1 findmax(T,m) {max=T[0];for i=1 to m-1{if T[i]!=NIL && T[i]>maxmax=T[i]} ...
- 【数据结构笔记41】散列表/哈希表的性能分享
本次笔记内容: 11.4 散列表的性能分析 文章目录 平均查找长度 影响冲突产生的三个因素 不同方法的性能 线性探测法查找性能 平方探测法和双散列探测法的查找性能 期望探测次数与装填因子α的关系 分离 ...
- Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- 考研数据结构之查找(9.8)——练习题之使用散列函数H(k)= 3k mod 11并采用链地址法处理冲突并构造散列表及设计散列表的完整算法(C表示)
题目 使用散列函数: H(k)= 3*k mod 11 并采用链地址法处理冲突.试对关键字序列(22, 41, 53, 46, 30, 13, 01, 67)构造散列表,求等概率情况下查找成功的平均查 ...
- 《算法导论》学习分享——11. 散列表(哈希表)
11. 散列表(哈希表) 文章目录 11. 散列表(哈希表) 直接寻址表 散列表 链接法散列分析 散列函数 除法散列 乘法散列 全域散列 开放寻址法 线性探查 双重探查 开放寻址法分析 完全散列 涉及 ...
- [数据结构]-散列表(哈希表)
在这里没有新的原创性的东西.该部分内容主要取材于<软件设计师教程>部分的内容. 我想强调一种数据结构,散列表.它是基于快速存取的角度设计的,也是一种典型的"空间换时间 ...
- 列表根据下标取值_散列表(上):Word文档中的单词拼写检查功能是如何实现的?...
Word这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼写 ...
- 散列表查找的一个实例
这里解决冲突的方法是开放地址法:"开放地址指的是表中尚未被占用的地址,开放地址法就是当冲突发生时候,形成一个地址序列,沿着这个序列逐个进行探测,直到找到一个空的开放地址,将发生冲突的关键字存 ...
最新文章
- Java 条件解析,Java Lambda使用条件检查解析集合
- python程序只能使用源代码进行运行吗-python在运行时更改源代码
- 【No.3 Ionic】超级逗表情 App
- 使用putty在linux主机和windows主机之间拷贝文件(已测试可执行)
- windows远程连接ubuntu 黑屏_Windows跟Windows远程连接传输文件
- python 在末尾增加一个字符串,python - Python File.write在末尾添加额外的字符串 - SO中文参考 - www.soinside.com...
- python 哥德巴赫猜想的验证
- 挑选回文串(二进制枚举)
- 经验分享:java批量读取txt文件入库
- Java笔记——equals和==的区别
- 【Webcam设计】视频的采集和动态显示
- 让人等不及的潮州小吃“来不及”
- 软件测试用例设计方法等价划分法
- 实行计算机远程网上录取.啥意思,河北高考今年继续实行计算机远程网上录取...
- 【自学Flutter】20.3 ListView.separated 的使用
- 打叉图标html,SVG 勾号和叉号图标
- 关于ES2020语法2345加速浏览器不兼容问题
- IDEA 2019.1离线安装lombok
- 开发者 J 有意思|1024 开发者嘉年华活动正式启幕
- 基于物理的渲染—更精确的微表面分布函数GGX
热门文章
- java程序员必备英语词汇_java程序员常用英文单词整理
- c语言源程序自动评判系统,C语言源程序的自动评判系统.pdf
- java开发微信公众号(SpringMVC)2-消息管理功能
- 技术书籍也香艳【关于Head First Design Patterns 封面女郎】
- git via xkcd
- 数字电子钟Multisim仿真(数电课设+实验报告)
- win10锁屏幻灯片放映不能播放幻灯片问题的一种解决办法
- C# winfrom窗体及控件 根据系统的分辨率自动调整位置
- 谷歌ai人工智能叫什么_用Google新的AI强大工具翻译古代象形文字
- XMind8破解版安装