平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多(查找的时间复杂度为log(n))。
B-tree
定义
对于一颗M阶B树具有以下性质
1.根节点的子节点数为[2,M]。
2.除根节点与叶节点外的节点子节点数数为[M/2,M]。
3.除根节点每个节点都存放数据个数为[M/2-1,M-1],升序存储。
4.非叶节点存储数据个数为指向子节点指针数-1.
5.所有的叶节点都在同一层。
使用场景
在数据存储中,AVL树与红黑树的查询时间都是相对低,但在大量数据存储时,往往不能一次性把全部数据都加载到内存当中,因此io次数是查询时间复杂度的决定性因素。对于二叉树来说存储大量数据二叉树的高度会非常高,数据会散列存放在不同的数据块中,在查找时加载数据的io次数就会增加。胖矮的树更能减少io次数,而B树的子节点数多于2,是多阶数,也称多路查找树,能把尽可能多的把相近的数据存放到同一个数据块中,同时降低数的高度,减小查询时间,因此B数适合大数据量存储。mogodb是一种聚合行模型简单的高性能数据库,使用了B树数据结构,将key与数据聚合到一起。
B+树
定义
B+树是B-树的变体,也是一种多路搜索树:
- 其定义基本与B-树同,除了:
- 非叶子结点的子树指针与关键字个数相同;
- 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
- 为所有叶子结点增加一个链指针;
- 所有关键字都在叶子结点出现;
使用场景
相对于B树,(1)B+树空间利用率更高,因为B+树的内部节点只是作为索引使用,而不像B-树那样每个节点都需要存储硬盘指针。
- 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
- 不可能在非叶子结点命中;
- 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;