AVL树、splay树(伸展树)和红黑树比较
AVL树、splay树(伸展树)和红黑树比较
一、AVL树:
优点:查找、插入和删除,最坏复杂度均为O(logN)。实现操作简单
如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实际情况大多不是随机的。如果是随机的,则AVL 树能够达到比RB树更优的结果,因为AVL树的高度更低。如果只进行插入和查找,则AVL树是优于RB树的,因为RB树 更多的优势还是在删除动作上。
缺点:1)借助高度或平衡因子,为此需要改造元素结构,或额外封装-->伸展树可以避免。
2)实测复杂度与理论复杂度上有差距。插入、删除后的旋转成本不菲。删除操作后,最多旋转O(logN)次,(Knuth证明,平 均最坏情况下概率为0.21次),若频繁进行插入/删除操作,得不偿失。
3)单词动态调整后,全树拓扑结构的变化量可达O(logN)次。-->红黑树为O(1)
二、伸展树(splay tree)、
优点、1)无需记录节点高度和平衡因子,编程实现简单易行
2)分摊复杂度为O(logN)
3)局部性强,缓存命中率极高时,效率甚至可以更高。
注:伸展树是根据数据访问的局部性而来的主要是:1)刚刚被访问的节点,极有可能在不就之后再次被访问到;2)将被访问 的下一个节点,极有可能就处于不就之前被访问过的某个节点的附近。
缺点:1)仍不能保证单词最坏情况的出现,不适用效率敏感的场合
2)复杂度分析比较复杂
三、红黑树
优点:1)所有的插入、删除、查找操作的复杂度都是O(logN)
2)插入操作能够在最多2次旋转后达到平衡状态,而删除操作更是能够在一次旋转后达到平衡状态。删除操作有可能导致递归的双黑修正,但是在旋转之前,只是染色而树的结构没有任何实质性的改变,因此速度优于AVL树。
3)红黑树可以保证在每次插入或删除操作之后的重平衡过程中,全书拓扑结构的更新仅涉及常数个节点。尽管最坏情况下需对O(logN)个节点重染色,但就分摊意义而言,仅为O(1)个。
缺点:左右子树高度相差比AVL树大。
总结
二叉查找树:
任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 
此外,无论是左旋还是右旋,若旋转之前这棵树是二叉查找树,旋转之后它一定还是二叉查找树。
平衡树(AVL树):
AVL树中任何节点的两个子树的高度最大差别为1,LL,RR,LR,RL旋转算法。 
对于1百万个节点的平衡树,树的高度为12-20之间,对于10亿个节点的平衡树,树的高度为18-30之间。
伸展树:
当某个节点被访问时,伸展树会通过旋转使该节点成为树根。
红黑树:
主要是用它来存储有序的数据,它的时间复杂度是O(lgn)),效率非常之高.
AVL树与红黑树比较:
AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。(所以AVL树插入和删除时间会稍微多) 
红黑树是弱平衡的,用非严格的平衡来换取增删节点时候旋转次数的降低。 
两者都属于自平衡二叉树,那么降低树的深度自然会提高查找效率。 
两者查找,插入,删除的时间复杂度相同O(lgn)
时间复杂度比较
sequential search - 顺序查找 
binary search - 二分查找 
BST - 二叉查找树 
2-3 tree - 平衡树 
red-black tree - 红黑树

AVL树、splay树(伸展树)和红黑树比较的更多相关文章
- [转] Splay Tree(伸展树)
		好久没写过了,比赛的时候就调了一个小时,差点悲剧,重新复习一下,觉得这个写的很不错.转自:here Splay Tree(伸展树) 二叉查找树(Binary Search Tree)能够支持多种动态集 ... 
- 2-3-4树(jdk8的TreeMap的红黑树)
		2-3树:插入变成2个节点正常插,变成3个节点就要提升中间节点和分裂子节点,满足:要么没有子节点,要么2个子节点,要么3个子节点. 2-3-4树:插入变成2个不动,插入变成3个不动,插入变成4个提升原 ... 
- hdu 1754 splay tree伸展树 初战(单点更新,区间属性查询)
		题意:与区间查询点更新,点有20W个,询问区间的最大值.曾经用线段树,1000+ms,今天的伸展树,890没ms,差不多. 第一次学习伸展树,一共花了2个单位时间,感觉伸展树真很有用,也很好玩.现在只 ... 
- 【模板】Splay(伸展树)普通平衡树(数据加强版)/洛谷P6136
		题目链接 https://www.luogu.com.cn/problem/P6136 题目大意 需要写一种数据结构,来维护一些非负整数( \(int\) 范围内)的升序序列,其中需要提供以下操作: ... 
- 【BZOJ-3196】二逼平衡树        线段树 + Splay (线段树套平衡树)
		3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ... 
- BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1208 题意: 有一个宠物收养所,在接下来一段时间内会陆续有一些宠物进到店里,或是一些人来领 ... 
- hdu 1754 I Hate It (splay tree伸展树)
		hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ... 
- Splay(伸展树)/HDU6873
		题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6873 题目大意 给定一组 \(n\) 列的方块,每列方块数 \(b_i\) ,现有 \(q\) 次操作 ... 
- 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)
		递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ... 
- 【BBST 之伸展树 (Splay Tree)】
		最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ... 
随机推荐
- .net中实现aspnetpager分页
			第一步首先导入aspnetpager控件,然后再把他从工具箱中拖出,代码如下: <webdiyer:AspNetPager ID="aspnetpager1" runat= ... 
- Android Studio  Library 编译成 jar,aar
			1. 导入Library ,打开Library 的build gradle 在最外面添加如下: /** AVLView 自定义的jar 包名 **/ task clearJar(type: Dele ... 
- 【Oracle】设置快速恢复区及reset快速恢复区
			快速恢复区 概念 是一个默认放置所有备份恢复操作有关文件的地方,包括:控制文件在线镜像.在线重做日志.归档日志.外来归档日志.控制文件镜像复制.数据文件镜像复制.RMAN备份片和闪回日志. 如果启用的 ... 
- vue移动端Ui组件 mint-ui 使用指南
			1.上啦加载下拉刷新的使用 this.$refs.loadmore.onTopLoaded(); this.$refs.loadmore.onBottomLoaded(); 上啦刷新下拉加载的 动画显 ... 
- java操作Excel的poi   格式设置
			格式设置 package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi. ... 
- SqlLite提高批量插入速度的方法及原因分析
			(1)-SQLite忽略大小写查询大部分数据库在进行字符串比较时,对大小写是不敏感的.但是SQLite却是大小写敏感的.如果想让SQLite忽略大小写,方法如下:方法一:使用大小写转换函数LOWER. ... 
- [Ynoi2015]此时此刻的光辉
			题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ... 
- 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺 Scrum meeting 5
			项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11012922.html 团队名称 奋斗吧!菜鸟 作业学习目标 A ... 
- 【习题4-1 Uva1589】Xiangqi
			[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ... 
- lucene_05_solr配置
			什么是solr Solr.是Apache 下的一个顶级开源项目,采用Java 开发,它是基于Lucene 的全文搜索服务器.Solr 提供了比Lucene 更为丰富的查询语言,同时实现了可配置.可扩展 ... 
