20162323周楠 2017-2018-1 《程序设计与数据结构》第十一周学习总结
20162323周楠 2017-2018-1 《程序设计与数据结构》第十一周学习总结
目录预览
0.教材学习内容总结
20.1 哈希方法
- 在哈希方法中,元素保存在哈希表中,其在表中的位置由哈希函数确定
- 哈希方法中的每个位置称为单元(cell)或桶(bucket)
- 使用哈希方法使得对某个元素的访问时间不依赖于表中的元素个数,即哈希表中一个元素的所有操作都将是O(1)
- 使用哈希方法,只需计算一个具体的元素应该放在哪里即可,不过,每个元素映射到表中的同一个位置是唯一需要充分考虑效率的情况
- 两个元素或关键字映射到表中同一个位置的情形称为冲突
- 将每个元素映射到表中唯一位置的哈希函数成为理想哈希函数
一、哈希表的大小
- 如果已知数据集的大小,并能够使用理想哈希函数,那么只需让表与数据集一样大即可
- 如果理想哈希函数找不到或不实用,但知道数据集的大小,则最好的经验法则是表的大小是数据集的150%
- 如果不知道数据集的大小是多少,此时要依赖动态调整大小
动态调整哈希表大小的过程是,创建一个比原表更大的新哈希表,可能是原来的两倍大,将原表中的所有元素插入到新表中,然后放弃原表。
20.2 哈希函数
- 抽取仅使用元素值或关键字中的一部分来计算保存元素的位置
1.除法方法
通过除法方法建立哈希函数,是指使用关键字除以某个正整数p后的余数,作为给定元素的下标
2.折叠方法
- 在移位折叠方法中,将关键字的各部分加在一起计算下标
- 在边界折叠方法中,首先让关键字的若干段反转,然后再相加
3.平方取中方法
关键字自乘,然后使用抽取方法从平方结果的中部抽取相应的位得到下标。每次选择的“中部”各位必须相同,以保持一致性
4.基数转换方法
关键字转换为另一种数值基数
5.数字分析方法
抽取关键字中的指定位并进行处理从而得到下标
6.长度依赖方法
关键字和关键字的长度以某些方法组合起来,或直接当做下标使用,或再进一步使用其他方法进行处理从而得到下标
7.Java语言中的哈希函数
虽然Java为所有的对象提供了hashcode方法,最好还是为特定的类定义一个具体的哈希函数
20.3 解决冲突
- 冲突:多个元素或关键字映射到表中的同一个位置
1.链式方法
处理冲突的链式方法,将哈希表看成是集合的表而不是各独立单元的表
- 实现方法:
(1 )令保存表的数组大于表中的元素个数,利用额外的空间作为溢出区来保存与每个表位置相对应的链表
(2)使用链,哈希表中的每个单元或桶都类似于之前构造链表时使用过的LinearNode表
(3)让表中的每个位置当做指向集合的指针
2.开放地址方法
处理冲突的开放地址方法,即在表中寻找不同于该元素初次哈希到的另一个开放的位置
- 线性探测方法
20.4 从哈希表中删除元素
一、从链式实现中删除
使用链式方法及溢出区数组来实现哈希表,删除元素的5种情形
- 情形一:要删除的元素是映射到表中某个位置的唯一元素。在这种情形下,将表中的这个位置设置为null,即删除了元素
- 情形二:要删除的元素保存在表中(不是溢出区),但在该位置有指向下一个元素的溢出区下标
- 情形三:要删除的元素保存在哈希表中那个位置存储的元素组成的表的表尾
- 情形四:要删除的元素保存在哈希表中那个位置存储的元素组成的表的中间
- 情形五:要删除的元素不在表中
二、从开放位置实现中删除元素

19.5 Java Collections API中的哈希表
- 装载因子是哈希表扩展之前,表中允许的最大占有百分比
- 哈希方法的7种实现方案:Hashtable、HashMap、HashSet、Identity-HashMap、LinkedHashMap、LinkedHashSet和WeakHashMap




1.教材学习中的问题和解决过程
- 问题1:哈希表跟我们讨论过的其他集合有什么不同? - 解答1:元素放到哈希表中根据元素的值或元素的关键字产生的下标位置。与其他集合相比,它的独特性在于,元素在集合中的位置既取决于它与集合中其他值的比较结果,又取决于元素加入或从集合中删除的次序-
问题2:哈希函数的目标是什么?
-
解答2:能将元素合理地散列到表中
-
问题三:为什么开放地址实现中删除元素是个问题?
-
解答三:因为在开放地址方法中已经形成了一条路径,所以从路径的中间删除元素可能是导致路径中位于那个元素之后的元素都找不到了
2.代码调试中的问题和解决过程
- 问题:
浙公网安备 33010602011771号