【算法】数据结构与算法分析学习笔记——各类二叉查找树的吐血整理
2017-02-19 19:12
471 查看
看完《数据结构与算法分析》,各种二叉查找树简直看得要崩溃,这里整理一下,也便于以后自己使用。
二叉查找树BST:最原始的查找树,后面所有树都要叫它爸爸爷爷了,也不用多说啥。
AVL树:主要使用递归实现,非递归有点麻烦,通过记录每个节点的高度,当高度差达到2时,进行旋转,达到自平衡。实现可以参考:
http://blog.csdn.net/d521000121/article/details/54312142
伸展树SplayTree:思想是每次要找的都通过旋转放到根上(叫做展开),方便后续的查找,所以当某些数据连续被查找又或者要查找的数据非常接近,此时速度便会非常快。
而且最坏情况不会保持。附上一个大神的博客:
http://www.cnblogs.com/vamei/archive/2013/03/24/2976545.html
伸展树(自顶向下):从底向上需要递归,同时就是要额外空间,但自顶向下只需要常数空间即可,且可用非递归实现,所以个人认为这个算法会更快?
注意这里生成的树与自底向上的会有区别。实现的话书上已经非常详细了。
红黑树RedBlackTree:AVL的变种,通过标记节点是红色还是黑色,再给树一系列的约束条件,达到自平衡的功能,从理论上也证明了生成的树已经接近最优。
再附上大神博客:http://blog.csdn.net/chenhuajie123/article/details/11951777
AA-树:先有二叉B-树,再有BB-树,再加上一点红黑树的条件,就是AA-树(mdzz。。。)
讲解这个比较好:http://blog.csdn.net/zhaojinjia/article/details/8121156,实现书上有
treap树:很简单的一个想法,就是查找二叉树+堆,对于每个节点,会生成一个随机数叫优先级,treap数除了满足查找二叉树的条件外,其节点的优先级要满足堆序,
不满足的通过左旋转和右旋转维护。详细参考:http://blog.csdn.net/pi9nc/article/details/12244591
查找(平均/最坏) | 插入(平均/最坏) | 删除(平均/最坏) | 优点 | 缺点 | |
二叉查找树BST | O(logN)/O(N) | O(logN)/O(N) | O(logN)/O(N) | 编程代码最简单 | 树可能会不平衡,最坏情况会达到O(N) |
AVL树 | O(logN)/O(logN) | O(logN)/O(logN) | O(logN)/O(logN) | 增加了平衡条件,保证了最坏情况依然是O(logN) | 编程复杂,数据结构相对复杂 |
伸展树SplayTree | O(logN)/O(N) | O(logN)/O(N) | O(logN)/O(N) | 数据结构相对简单,虽然有最坏情况,但并不影响总体速度 | 仍然存在O(N)的情况 |
伸展树(自顶向下) | O(logN)/O(N) | O(logN)/O(N) | O(logN)/O(N) | 相比自底向上,非递归实现,且只需要O(1)的额外空间但摊还时间不变 | 代码复杂 |
红黑树RedBlackTree | O(logN)/O(logN) | O(logN)/O(logN) | O(logN)/O(logN) | AVL的变种,继承了AVL的时间,平衡的好 | 有大量的旋转,删除复杂,总体代码也复杂 |
AA-树 | O(logN)/O(logN) | O(logN)/O(logN) | O(logN)/O(logN) | 代码实现会大量简化,且时间继续保持 | 旋转的次数会相对多 |
treap树 | O(logN)/O(N) | O(logN)/O(N) | O(logN)/O(N) | 这是最简单的一种树了,效率甚至高于伸展树 | 依然是存在最坏情况的 |
AVL树:主要使用递归实现,非递归有点麻烦,通过记录每个节点的高度,当高度差达到2时,进行旋转,达到自平衡。实现可以参考:
http://blog.csdn.net/d521000121/article/details/54312142
伸展树SplayTree:思想是每次要找的都通过旋转放到根上(叫做展开),方便后续的查找,所以当某些数据连续被查找又或者要查找的数据非常接近,此时速度便会非常快。
而且最坏情况不会保持。附上一个大神的博客:
http://www.cnblogs.com/vamei/archive/2013/03/24/2976545.html
伸展树(自顶向下):从底向上需要递归,同时就是要额外空间,但自顶向下只需要常数空间即可,且可用非递归实现,所以个人认为这个算法会更快?
注意这里生成的树与自底向上的会有区别。实现的话书上已经非常详细了。
红黑树RedBlackTree:AVL的变种,通过标记节点是红色还是黑色,再给树一系列的约束条件,达到自平衡的功能,从理论上也证明了生成的树已经接近最优。
再附上大神博客:http://blog.csdn.net/chenhuajie123/article/details/11951777
AA-树:先有二叉B-树,再有BB-树,再加上一点红黑树的条件,就是AA-树(mdzz。。。)
讲解这个比较好:http://blog.csdn.net/zhaojinjia/article/details/8121156,实现书上有
treap树:很简单的一个想法,就是查找二叉树+堆,对于每个节点,会生成一个随机数叫优先级,treap数除了满足查找二叉树的条件外,其节点的优先级要满足堆序,
不满足的通过左旋转和右旋转维护。详细参考:http://blog.csdn.net/pi9nc/article/details/12244591
相关文章推荐
- 韩顺平_PHP程序员玩转算法公开课(第一季)04_阶段性答疑解惑_学习笔记_源代码图解_PPT文档整理
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- 韩顺平_PHP程序员玩转算法公开课_学习笔记_源代码图解_PPT文档整理_目录
- java 虚拟机学习笔记整理001--运行时的数据区域+垃圾收集算法
- 【算法】数据结构与算法分析学习笔记——第四章AVL树C语言实现
- 算法(第四版)学习笔记之java实现二叉查找树
- 最优二叉查找树详解(算法导论学习笔记)
- 【算法】数据结构与算法分析学习笔记——第三章习题选做Josephus问题
- 韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 韩顺平_PHP程序员玩转算法公开课(第一季)12_双向链表crud操作之_水浒英雄排行_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)07_使用数组实现堆栈_学习笔记_源代码图解_PPT文档整理
- css学习笔记之兼容&bug(吐血整理)
- 韩顺平_PHP程序员玩转算法公开课(第一季)05_使用单链表解决约瑟夫问题_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)09_使用栈完成高级计算器(1)_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)11_双向链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理
- 算法学习笔记:排序算法整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)08_阶段性就业指导_学习笔记_源代码图解_PPT文档整理
- 【算法】数据结构与算法分析学习笔记——第三章习题选做快速傅里叶变换与多项式乘法