• 20162322 朱娅霖 作业009 堆和优先队列


    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小时

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

    参考资料

  • 相关阅读:
    cqyz oj | 单峰排列
    cqyz oj/uva 548 | 二叉树
    cqyz oj | 树网的核 | 树的直径
    cqyz oj | 树上的询问 | 最近公共祖先
    cqyz oj | 循环逆序对 | 逆序对 | 树状数组
    cqyz oj | 潜水比赛 | 贪心
    YOLO v3 & Pascal VOC数据集
    太阳爆发分类
    PPT制作
    anaconda
  • 原文地址:https://www.cnblogs.com/zyl905487045/p/7776801.html
Copyright © 2020-2023  润新知