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

2018-06-17  本文已影响0人  one_zheng

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树满足以下条件:

举个栗子:


BTree.png

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

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

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

插入

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

其过程如下:


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

删除

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

其过程如下:


14.jpg
15.jpg
16.jpg
上一篇下一篇

猜你喜欢

热点阅读