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开始,因此我当时觉得是没有答案。
这道题是我的理解出了错误,将它理解为“某个节点的高度和深度是相同的”
粗心了。。
这道题答案出了问题,我是对的。
代码托管
其他(感悟、思考等,可选)
到这周为止我终于完全已经跟上学习进度啦,可喜可贺。哈哈哈哈。