平衡二叉树-AVL树
- 特点
1.根结点的值大于其左子树中任意一个节点的值,小于其右节点中任意一个节点的值
2.AVL树上任意结点的左右子树的高度差最大为1
3.由于第2个特点,所以AVL树不会退化为BST树,查找、添加、删除的时间复杂度都是O(logn)
姓名(术语) | 简介 |
---|---|
B树 | 多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中; |
B-树 | 就是B树 |
B+树 | 在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中; |
B*树 | 在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3; |
如果要查找结点5,则需要4步,最坏的情况磁盘读写次数==二叉搜索树的高度,效率极低,并且由于索引是在内存中执行的,价格也很昂贵
B树-平衡多路查找树
- B树,平衡多路查找树,一个节点的查找路径不止左右两个,而是有多个。
- M阶表示一个B树的结点最多有多少个查找路径(这个节点有多少个子节点)
- B树其实最开始源于的是二叉树,二叉树是只有左右孩子的树,当数据量越大的时候,二叉树的节点越多,那么当从根节点搜索的时候,影响查询效率。所以如果这些节点存储在外存储器中的话,每访问一个节点,相当于进行了一次I/O操作。前面说过,为了减少磁盘的 I/O 操作才有的B树
K被称为B树的阶,K的值取决于磁盘页的大小
查找节点6的步骤:
①定位到根节点(9),6比9小,所以在左子树找
②定位到节点(4,7),6在4、7中间,所以在中间子树找
③定位到(5,6),6比5大,所以和该节点的右边比较
④找到,over
在B树中比较减少了I/O操作,B树可以减少树的高度,减少磁盘读写次数
-
B树特点(m是树的高度,k是树的阶)
1.根结点至少有两个子节点 [ 2,m ]。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 。
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m。
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 -
B树的不足:不利于范围查找(区间查找),如果要找0~100 的索引值,那么B树需要多次从根结点开始逐个查找
B+树
B+树与B树的区别
B+树和B树区别是:
- B+树内部有两种结点,一种是索引结点,一种是叶子结点。
- B+树的索引结点并不会保存记录,只用于索引,所有的数据都保存在B+树的叶子结点中。而B树则是所有结点都会保存数据。
- B+树的叶子结点都会被连成一条链表。叶子本身按索引值的大小从小到大进行排序。即这条链表是 从小到大的。多了条链表方便范围查找数据。
- B树的所有索引值是不会重复的,而B+树 非叶子结点的索引值 最终一定会全部出现在 叶子结点中。
- 优点
1)B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;
2)B+树查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;
3)B+树便于范围查询(最重要的原因,范围查找是数据库的常态)
B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低;
- B+树的结点只存储索引key值,具体信息的地址存储与叶子结点的地址中,减少I/O支出
- B+树支持range-query区间查询,B树不支持
- B+树通常用于数据库和操作系统的文件系统中