20162316刘诚昊 第九周学习总结

20162316刘诚昊 2017-2018-2 《Java程序设计》用数组实现循环队列


教材学习内容总结

第十八掌 堆和优先队列

1.堆是一棵完全二叉树,分为最大堆最小堆
  1.1最大堆的每个元素都要大于等于它的所有孩子(最小堆反之)。
  1.2堆有三种基本操作:向堆中添加新元素、找到最大值、以及删除最大值。
2.向最大堆中添加新元素时,先将其称为新叶节点,位置尽可能靠左。接下来对换相应位置,保证其为堆。
3.向最大堆中删除最大值时,也即删除根节点时,将最后一层最右边的叶节点置于根节点位置,再开始交换位置直至成为新的堆。
4.堆排序是将一组元素一项一项地插入到堆中,然后一次删除一个,最大堆得到降序的排列结果,最小堆反之。
5.优先队列是一个服从两个有序规则的集合。
  ——更高优先级队列的在前,相同优先级则遵从FIFO规则。优先队列并不是FIFO队列


课堂学习内容

一、哈夫曼树

哈夫曼树有着类似于最大堆的性质,但并非一定是完全树;它以当前数组中最小两个数构成节点后相加得到新的数,将这个数归于数组中再继续做相同的步骤。

二、堆

堆常被用来实现优先队列,First in,Largest out.在这堂课老师讲的和书上较多重复,便不再赘述。


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

Q1:教材中提到的都比较简单,但哈夫曼树的编码方面有些没能理解。

解决方案:在课堂上看着老师给的任务我有点稀里糊涂,没听懂是什么意思,确实是没能把哈夫曼树和它的编码联系起来,一开始觉得完全是两回事怎么融合到一起的呢?
  后来在网上查资料得知它是将叶子节点规定好位置以后,按从根到它的左或右枝的路径,以0或1的方式给出。另外老师当时讲一个字符的编码不能是另一个编码的前缀,这种方式很优秀地避开了这种错误。


考试错误总结


虽然A、C看起来一样,但我确实想错了。错误之处在于:高度与深度应该都是从0开始,而非1开始,因此我当时觉得是没有答案。


这道题是我的理解出了错误,将它理解为“某个节点的高度和深度是相同的”


粗心了。。


这道题答案出了问题,我是对的。


代码托管


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

到这周为止我终于完全已经跟上学习进度啦,可喜可贺。哈哈哈哈。

原文地址:https://www.cnblogs.com/ignor/p/7789341.html