美文网首页
数据结构与算法分析 chapter04-AVL树、B树

数据结构与算法分析 chapter04-AVL树、B树

作者: one_zheng | 来源:发表于2018-06-17 12:35 被阅读0次

AVL树

 AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它保证树的深度必须是O(logN)。最简单的想法是1.要求左右子树具有相同的高度。如图4-28所示,这种想法并不强求树的深度要浅。
2.要求每个节点都必须有相同高度的左子树和右子树。如果空子树的高度定义为-1.那么只有具有2^k -1个节点的理想平衡树满足一个条件。因此,虽然这种平衡条件保证了树的深度小,但是它太严格而难以使用,需要放宽条件。
 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1)

tree.png image.png

单旋转(左-左或右-右的情况)

image.png image.png

双旋转(左-右或右-左的情况)


image.png

B树

B树产生的原因:
B树是一种查找树,我们知道,这一类树(比如二叉查找树,红黑树等等)最初生成的目的都是为了解决某种系统中,查找效率低的问题。B树也是如此,它最初启发于二叉查找树,二叉查找树的特点是每个非叶子节点都只有两个孩子节点。然而这种做法会导致当数据量非常大时,二叉查找树的深度过深,搜索算法自根节点向下搜索时,需要访问的节点也就变得相当多。如果这些节点存储在外存储器中,每访问一个节点,相当于就是进行了一次I/O操作,随着树高度的增加,频繁的I/O操作一定会降低查询的效率。
这里有一个基本的概念,就是说我们从外存储器中读取信息的步骤,简单来分,大致有两步:

找到存储这个数据所对应的磁盘页面,这个过程是机械化的过程,需要依靠磁臂的转动,找到对应磁道,所以耗时长。
读取数据进内存,并实施运算,这是电子化的过程,相当快。

综上,对于外存储器的信息读取最的时间消耗在于寻找磁盘页面。那么一个基本的想法就是能不能减少这种读取的次数,在一个磁盘页面上,多存储一些索引信息。B树的基本逻辑就是这个思路,它就要改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数。

一个 m 阶的B树满足以下条件:

    1. 每个结点至多拥有m棵子树;
    1. 根结点至少拥有两颗子树(存在子树的情况下);
    1. 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;
    1. 所有的叶结点都在同一层上;
    1. 有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列;
    1. 关键字数量需要满足ceil(m/2)-1 <= n <= m-1;

举个栗子:


BTree.png

B树上大部分的操作所需要的磁盘存取次数和B树的高度是成正比的,在B树中可以检查多个子结点,由于在一棵树中检查任意一个结点都需要一次磁盘访问,所以B树避免了大量的磁盘访问。

操作
既然是树,那么必不可少的操作就是插入和删除,这也是B树和其它数据结构不同的地方,当然了,还有必不可少的搜索,分享一个对B树的操作进行可视化的网址,它是由usfca提供的。

假定对高度为h的m阶B树进行操作。

插入

新结点一般插在第h层,通过搜索找到对应的结点进行插入,那么根据即将插入的结点的数量又分为下面几种情况。

  • 如果该结点的关键字个数没有到达m-1个,那么直接插入即可;
  • 如果该结点的关键字个数已经到达了m-1个,那么根据B树的性质显然无法满足,需要将其进行分裂。分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。

其过程如下:


10.jpg
11.jpg 12.jpg 13.jpg

删除

同样的,我们需要先通过搜索找到相应的值,存在则进行删除,需要考虑删除以后的情况,

  • 如果该结点拥有关键字数量仍然满足B树性质,则不做任何处理;
  • 如果该结点在删除关键字以后不满足B树的性质(关键字没有到达ceil(m/2)-1的数量),则需要向兄弟结点借关键字,这有分为兄弟结点的关键字数量是否足够的情况。
    • 如果兄弟结点的关键字足够借给该结点,则过程为将父亲结点的关键字下移,兄弟结点的关键字上移;
    • 如果兄弟结点的关键字在借出去以后也无法满足情况,即之前兄弟结点的关键字的数量为ceil(m/2)-1,借的一方的关键字数量为ceil(m/2)-2的情况,那么我们可以将该结点合并到兄弟结点中,合并之后的子结点数量少了一个,则需要将父亲结点的关键字下放,如果父亲结点不满足性质,则向上回溯;
  • 其余情况参照BST中的删除。

其过程如下:


14.jpg
15.jpg
16.jpg

相关文章

  • 数据结构与算法分析 chapter04-AVL树、B树

    AVL树  AVL树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它保证树的深度必须是O(logN)...

  • B-树和B+树

    参考链接:MySQL索引背后的数据结构及算法原理B树、B-树、B+树、B*树 1.B-Tree 为了描述B-Tre...

  • 收藏夹

    平衡二叉树、B树、B+树、B*树 MySQL索引背后的数据结构及算法原理 Redis集群方案应该怎么做? 分布式开...

  • mysql索引

    从数据结构角度 1、B+树索引(O(log(n))):关于B+树索引,可以参考MySQL索引背后的数据结构及算法原...

  • PHP面试知识梳理

    算法与数据结构 BTree和B+tree BTree B树是为了磁盘或者其他存储设备而设计的一种多叉平衡查找树,相...

  • 排序算法

    什么是算法 书籍推荐 《数据结构与算法分析》 表、栈和队列 树 散列(hash) 优先队列(堆) 排序 定义 问题...

  • 数据结构与算法B树和B+树

    1.B树又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示 2.B+树的基本概念每个分...

  • B树与B+树

    B树数据结构 B树示意图 B+树的性质B+树是B树的变体,也是一种多路搜索树,其定义基本与B树同,除了:1.非叶子...

  • Mysql索引数据结构

    Mysql索引数据结构 Hash表与B+树 树的查询效率高O(log N),可以保持基本有序。 B-树(B树)...

  • 关于函数递归和迭代的转化, 及尾递归相关知识的接触和思考

    javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作 js 二叉树 【数据结构与算法】深入浅出递...

网友评论

      本文标题:数据结构与算法分析 chapter04-AVL树、B树

      本文链接:https://www.haomeiwen.com/subject/xbljeftx.html