[MIT6.006] 6. AVL Trees, AVL Sort AVL树,AVL排序
之前第5节课留了个疑问,是关于“时间t被安排进R”的时间复杂度能不能为Ο(log2n)?”和BST时间复杂度Ο(h)的关系。第6节对此继续了深入的探讨。首先我们知道BST的h是指树的高,即从根到叶子结点最长路径的长度。但由于树结构不同平衡情况,高h的结果也不一样,如下图所示:
一、结点的高
由此可以看出,平衡树结构下的高h具有计算性。那么接下来我们再看下各结点的高(height of node)的计算方式,它是从该节点位置下到最底部的叶子节点的最长路径长度 (height of node = max(左子树高,右子树高) + 1):
二、AVL
我们如果想让Ο(h)=Ο(log2n),就必须把BST变为平衡树,但现实中,不一定所有数列都能构成完全的平衡树,但可以构成高度平衡树AVL(由Adelson-Velsky和E.M. Landis发明的),在该树下,每个结点的左右子树相差最多±1。如下图所示:
但有时会出现很糟糕的情况:右子树高比左子树高多1.
假设AVL节点数量为Nh,那么由上图,可得Nh = n = 1 + Nh-1 + Nh-2。这个如果算下去(课程没给出具体过程),会得到Nh > Fh = φh/√5,其中Fh是斐波那契数列(数字1,1,2,3,5,8-构成了一个序列。这个数列前面相邻两项之和,构成了后一项),φ=1.618,最后可以通过下图的得到h小于1.44log2n。
除了通过上述方法,还有种更简单的方法估算h的大小:
在该方法下得到的结果2log2n不如1.44log2n来的更为准确。
三、AVL的插入
AVL的插入分两步走:
- 简单的二分搜索树BST插入(simple BST insert);
- 从修改结点向上满足AVL属性,因为下面插入可能会影响上面的结果(Fix AVL property from changed node up)。
举个例子可能会更好的解释上面的步骤:
(注:蓝色箭头表明哪边子树比较重。)
上图我们给定了一个BST,然后按照BST插入的方法将23插入进去,我们会发现,29-26-23不符合AVL的属性。为了解决这个问题,AVL有个旋转Rotiation操作,如下图:
如果我们对29-26-23进行右旋转即可得到正确的AVL结构:
除了上面这种情况,如果出现下图这种插入55后的情况,可以使用双旋转操作(double/two rotation):
那么现在我们来假设一个通用场景,总结下AVL的调整方法。
假设x是最低违背AVL的结点,然后right(x)(或x.right)更高。出现下面两种情况则可以参考下面的旋转方案:
四、AVL排序
- 插入n个items - 每插入一个item要花费h时间,h在平衡树下为log2n,因此n个items为Ο(nlog2n) ;
- in-order traversal 按顺序遍历输出 - Ο(n) 。
五、总结
对于插入、删除、最小化,使用Heap和AVL就可以了,但是如果要求next_larger和next_smaller得要平衡二分查找树,不过现实很难满足完全平衡,那么用AVL高度平衡树来做也行。
[MIT6.006] 6. AVL Trees, AVL Sort AVL树,AVL排序的更多相关文章
- [MIT6.006] 4. Heaps and Heap Sort 堆,堆排序
第4节课仍然是讲排序,但介绍的是一种很高效的堆排序. 在编程过程中,有时候会需要进行extrat_max的操作,即从一个数列里挨个抽取最大值并将其它从原数列中移除.而排序问题也可以看作是一个extra ...
- Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树
小结: 1.红黑树:典型的用途是实现关联数组 2.旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质.为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些 ...
- [MIT6.006] 7. Counting Sort, Radix Sort, Lower Bounds for Sorting 基数排序,基数排序,排序下界
在前6节课讲的排序方法(冒泡排序,归并排序,选择排序,插入排序,快速排序,堆排序,二分搜索树排序和AVL排序)都是属于对比模型(Comparison Model).对比模型的特点如下: 所有输入ite ...
- [MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找
[MIT6.006] 系列笔记将记录我观看<MIT6.006 Introduction to Algorithms, Fall 2011>的课程内容和一些自己补充扩展的知识点.该课程主要介 ...
- 定制对ArrayList的sort方法的自定义排序
java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...
- 用Java集合中的Collections.sort方法对list排序的两种方法
用Collections.sort方法对list排序有两种方法第一种是list中的对象实现Comparable接口,如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...
- java中Collections.sort()方法实现集合排序
1.Integer/String泛型的List进行排序 List <Integer> integerlist = new ArrayList<Integer>(); //定 ...
- 【Python】 sort、sorted高级排序技巧
文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...
- python sort、sorted高级排序技巧
文章转载自:脚本之家 Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的 ...
随机推荐
- 警惕char类型直接相加
今天在写某个程序需要对两个数字字符串进行相加操作,比如字符串1:12345,字符串2:23456.需要1和2相加.2和3相加.就是两个字符相同位置的数进行相加. 这个一看很好完成,写一个for,然后取 ...
- 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配
简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...
- rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间
上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...
- Linux下批量kill掉进程
ps -ef|grep java|grep -v grep|cut -c 9-15|xargs kill -9 管道符"|"用来隔开两个命令,管道符左边命令的输出会作为管道符右边命 ...
- 如何理解码分复用中的码分多址CDMA?
如何理解CDMA? 推荐参考大神文章 https://blog.csdn.net/dog250/article/details/6420427 (码分多址(CDMA)的本质-正交之美) 首先我们先看& ...
- codefroces中的病毒,这题有很深的trick,你能解开吗?
大家好,欢迎阅读周末codeforces专题. 我们今天选择的问题是contest 1419的C题,目前有接近8000的人通过了本题.今天这题的难度不大,但是真的很考验思维,一不小心就会踩中陷阱,我个 ...
- Redis---00概述
一.什么是Redis? 1.概念: 是一个由Salvatore Sanfilippo写的key-value存储系统.是一个典型的NoSQL数据库, 2.特点: ①:数据是存储在内存中的 ②:是一个ke ...
- 【总结】IP
一. IP基本认识 1.IP 在 TCP/IP 参考模型中处于第三层,也就是网络层. 网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信 2.网络层与数据链路层有什么 ...
- for循环中的let与var的说明
参考资料:<JavaScript高级程序设计> 在 let 出现之前,for 循环定义的迭代变量会渗透到循环体外部: for (var i = 0; i < 5; ++i) { ...
- Redis常用命令(2)——String
APPEND 格式:APPEND key value 作用:在key的键值后追加value,如果key不存在,则创建key,并存入value. 返回值:追加value后的字符串长度. 示例: 192. ...