20172327 2018-2019-1 《程序设计与数据结构》第七周学习总结

20172327 2018-2019-1 《程序设计与数据结构》第七周学习总结

教材学习内容总结

第十一章 二叉查找树

概述

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

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

3.
| 方法 | 描述 |
| -------- | :------------------------------------------: |
| addElement | 往树中添加一个元素 |
| removeElement | 从树中删除一个元素 |
| removeAllOccurrences | 从树中删除所指定元素的任何存在 |
| removeMin | 删除树中最小的元素 |
| removeMax | 删除树中最大的元素 |
| findMin | 返回一个指向树中最小元素的引用 |
| findMax | 返回一个指向树中最小元素的引用 |

用链表实现二叉查找树

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

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

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

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

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

  • 问题1:在实现ArrayOrderedListTest测试时,我遇到了显示最后一个数字时,人家显示为null这个问题。
    图片
  • 解决分析,在我对前面ArrayList类检查时,发现我在显示last时,将rear-1不小心写成rear了,所以它所读取的是最后一个后边的,所以肯定为空。

代码托管

结对及互评

正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
代码调试中的问题和解决过程, 无问题
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)

  • 20172317
    基于评分标准,我给以上博客打分:4分。得分情况如下:
  • 20172320
    基于评分标准,我给以上博客打分:8分。得分情况如下:

    • 结对学习内容

      • 教材第11章,运行教材上的代码
      • 完成课后自测题,并参考答案学习
      • 完成程序设计项目:至少完成PP11.3、PP11.8

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

这周学的有点麻烦,栈还行,就是链表有点糊涂。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 1306/1306 1/2 20/28
第三周 1291/2597 1/3 18/46
第四周 4361/6958 2/3 20/66
第五周 1755/8713 1/6 20/86
第六周 3349/12062 1/7 20/106

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:10小时
  • 实际学习时间:8小时
  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/mrf1209/p/9898651.html

时间: 2024-10-07 23:33:49

20172327 2018-2019-1 《程序设计与数据结构》第七周学习总结的相关文章

20172327 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172327 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 字符串的拼接和转义序列的使用 变量的声明和使用 讨论语法及表达式的处理 定义数据转换类型和实现类型转换的机制 创建Scanner类 教材学习中的问题和解决问题 暂无 代码学习中的问题和解决过程 问题1:在提交过程中,突然遇到无法上传的情况 问题2解决方案:通过上网查找,输入git pull之后弹出一个编辑框,选择关闭之后,再次用git push就成功了. 问题2:在按照例题2.10打代码时,Jav

20172327 2018-2019-1 《程序设计与数据结构》第九周学习总结

20172327 2018-2019-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 第十五章 图 无向图 1.图的概念(非线性结构):允许树中每个结点与多个结点相连,不分父子结点. 2.图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: 边由连接的定点对来表示,如:(A,B),(C,D),表示两顶点之间有一条边. 3.无向图:顶点之间无序连接. 如:边(A,B)意味着A与B之间的连接是双向的,与(B,A)的含义一样. 4.邻接(邻居):两个顶点之间有边连接. 5.自

20172305 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172305 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书的第一章简单的介绍了计算机和JAVA的历史,基础内容很多,代码的讲解还没用正式进入,本周一直在做敲代码的准备,简单敲了老师给的"Hello World!"以及书后的PP1.3.PP1.4等简单的小程序. 教材学习中的问题和解决过程 问题1:三种不同类型的错误,运行错误和逻辑错误的混淆 问题1解决方案:针对EX1.20的"希望做加法时却做里乘法"进行了网上

20172314 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172314 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书第一章为计算机系统概述,前面是一些计算机相关的基础知识,让我对计算机有了一个总体的认识,不再是一片空白了,对主存储器和CPU影响深刻,主存储器用于保存程序和数据,CPU执行程序指令.在接下来的Java编程语言与程序开发部分,开始看的时候有点迷茫,不是很理解,后来先按照作业中附带的流程完成一些代码托管之后,接触了完整的简单的程序之后,再回过头来看书,看到的一些陌生的名词在脑海中就有了实际的对应,

20172317《程序设计与数据结构》第一周学习总结

20172317 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 重新温习了一遍计算机的基础 总算了解了局域网广域网因特网万维网这些东西之间的区别了 通过URL的例子知道了网址各个部分的含义 对Java编程语言和程序开发有了一个粗浅的了解 教材学习中的问题和解决过程 问题:练习题SR1.13出现了答案与题目不相符的情况 问题解决方案:题中有个选项是"网卡",答案中没有,反而有个题目没有的选项"调制解调器"(俗称"

20172322 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案

20172328《程序设计与数据结构》第二周学习总结

20172328李馨雨<程序设计与数据结构>第二周学习总结 又到周五,李馨雨同学要开始写博客了.让我们开始吧!(????) 教材学习内容总结 1.首先是String类定义的字符串,然后是print和println的区别.转义字符的学习.(让我印象深刻的\b[回车符]在字符串结尾不显示哈哈,及其更新的\t[换行符],还有在课堂上真正明白了什么是回车.) 2.了解变量.常量.赋值语句.变量:保存数据的内存单元.常量:坚定自己不会变的数据!除非你用java的反射(有点复杂,改权限.去修饰符等等.没实

学号20172328《程序设计与数据结构》第九周学习总结

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

20172326 《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使

20172322 2017-2018-2 《程序设计与数据结构》第九周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常 学会了使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出.使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). "未捕获的异常"指在编译过程中不会被编译软件显示异常但是在运行时会出现异常导致程序直接退出,例如:"ArithmeticException"."In