20172320 2018-2019-1 《Java程序设计》第七周学习总结
Posted garolwz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172320 2018-2019-1 《Java程序设计》第七周学习总结相关的知识,希望对你有一定的参考价值。
20172320 2018-2019-1 《Java程序设计》第七周学习总结
教材学习内容总结
- 二叉查找树是一种带有附加属性的二叉树,即对树中的每个结点,其左孩子都要小于其父节点,而父节点又要小于等于右孩子
- 二叉查找树的定义是二叉树的扩展,因此操作是二叉树中已定义的哪些操作的补充
操作 | 说明 |
---|---|
addElement | 往树中添加一个元素 |
removeElement | 从树中删除一个元素 |
removeAllOccurrences | 从树中删除所指定元素的任何存在 |
removeMin | 删除树中的最小元素 |
removeMax | 删除树中的最大元素 |
findMin | 返回一个指向树中最小元素的引用 |
findMax | 返回一个指向树中最大元素的引用 |
- 有序列表的链表实现分析和二叉查找树实现分析
操作 | LinkedList | BinarySearchTreeList |
---|---|---|
removeFirst | O(1) | O(logn) |
removeLast | O(n) | O(logn) |
remove | O(n) | O(logn)* |
first | O(1) | O(logn) |
last | O(n) | O(logn) |
contains | O(n) | O(logn) |
isEmpty | O(1) | O(1) |
size | O(1) | O(1) |
add | O(n) | O(logn)* |
add操作和remove操作都可能导致树变得不平衡
- 如果二叉查找树不平衡,其效率可能比线性结构还低,如蜕化树
平衡化技术中通用的术语
?右旋:左孩子绕着其父结点向右旋转
?使树根的左孩子元素称为新的根元素
?使原跟元素成为这个新树根的右孩子元素
?使原树根的左孩子的右孩子成为原树根的新的左孩子
?左旋:指右孩子绕其父节点向左旋转
?使树根的右孩子元素成为新的根元素
?使原树根元素成为这个新树根的左孩子元素
?使原树根右孩子结点的左孩子成为原树根的新的右孩子
?右左旋:对于由树根右孩子的左子树中较长路径而导致的不平衡,必须先让树根右孩子的左孩子,绕着树根的右孩子进行一次旋转,然后再让所得的树根右孩子绕着树根进行一次左旋
?左右旋:对于由树根左孩子的右子树中较长路径而导致的不平衡,必须先让树根左孩子的右孩子,绕着树根的左孩子进行一次旋转,然后再让所得的树根左孩子绕着树根进行一次左旋
AVL树
?平衡化树的一般性方法,自树根而下的路径最大长度必须不超过log2 n,而且自树根而下的路径最小长度必须不小于log2 n -1,AVL树是上述树的一种变体,ALV树中任何两个结点的高度差值最大不超过1
?右子树的高度减去左子树的高度称为该结点的平衡因子,若平衡因子大于1或小于-1,则以该结点为树根的子树需要重新平衡
?树或树的任何子树只有两种途径能变得不平衡:插入结点和删除结点
?AVL树的右旋:如果某结点的平衡因子为-2,则意味着该结点的左子树中有一条过长的路径,若其左孩子的平衡因子为-1,则意味着较长的路径处在这个左孩子的左子树中,需将左孩子绕着初始结点进行一次右旋
?AVL树的左旋:如果某结点的平衡因子为+2,则意味着该结点的右子树中有一条过长的路径,若其右孩子的平衡因子为+1,则意味着较长的路径处在这个右孩子的右子树中,需将右孩子绕着初始结点进行一次左旋
?AVL树的右左旋:如果某结点的平衡因子为+2,则意味着该结点的右子树中有一条过长的路径,若其右孩子的平衡因子为-1,则意味着较长的路径处在这个右孩子的左子树中,则先让初始结点右孩子的左孩子绕着初始结点的右孩子进行一次右旋,然后让初始结点的右孩子绕着初始结点进行一次左旋
?AVL树的左右旋:如果某结点的平衡因子为-2,则意味着该结点的左子树中有一条过长的路径,若其左孩子的平衡因子为+1,则意味着较长的路径处在这个左孩子的右子树中,则先让初始结点左孩子的右孩子绕着初始结点的左孩子进行一次左旋,然后让初始结点的左孩子绕着初始结点进行一次右旋红黑树
?规则
?根结点为黑色
?红色结点的所有孩子都为黑色
?从树根到树叶的每条路径都包含同样数目的黑色结点
?红黑树中的平衡限制没有AVL树严格,但它们的序仍然是logn
?红黑树元素插入
?把新元素的颜色设为红色
?插入元素后,重新平衡化该树,根据需要改变元素的颜色
?设置树根的颜色为黑色
教材中遇到的问题和解决过程
- 问题1:AVL树与红黑树的区别
- 解决方案: ?AVL 树因其平衡的限制,可以始终保持 O(logn) 的时间复杂度
?AVL是严格的平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多
?红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低开销
?搜索的次数>插入和删除,选择AVL树;搜索,插入删除次数几乎差不多,选择红黑树 - 问题2:红黑树插入删除元素后如何改变元素颜色?
解决方案:
代码调试中的问题和解决过程
- 问题1:PP11.3toString异常
解决方案:尚未解决
错题分析
无测试
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
20172327 - 结对学习内容
?阅读第11章节,运行教材上的代码
?完成程序设计项目PP10.3、PP11.8
?完成课后自测题,并参考答案学习
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 20/20 | |
第二周 | 328/328 | 1/3 | 20/40 | |
第三周 | 1597/ 1925 | 1/4 | 20/60 | |
第四周 | 1153/3850 | 1/5 | 20/80 | |
第五周 | 1583/5433 | 1/6 | 20/100 | |
第六周 | 1515/6948 | 1/7 | 20/120 |
参考资料
以上是关于20172320 2018-2019-1 《Java程序设计》第七周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
# 20172320 2018-2019-1 《Java程序设计》第八周学习总结
20172320 2017-2018-2 《程序设计与数据结构》实验四报告
20172320 2017-2018-2 《程序设计与数据结构》实验五报告