20162317 2017-2018-1 《程序设计与数据结构》第11周学习总结

20162317 2017-2018-1 《程序设计与数据结构》第11周学习总结

教材学习内容总结

  1. 哈希方法的概念
  2. 键值对——Entry
  3. 哈希方法中存在的问题——冲突
  4. 哈希方法的好处
  5. 装载因子的定义
  6. 哈希函数(7种)
  7. 解决冲突的办法(两大种)
  8. 从哈希种删除元素的方法(两种)
  9. Java Collections API中的几种哈希表

教材学习中的问题和解决过程

  • 问题1:我在看哈希函数中的折叠方法的时候,看到书本中将987、654和321相加得到1962后,它后面写道:“我们想要一个3位的关键字,此时可以再用除法方法或是抽取方法得到需要的下标”我有两个问题:使用除法方法的话表长是多少?抽取方法的话是从哪里抽3位?
  • 问题1解决方案:再看完整章然后再回来解决的时候,发现自己当时是对哈希不了解不熟悉。抽取方法是从1962中任意抽取3位作为关键字;使用除法方法只是取三位做关键字方法的建议,至于表长这个无所谓。
  • 问题2:在课本后面列举的哈希方法中说到一些方法是同步的,有一些则是不同步的,同步是什么意思?同步与不同步有什么差别?
  • 问题2解决方案:XXXXXX
  • 问题3:双哈希方法中第二个哈希函数中的位置自变量用的是原来的还是通过第一个得到的新位置??
  • 问题3解决方案:通过网上查阅资料以及查阅资料后对书本的再理解,两个都讲的是:“如果关键字x哈希到已经被占用的位置P,则要常识下一个位置P',若P'也被占用,则用P通过第二种哈希函数获得P''”因此用的是初次获得的位置P

代码托管

上周考试错题总结

其他(感悟、思考等,可选)

  • 哈希函数是将插入的数据当作自变量,通过一种算法来尽可能地使每个数都有一个独有的值,这个值会成为哈希表的下标。

  • 弱关键字:弱引用是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生之前,当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

.

  • 关于哈希方法中解决冲突的方法的学习:
  1. 链式方法
  • 使用溢出区的链式方法

该链式方法是将哈希表整体划分为元素储存区和溢出区。例如像这样子的:

哈希表中的每个位置不仅保存元素,也保存链表中下一个冲突元素为于溢出区的下标。

局限性:当一个数组作为哈希表的时候,数组会有满的可能,需要用到动态扩容的方法。这种方法最坏的情况是:元素不能很好地分散在列表中,会导致哈希表的插入和查找的复杂度都变为O(n)

  • 使用链
    该链式方法是哈希表中保存的是一个链表,使哈希表中的每一个位置能够既保存元素,又能够保存下一个结点的引用。当发生冲突的时候,冲突的元素会放在下一个结点中且该结点为空。

这个方法一个比上面使用溢出区的链式方法好的地方在于动态扩容的难度变小,因为冲突的元素不会放在主哈希表中,扩容的标准看主哈希表即可。

  1. 开放地址方法
  • 线性探测方法

通过哈希函数获得的哈希表下标,如果该位置已经占用,则在哈希函数中对自变量进行递增,直到找到位置。

局限性:这样做的同时也会将其他元素的位置给占用。而且如果哈希函数比较简单,会导致元素在哈希表中汇聚,从而影响到插入以及查找的性能。

  • 二次探测方法

通过对哈希函数进行调整使冲突元素在当前位置的周围找到空位插入。

公式:newhashcode(x) = hashcode(x) + (-1)(i-1)((i+1)/2)2(i的取值是1到 表长-1)

假设当前被占用的位置是p,使用该方法就会对p,p+1,p-1,p+4,p-4,p+9,p-9...这些位置进行查找,将元素插入在空位置中,从而实现冲突的解决。

相比线性探测方法,这种方法引发聚集的趋势没那么强。

  • 双哈希方法

.

取模运算:index = HashCode(Key) % Length

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 15篇 400小时
第一周 200/200 2/2 20/20
第二周 20/220 1/3 20/40
第三周 645/865 1/4 14/54
第五周 654/1519 1/5 18/72
第六周 436/1955 1/6 16/88
第七周 839/2794 2/8 20/108
第八周 2143/4937 2/10 25/133
第九周 1368/6305 2/12 18/151
第十周 2452/8757 1/13 16/167
第十一周 795/9552 1/14 18/185
  • 计划学习时间:16小时

  • 实际学习时间:18小时

posted @ 2017-11-19 17:20  FunnyOne  阅读(131)  评论(0编辑  收藏