1.平衡二叉树
由来:平衡二叉树是基于二分法的策略提升数据的查找速度的二叉树的数据结构
特色:
1.二叉树:意思是每一个节点最多只能有两个子节点
2.平衡:由于平衡二叉树的查询性能与树的高度成正比,因此为了下降树的高度,会去尽可能的设计从而保证两端数据的大体平衡,这种设计通常是会采用一种算法机制,常见的有AVL,treap,红黑树等等。这样设计下的数的查询速度接近于二分查找法。
最多见的算法规则是左边的子节点小于父节点,父节点小于右子节点
总结平衡二叉树特色:
(1)非叶子节点最多拥有两个子节点;
(2)非叶子节值大于左边子节点、小于右边子节点;
(3)树的左右两边的层级数相差不会大于1;
(4)没有值相等重复的节点;
二叉树的优势:
二叉排序树是一种比较有用的折衷方案。
数组的搜索比较方便,能够直接用下标,但删除或者插入某些元素就比较麻烦。
链表与之相反,删除和插入元素很快,但查找很慢。
二叉排序树就既有链表的好处,也有数组的好处。
在处理大批量的动态的数据是比较有用。
文件系统和数据库系统通常都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,自己不多在实际中进行应用,由于缺点太明显了(看看教科书怎么说的)。就像冒泡排序同样,虽然由于效率问题并不实用,单不失一种教学例子的好手段。
平衡二叉树都有哪些应用场景
二叉树支持动态的插入和查找,保证操做在O(height)时间,这就是完成了哈希表不便完成的工做,动态性。可是二叉树有可能出现worst-case,若是输入序列已经排序,则时间复杂度为O(N)
平衡二叉树/红黑树就是为了将查找的时间复杂度保证在O(logN)范围内。
因此若是输入结合肯定,所须要的就是查询,则能够考虑使用哈希表,若是输入集合不肯定,则考虑使用平衡二叉树/红黑树,保证达到最大效率
平衡二叉树主要优势集中在快速查找。
SGI/STL的set/map底层都是用红黑树(平衡二叉树的一种)实现
2.B树/B+树
概念:B树和平衡二叉树稍有不一样的是B树属于多叉树又名平衡多路查找树,查找路径不仅有两条。数据库里最常使用的就是B树和B+树
特色:
树的每一个节点能够拥有m个节点。m=2则为二叉树,m=3则为三叉树,总结为m叉树
除根节点外每一个节点的关键字数量大于等于ceil(m/2)-1个小于等于m-1个;(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2)
全部节点关键字是按递增次序排列,并遵循左小右大原则
最后咱们用一个图和一个实际的例子来理解B树(这里为了理解方便我就直接用实际字母的大小来排列C>B>A)
三、B树的查询流程: 如上图我要从上图中找到E字母,查找流程以下
(1)获取根节点的关键字进行比较,当前根节点关键字为M,E要小于M(26个字母顺序),因此往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);
(2)拿到关键字D和G,D<E<G 因此直接找到D和G中间的节点;
(3)拿到E和F,由于E=E 因此直接返回关键字和指针信息(若是树结构里面没有包含所要查找的节点则返回null);
四、B树的插入节点流程
定义一个5阶树(平衡5路查找树;),如今咱们要把三、八、3一、十一、2三、2九、50、28 这些数字构建出一个5阶树出来;
遵循规则:
(1)当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于cei(5/2)-1小于等于5-1(关键字数小于cei(5/2)-1 就要进行节点合并,大于5-1就要进行节点拆分);
(2)知足左大右小的排序规则;
五、B树节点的删除
规则:
(1)当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于cei(5/2)-1小于等于5-1;
(2)知足左大右小的排序规则;
(3)关键字数小于二时先从子节点取,子节点没有符合条件时就向向父节点取,取中间值往父节点放;
三、特色:
B树相对于平衡二叉树的不一样是,每一个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每一个块的大小通常为4K,每次IO进行数据读取时,同一个磁盘块的数据能够一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减小数据查找的次数和复杂度;
三、B+树
B+树是B树的一个升级版,相对于B树来讲B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度彻底接近于二分法查找。为何说B+树查找的效率要比B树更高、更稳定;咱们先看看二者的区别
(1)B+跟B树不一样B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每一个节点所能保存的关键字大大增长;
(2)B+树叶子节点保存了父节点的全部关键字和关键字记录的指针,每一个叶子节点的关键字从小到大连接;
(3)B+树的根节点关键字数量和其子节点个数相等;
(4)B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,全部数据地址必需要到叶子节点才能获取到,因此每次数据查询的次数都同样;
特色:
在B树的基础上每一个节点存储的关键字数更多,树的层级更少因此查询数据更快,全部指关键字指针都存在叶子节点,因此每次查找的次数都相同因此查询速度更稳定;
四、B*树
B*树是B+树的变种,相对于B+树他们的不一样之处以下:
(1)首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),b*树的初始化个数为(cei(2/3*m))
(2)B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(由于每一个节点都有指向兄弟的指针),若是兄弟节点未满则向兄弟节点转移关键字,若是兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据建立一个新的节点出来;
特色:
在B+树的基础上因其初始化的容量变大,使得节点空间使用率更高,而又存有兄弟节点的指针,能够向兄弟节点转移关键字的特性使得B*树额分解次数变得更少;
总结:从平衡二叉树、B树、B+树、B*树整体来看它们的贯彻的思想是相同的,都是采用二分法和数据平衡策略来提高查找数据的速度;
不一样点是他们一个一个在演变的过程当中经过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减小达到快速查找数据的目的;