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


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

    教材学习内容总结

    • 1、 堆:堆是一棵完全二叉树,其中每个元素都大于等于其所有子结点的值。

    • 2、向堆中添加一个元素
      (1)首先将这个元素添加为叶结点,然后将其向上移动到合适的位置;

    • 3、从堆中删除最大元素
      (1)利用最后的叶结点来取代根,然后将其向下移动到合适的位置;

    • 4、堆的排序
      (1)堆排序利用堆的基本特性对一组元素进行排序;

    • 5、优先队列
      (1)优先队列不是FIFO队列。他根据优先级排列元素,而不是根据他们进入队列的次序来排序;

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

    • 问题1:课上的活动“说明堆与二叉排序树的差别”课上没有太理解,课下又查阅了一些资料,做了进一步的拓展。
    • 问题1解决方案:
      在二叉排序树中,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序序列。所以,二叉排序树是结点之间满足一定次序关系的二叉树;

      堆是一个完全二叉树,并且每个结点的值都大于或等于其左右孩子结点的值(这里的讨论以大根堆为例),所以,堆是结点之间满足一定次序关系的完全二叉树。

      具有n个结点的二叉排序树,其深度取决于给定集合的初始排列顺序,最好情况下其深度为log n(表示以2为底的对数),最坏情况下其深度为n;
      具有n个结点的堆,其深度即为堆所对应的完全二叉树的深度log n 。

      在二叉排序树中,某结点的右孩子结点的值一定大于该结点的左孩子结点的值;在堆中却不一定,堆只是限定了某结点的值大于(或小于)其左右孩子结点的值,但没有限定左右孩子结点之间的大小关系。

      在二叉排序树中,最小值结点是最左下结点,其左指针为空;最大值结点是最右下结点,其右指针为空。在大根堆中,最小值结点位于某个叶子结点,而最大值结点是大根堆的堆顶(即根结点)。

      二叉排序树是为了实现动态查找而设计的数据结构,它是面向查找操作的,在二叉排序树中查找一个结点的平均时间复杂度是O(log n);
      堆是为了实现排序而设计的一种数据结构,它不是面向查找操作的,因而在堆中查找一个结点需要进行遍历,其平均时间复杂度是O(n)。

    • 问题2:对教材18.4节优先队列的相关知识进行了一些深入了解。
    • 问题2解决方案:上网查阅博客,结合图例和代码了解到:
      优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~
        优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素
        优先队列的类定义  
        优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;
    1. 插入一个新元素;
    2. 删除.在最小优先队列(min priorityqueue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.

    代码调试中的问题和解决过程

    • 问题1:教材410页18.4的代码调试出了问题,两个方法不能实现。
    • 问题1解决方案:贴心的课代表在班群里发了要将addElement方法改为add方法,同时将removeMin改为removeMax;
      上面的问题解决后又发现PriorityQueueNode类实现了Comparable接口,用到了泛型,把比较的类型设为PriorityQueueNode类型时,漏了一个

    代码托管

    结对及互评

    • 博客中值得学习的或问题:
      • 对于教材代码研究的很透彻

    本周结对学习情况

     [20162305](http://www.cnblogs.com/lyxwatm/p/7710984.html)
    - 结对学习内容
        - 梳理教材内容
        - 理解课上内容
    

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

    - 树和堆的内容都讲了之后发现有一点混乱。。。。要找时间把这两部分内容梳理一下,
    

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/1 10/10
    第二、三周 303/303 2/3 10/20
    第四、五、六周 700/1003 2/5 10/20
    第七周 663/1666 1/6 15/35
    第八、九周 754/2420 2/8 19/54
    • 计划学习时间:20小时

    • 实际学习时间:19小时

    参考资料

  • 相关阅读:
    javap -c 字节码含义
    redis --- lua 脚本实现原子操作
    感想
    AbstractAdvisingBeanPostProcessor---spring aop 处理器
    spring 自定义解析类
    protobuf3 语法解析
    Java设计模式之builder模式
    工厂和抽象工厂模式
    RESTful入门
    RocketMQ入门
  • 原文地址:https://www.cnblogs.com/guominxiaocao/p/7788218.html
Copyright © 2020-2023  润新知