zoukankan      html  css  js  c++  java
  • 20182331 2019-2020-1《数据结构与面向对象程序设计》第9周学习总结

    20182331 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

    教材学习内容总结

    • 概述

    1.二叉查找树是一种带有附加属性的二叉树,即对树的每个结点都有左结点小于父结点,右结点小于或等于父结点。

    2.二叉查找树的定义是二叉树定义的扩展。

    方法 描述
    addElement 往树中添加一个元素
    removeElement 从树中删除一个元素
    removeAllOccurrences 从树中删除所指定元素的任何存在
    removeMin 删除树中最小的元素
    removeMax 删除树中最大的元素
    findMin 返回一个指向树中最小元素的引用
    findMax 返回一个指向树中最小元素的引用
    • 用链表实现二叉查找树

    1.每个BinaryTreeNode对象要维护一个指向结点所储存元素的引用,另外还要维护指向结点的每个孩子的引用。

    • 用有序列表实现二叉查找树

    1.用BinarySearchTreeList类实现ListADT接口和OrderedListADT接口。

    操作 说明
    add 向列表添加一个元素
    removeFirst 删除列表的首元素
    removeLast 删除列表的末元素
    remove 删除列表中一个特定元素
    first 考察列表前端那个元素
    last 考察列表末端那个元素
    contains 判定列表是否含有一个特定元素
    is Empty 判定列表是否为空
    size 判定列表中的元素数目

    3.树的主要使用之一就是为其他集合提供高效的实现。

    4.BinarySearchTreeList实现的分析:

    操作 说明 LinkedList BinarySearchTreeList
    add 向列表添加一个元素 O(n) O(log n)*
    removeFirst 删除列表的首元素 O(1) O(log n)
    removeLast 删除列表的末元素 O(n) O(log n)
    remove 删除列表中一个特定元素 O(n) O(log n)*
    first 考察列表前端那个元素 O(1) O(log n)
    last 考察列表末端那个元素 O(n) O(log n)
    contains 判定列表是否含有一个特定元素 O(n) O(log n)
    isEmpty 判定列表是否为空 O(1) O(1)
    size 判定列表中的元素数目 O(1) O(1)

    *add操作和remove操作都可能导致树变得不平衡。

    • 平衡二叉查找树

    1.如果二叉查找树不平衡,其效率可能比线性结构还要低。

    2.维护树的平衡有着多种算法,有些蛮力方法(中序遍历,把数组的中间元素作为树根,再构造出左平衡子树和右平衡子树。),有些方案更优美(AVL树和红黑树)。

    3.右旋: 在最小平衡子树根节点平衡因子>=2且在根节点的左孩子的左孩子插入元素,进行右旋

    使树根的左孩子元素成为新的根元素。
    使原根元素成为这个新树根的右孩子元素。
    使原树根的左孩子的右孩子,成为原树根的新的左孩子。

    4.左旋: 在最小平衡子树根节点平衡因子>=-2且在根节点的右孩子的右孩子插入元素,进行左旋。

    使树根的右孩子元素成为新的根元素。
    使原根元素成为这个新树根的左孩子元素。
    使原树根的右孩子的左孩子,成为原树根的新的右孩子。

    5.右左旋:最小平衡子树根节点(80)的右孩子(100)的左孩子(90)的子节点(95)插入新元素,先绕根节点的右孩子节点(100)右旋,再围根节点(80)左旋

    6.左右旋:在最小平衡子树根节点(80)的左孩子(50)的右孩子(70)的子节点插入新元素,先绕根节点的左孩子节点(50)右旋,再围根节点(80)左旋

    • 实现二叉查找树:AVL树

    1.右子树的高度减去左子树的高度称为该结点的平衡因子。

    2.树(或树的任何子树)只有两种途径能变得不平衡:插入结点或删除结点。

    3.因为需要上溯树,所以AVL树通常最好实现为每个结点都包含一个指向其父结点的引用。

    4.AVL树的插入操作首先会按照普通搜索二叉树的插入操作进行,当插入一个数据后,我们会沿着插入数据时所经过的的节点回溯,回溯的过程中会判回溯路径中的每个节点的左子支高度与右子支高度之差的绝对值是否超过1,如果超过1我们就进行调整,调整的目的是使得该节点满足AVL树平衡的定义。

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

    问题1:自己看了一下红黑树,不是很理解,上网查了一下

    问题1解决方案:红黑树和之前所讲的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。不过在我了解了红黑树的实现原理后,并不相信这是真的,关于这一点我们会在后面进行讨论。
    红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。之前我们在讲解AVL树时,已经领教过AVL树的复杂,但AVL树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。

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

    问题1:在无返回值的条件下语句有return的作用?
    问题1解决方法:return的使用一直在存在返回值条件下使用,但是从未在无返回值条件下使用。如果return后面不接内容的话,就会结束该方法并不会输出任何内容的。
    (1.)return语句:是指结束该方法,继续执行方法后的语句。
    (2.)break语句:是指在循环中直接退出循环语句(for,while,do-while,foreach),break之后的循环体里面的语句也执行。
    (3.)continue语句:是指在循环中中断该次循环语句(for,while,do-while,foreach),本次循环体中的continue之后语句不执行,直接跳到下次循环。
    问题2:在方法中,我将要进行操作的结点作为形参放入方法中(以 node T为例),然后对T.left进行操作,但是我返回到主程序后,发现主函数的树并没有发生变化。

    问题2解决办法:

    第一步:通过调试我发现在方法里,树的确变化了,证明错误不在我的代码思路上。

    第二步:经过我的实验发现,若直接对结点T进行操作,主程序里的树是可以变化的。因此,我意识到只有对形参本身进行操作,才会将操作保存到主程序中,若用形参去调用其他方法,这个变化不会保存。

    代码托管

    上周考试错题总结

    1.Which of the following methods removes an element from a queue?

    A . enqueue
    B . dequeue
    C . first
    D . pop
    E . push
    解析:dequeue方法从队列中删除元素

    2.In an ideal implementations of a stack and a queue, all operations are ______________________ .

    A . O(1)
    B . O(n)
    C . O(n log n)
    D . O(n2)
    E . it depends on the operation
    解析:

    在堆栈和队列的良好实现中,所有操作都需要固定的时间。

    3.It is possible to implement a stack and a queue in such a way that all operations take a constant amount of time.

    A . true
    B . false
    解析:堆栈和队列的理想实现要求所有操作都需要恒定的时间量。

    结对及互评

    • 博客中值得学习的或问题:
      • 学习深刻,自己有方法
      • 代码中值得学习的或问题:
      • 使用继承减少代码的重复编写
      • 基于评分标准,我给本博客打分:8分。得分情况如下:
      • 正确使用Markdown语法(加1分)
      • 模板中的要素齐全(加1分)
      • 教材学习中的问题和解决过程, 一个问题加1分
      • 代码调试中的问题和解决过程, 一个问题加1分
      • 有动手写新代码的加1分
      • 结对学习情况真实可信的加1分

    点评过的同学博客和代码

    • 本周结对学习情况
    • 20182309
      • 结对学习内容
        • 阅读教材第16章和第17章内容
        • 代码托管到码云上
        • 完成课后自测题,并参考答案学习
        • 完成课后练习题
        • 完成程序设计项目,至少完成pp16.6,pp17.1

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 109/109 2/2 20/20
    第二、三周 729/838 2/4 47/67
    第四周 750/1588 2/6 22/89
    第五周 1588/2698 2/7 34/133
    第六周 1350/4035 2/9 24/157
    第九周 3364/7399 5/14 97/254
    第十周 618 /8071 1/15 22/276
    第十一周 772/8843 3/18 16/292

    参考资料

  • 相关阅读:
    鸟哥的私房菜基础篇之Linux 开机流程分析
    鸟哥的私房菜基础篇之Linux 档案属性与目录配置
    鸟哥的私房菜基础篇之认识BASH Shell
    Linux中Top命令结果的各项含义
    鸟哥的私房菜基础篇之认识系统服务 daemons
    鸟哥的私房菜基础篇之Linux 例行性命令的建立
    鸟哥的私房菜基础篇之Linux档案与目录管理
    鸟哥的私房菜基础篇之什么是Linux
    鸟哥的私房菜基础篇之首次开机与关机
    修改oracle的processes和session(转)
  • 原文地址:https://www.cnblogs.com/gao-kuanrang/p/11891386.html
Copyright © 2011-2022 走看看