20162322 2017-2018-1 《程序设计与数据结构》第9周学习总结
教材学习内容总结
哈夫曼树
什么是哈夫曼树?
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。
哈夫曼树的构造方法
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造方法为:
- 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
- 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
- 从森林中删除选取的两棵树,并将新树加入森林;
- 重复2、3步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
哈夫曼树编码的解码
- 数据解压缩,将压缩compressed中的0/1序列进行Huffman译码,返回译码字符串
- 分隔compressed字符串,遍历compresssed中的每个字符,每个数字
- 若为'0'则返回左孩子,若为'1'则返回右孩子
- 直到为叶结点,读取该结点的元素加入到text中
堆和优先队列
堆
堆(heap)是一棵完全二叉树,其中每个元素都要大于或小于它的所有孩子。
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
堆的实现
向堆中添加一个元素
- 将这个元素添加为叶结点
- 将其向上移动到合适的位置
从堆中删除最大元素
- 利用最后的叶结点来取代根
- 将其向下移动到合适的位置
优先队列
(详见“教材学习中的问题和解决过程”)
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
- 问题1:对于优先队列的定义不太理解
- 问题1解决方案:
书中定义:
优先队列是一个服从两个有序规则的集合。首先,具有更高优先级的项排在前面。其次,具有相同优先级的项按先进先出的规则排列。
个人对于优先队列定义的理解:
优先队列,顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队。在生活中,优先队列的例子挺常见的,比如在排队乘电梯时,老师优先上电梯,同学们按照排队的顺序乘梯。
- 问题2:优先队列与堆有什么关系?
- 问题2解决方案:
优先队列的实现可以用多个队列来实现,具有相同优先级的项保存在一个队列中。
但是,由于堆的“每个元素都要大于或小于它的所有孩子”的特性,并且堆排序是“先将一组元素一项一项插入到堆中,然后一次删除一个”,因此可以利用堆来实现优先队列。
代码调试中的问题和解决过程
-
问题1:教材中代码出错
-
问题1解决方案:联想到之前
MaxHeap
中有个方法是removeMax()
觉得教材应该是出错了,改为removeMax()
就正好合适。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结(第七周 树)
使用数组实现树,将索引n处的元素的子元素存储在索引__2n + 1和2n + 2_中。
选项c代表使用数组实现树的最直接最优雅的解决方案。
在后序遍历中,根是树中访问的最后一个元素。
A. true B. false
正确答案:B 我的答案:A后序遍历访问左子树,然后访问右子树,然后访问根。所以,根始终是最后一个被访问的元素。这道题的答案应该错了。
结对及互评
点评:
- 博客中值得学习的或问题:
- 可以多在博客中展现自己的思考
本周结对学习情况
- 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 | 1/5 | 20/100 | 栈 |
第六周 | 300/1786 | 2/7 | 20/120 | 队列 |
第七周 | 844/2630 | 3/10 | 20/140 | 树 |
第八周 | 544/3174 | 2/12 | 20/160 | 实验二(树)、二叉查找树 |
第九周 | 375/3645 | 2/14 | 20/180 | 哈夫曼树、堆和优先队列 |
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:多思考!多思考!