20162322朱娅霖

导航

 

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

教材学习内容总结

哈夫曼树

什么是哈夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

哈夫曼树的构造方法

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造方法为:

  1. 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
  2. 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
  3. 从森林中删除选取的两棵树,并将新树加入森林;
  4. 重复2、3步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

哈夫曼树编码的解码

  1. 数据解压缩,将压缩compressed中的0/1序列进行Huffman译码,返回译码字符串
  2. 分隔compressed字符串,遍历compresssed中的每个字符,每个数字
  3. 若为'0'则返回左孩子,若为'1'则返回右孩子
  4. 直到为叶结点,读取该结点的元素加入到text中

堆和优先队列

堆(heap)是一棵完全二叉树,其中每个元素都要大于或小于它的所有孩子。
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树

堆的实现

向堆中添加一个元素

  1. 将这个元素添加为叶结点
  2. 将其向上移动到合适的位置

从堆中删除最大元素

  1. 利用最后的叶结点来取代根
  2. 将其向下移动到合适的位置

优先队列

(详见“教材学习中的问题和解决过程”)

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

(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

  • 问题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小时

  • 改进情况:多思考!多思考!

参考资料

posted on 2017-11-05 14:34  竹蕴澜  阅读(213)  评论(0编辑  收藏  举报