20162322 2017-2018-1 《程序设计与数据结构》第十一周学习总结
教材学习内容总结
哈希方法
一、定义
哈希:次序——更具体来说是项在集合中的位置——由所保存元素值的某个函数或是所保存元素的关键值的某些函数来决定。
冲突:两个元素或关键字映射到表中同一个位置的情形。
理想哈希函数:将每个元素映射到表中的唯一位置的哈希函数。
二、哈希函数
我们的目标不需要哈希函数构成理想哈希函数,而仅仅是寻找一个函数,它能合理地将元素散列到表中以避免冲突。
(一)构造哈希函数的方法
1. 抽取:
仅使用元素值或关键字中的一部分来计算保存元素的位置。
2. 除法方法:
使用某个关键字除以某个正整数p后的余数,作为给定元素的下标
函数定义为:Hashcode(key) = Math.abs(key)%p
3. 折叠方法:
关键字划分为几段,然后再将它们组合或折叠在一起来建立表中的下标。
- 移位折叠:即分段相加
- 边界折叠:即分段反转
4. 平方取中方法
关键字自乘,然后使用抽取方法从平方结果的中部抽取相应的位得到下标。
5. 基数转换方法
关键字转换为另一种数值基数。
6. 数字分析方法
抽取关键字中的指定位并进行处理从而得到下标。
7. 长度依赖方法
(1)关键字和关键字的长度以某些方式组合起来,或直接当做下标使用,或再进一步使用其他方法进行处理而得到下标。
(2)长度依赖方法和平方取中方法能适用于字符串。
三、解决冲突
1. 链式方法
- 将哈希表看成是集合的表而不是各独立单元的表。每个单元中保存一个指针,指向表中该位置相关的元素的集合。通常表内的这些集合既没有先后次序也没有大小次序。
- 实现方式:3种
2. 开放地址方法
- 在表中寻找不同于该元素原先哈希到另一个开放的位置。
- 查找表中可用的另一个位置的方法:线性探测方法、二次探测方法、双哈希方法。
四、从哈希表中删除元素
1. 从链式实现中删除:5种情形
2. 从开放地址实现中删除:必须为表中的每个结点添加一个boolean类型的标识。
五、Java Colletions API中的哈希表
Hashtable
、HashMap
、HashSet
、Identity-HashMap
、LinkedHashSet
、LinkedHashMap
和WeakHashMap
。
装载因子是哈希表扩展之前,表中允许的最大占有百分比。
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
- 问题1:哈希函数的目标是什么?没有一个好的哈希函数的结果是什么?
- 问题1解决方案:我们需要哈希函数能将元素合理地散列到表中。如果没有一个好的哈希函数,会让多个元素映射到表中的同一位置,使得性能降低。
- 问题2:什么是装载因子,它如何影响到表的大小?
- 问题2解决方案:装载因子是哈希表在扩展之前表中允许的最大占有百分比。一旦达到装在因子,就创建两倍于现有表长的新表,然后将现有表中的所有元素插入到新表中。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 连通图具有以下属性中的哪一个?
A. 对于任何一对顶点,它们之间都有一个边。
B. 每个顶点都与其他顶点相邻。
C. 没有顶点与其他顶点相邻。
D. 对于任何一对顶点,它们之间都有一条路径。
E. 存在与其他顶点相邻的顶点。
正确答案:D。在连通图中,对于任何一对顶点,它们之间都有一条路径。
- 考虑一个有以下顶点和边的有向图:
顶点:1,2,3,4
边:(1,2),(2,1),(3,4)
下列哪个语句是正确的?
A. 图形有一个循环
B. 图形已连接
C. 该图是非循环的
D. 以上都是真实的
E. a,b,c都不是真的。
正确答案:A。这个图有一个循环,即边(1,2)和(2,1)。例如,它没有连接,因为在1和4之间没有路径。
- 图是一种特殊的树。
A. 正确
B. 错误
正确答案:B。树是一种特殊的图形。
结对及互评
点评:
-
博客中值得学习的或问题:
- 没看懂“代码中的问题”,仅是放了两张图,没有叙述。
-
其他
本周结对学习情况
- 20162323
- 结对照片
- 结对学习内容
- 一起做实验
其他(感悟、思考等,可选)
最近课程内容很难,自己理解起来略有一点费劲。课程学习内容较多,我个人还是更喜欢一个问题一个问题得解决。因此,本周就花了更多的时间消化课上学的图的章节的内容,并发了一篇博客将自己的所学进行了总结:最小生成树、最短路径问题总的来说我对于学习的态度一向是希望自己能够尽自己最大的努力将自己不懂的学懂,有时宁愿稍微停下新内容的学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 20/20 | 绪论 |
第二周 | 386/386 | 0/1 | 20/40 | |
第三周 | 500/886 | 2/3 | 20/60 | 选择与排序、团队作业一(一) |
第四周 | 300/1186 | 2/4 | 20/80 | 实验一(线性结构)、线性表、团队作业一 (二) |
第五周 | 300/1486 | 2/6 | 20/100 | 栈、团队作业二 |
第六周 | 300/1786 | 2/8 | 20/120 | 队列、团队作业三 |
第七周 | 844/2630 | 3/11 | 20/140 | 树 |
第八周 | 544/3174 | 2/13 | 20/160 | 实验二(树)、二叉查找树 、团队作业四和五(一) |
第九周 | 375/3645 | 2/15 | 20/180 | 哈夫曼树、堆和优先队列 、团队作业四和五(二) |
第十周 | 1484/4813 | 5/19 | 30/210 | 实验三(查找与排序)、图 、《构建之法》第一章阅读 |
第十周 | 0/4813 | 3/19 | 30/210 | 哈希方法、图(二) 、团队作业六和七 |
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:多思考!多思考!