20162320刘先润大二第11周作业
学号20162320 《程序设计与数据结构》第8周学习总结
教材学习内容总结
一、哈希方法
在哈希方法中,元素保存在哈希表中,元素在表中的位置的位置有哈希函数(hashing function)决定,表中的每个位置成为单元(cell)或桶
注意:使用哈希方法使对某个元素的·访问时间不依赖于表中的元素个数。这意味着对哈希表中一个元素的所有操作都是O(1)。即不必非要通过比较才能找到一个具体的元素,或定位所给元素的相应位置。使用哈希方法,只需要计算一个具体的元素应该放在哪里即可。如果两个元素或关键字映射到表中同一位置的情形称为冲突(collision),将每个元素映射到表中唯一位置的哈希函数称为理想哈希函数
如果知道数据集的大小,则经验法推知哈希表的大小是数据集的150%。如果不知道数据集的大小,需要动态调整大小时,即创建一个比原表更大的新哈希表,可能是原来的两倍大,将原表中所有元素插入到新表中,然后放弃原表。防止表变满性能下降,可以使用装载因子(load factor)
二、哈希函数
抽取(extraction)是一种哈希函数,仅使用元素值或关键字中的一部分来计算保存元素的位置。
- 1)除法方法
使用关键字除以某个正整数p后的余数,作为给定元素的下标。
Hashcode(key)=Math.abs(key)%p
-
2)折叠方法
将关键字的各部分加在一起计算下标。移位折叠法是将这些各部分相加得下标,边界折叠是让关键字的若干子段反转再相加。 -
3)平方取中方法
 ; ;关键字自乘,然后使用抽取方法从平方结果的中部抽取相应的位得到下标 -
4)基数转化方法
关键字转换为另一种数值基数 -
5)数字分析方法
抽取关键字中的指定位并进行处理从而得到下标 -
6)长度依赖方法
关键字和关键字的长度以某些方式组合起来,或直接当做下标使用,或再进一步使用其他方法进行处理而得到下标。 -
7)Java语言中的哈希函数
java.lang.Object定义了方法hashcode,它根据对象在内存中的位置返回一个整数,但是最好还是为特定的类定义一个具体的哈希函数。
三、解决冲突
-
1)链式方法
将哈希表看成几何的表而不是各独立单元的表,所以每个单元保存一个指针,指向于表中该位置相关的元素的集合。利用额外的空间作为溢出区来保存每个表位置相对应的链表,映射到表中某个位置的首个元素保存到那个位置,映射到该位置的下一个元素也一起保存,如下图所示。
-
2)开放地址方法
在表中寻找不同于该元素原先哈希到另一个开放的位置。
总共有三种方法:一是线性探测法,即线性探测空白单元,如果数据放在10这个位置,但10已经满,就放在11,依次类推下去。二是二次探测方法,二次探测的步数是原始位置相隔的步数的平方。三是双哈希方法,当基本哈希函数导致冲突时,将使用提供的第2个哈希函数解决问题
此方法博主并不是特别理解,附上学习参考博客哈希表之开放地址的三种方法
四、从哈希表中删除元素
- 1)从链式实现中删除
删除元素有5种情况:
1.删除的元素是某个位置的唯一元素。将表中该位置设置为null即删除
2.删除的元素保存在表中(非溢出区),但在该位置有指向下一个元素的溢出区下标。使用被删元素所指向的元素及next下标值,替换该元素及表中的next下标值,然后溢出区的该位置设置为null,将它重新放回空闲位置表中
3.删除的元素保存在哈希表中那个位置存储的元素组成的表的表位。设置溢出区的这个位置为null,同时设置表中前一元素的next下标值也为null,将它重新放回空闲位置表中
4.删除的元素保存在哈希表中那个位置存储的元素成的表的中间。设置溢出区的这个位置为null,设置表中前一元素的next下标值为被删元素的next下标值,将它重新放回空闲位置表中
5.删除的元素不在表中,抛出ElementNotFoundException
-2)从开放地址实现删除元素
五、Java Collection API中的哈希表
7种实现方法:Hashtable、HashMap、HashSet、IdentityHashMap、LinkedHashSet、LinkedHashMap、WeakHashMap
六、图的遍历
两种遍历方式:
-
1)广度优先(类似于程序遍历)
实现方法:通过一个队列保存遍历过的顶点顺序,以便按出队顺序去访问这些顶点的邻接顶点 -
2)深度遍历(类似于先序遍历)
两种算法:
-
1):Prim算法:从点入手,适合稠密图
-
2): Kruskal算法:从边入手,适合稀密图(直接找最小权值边)。注:两个节点若同属于一棵树,则它们应该有共同的根结点
七、powerdesigner的使用
在数据库建模的过程中,需要运用PowerDesigner进行数据库设计,这个不但可以让人直观的理解模型,而且可以充分的利用数据库技术,优化数据库的设计。
其次就是E-R图,在数据库系统概论中有涉及到,这个实体关系图中,一个实体对于一个表,实体、属性与联系是进行系统设计时要考虑的三个要素,也是一个好的数据库设计的核心。
设计参考资料:使用powerDesigner画ER图
右图是根据小组app所画的初步ER图
教材学习中的问题和解决过程
- 问题1:在Java Collection API中集合(set)和映射(map)的区别
解答:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。Java SDK提供的类都是继承自Collection的“子接口”如Set - 问题2:哈希表处理产生聚集现象是什么?
解答:我的理解是哈希表中位置冲突引起的位置后移使大量元素堆积在一端的现象。 - 问题3:当哈希表越来越满时聚集越来越严重时会发生什么?
解答:这导致产生非常长的探测长度,后续的数据插入将会非常费时。通常数据超过三分之二满时性能下降严重,因此设计哈希表关键确保不会超过这个数据容量的一半,最多不超过三分之二。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
错题暂未给出答案
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
其他(感悟、思考等,可选)
Few things are impossible in themselves; and it is often for want of will, rather than of means, that man fails to succeed.事情很少有根本做不成的;其所以做不成,与其说是条件不够,不如说是由于决心不够。我就不信了,我的java一定会好的。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 188 | 1/1 | 25 | 算法分析 |
第二周 | 70/258 | 1/2 | 15/40 | 《构建之法》7-9章 |
第三周 | 474/732 | 1/3 | 20/60 | 查找和排序 |
第四五六周 | 1313/2045 | 4/7 | 12/72 | 栈和队列 |
第七周 | 890/2935 | 1/8 | 14/86 | 树 |
第八周 | 913/3848 | 1/9 | 20/106 | 二叉查找树 |
第九周 | 890/3738 | 1/10 | 13/119 | 堆 |
第十周 | 637/4374 | 2/12 | 18/137 | 图 |
第十一周 | 170/4544 | 1/13 | 15/152 | 哈希方法 |
第十二周 | 、 |
- 计划学习时间: 20+小时
- 实际学习时间: 25小时
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)