B树、B-树、B+树、B*树

B 树

通常我们所说的 B树 或 B-树,其实指的是一种树,这里我将其称为 B树。
一颗 M 阶的 B树具有以下特点:
1)树的根或者是一片叶子,或者其儿子数在 2 和 M 之间;
2)除根外,所有非树叶节点的儿子数在 ⌈M/2⌉ 和 M 之间;
3)所有的树叶都在相同的深度上。
B树的深度最多是:⌈log⌈M/2⌉ N⌉。这个公式表明 B树 的高度可以较小。

B树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树,在降低磁盘I/0操作方面性能较好,许多数据库系统一般使用B树或者B树的各种变形结构。
B树 有多种实现方式,这里给出网上常见的一种:


特点如下:1)所有键值分布在整颗树中;2)任何一个关键字出现且只出现在一个结点中;3)搜索有可能在非叶子结点结束;4)在关键字全集内做一次查找,性能逼近二分查找。

要注意的是《数据结构与算法》一书中的 B树 与这棵树有所区别,它更像下面的 B+ 树,但其树叶之间没有链指针。



B+ 树



1)B+树 和 B树 的区别主要在于 B+树 的非叶节点并无指向关键字具体信息的指针,所以 B+树 的节点大小相对于 B树 就会小一些,如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存中的关键字也就越多,相对来说IO读写次数也就降低了。正因为这个原因,B+树 的搜索必须到叶节点,那里才有指向关键字信息的指针,而 B树 的搜索则可能在非叶节点结束,因为其非叶节点有指向关键字信息的指针。
2)此外,由于非叶点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3)B+树只要遍历叶子节点就可以实现整棵树的遍历,支持基于范围的查询,而B树不支持这样的操作(或者说效率太低)。

通过以上介绍,大致将B树,B+树总结如下:1)B树:有序数组+平衡多叉树;2)B+树:有序数组链表+平衡多叉树.无论是B树,还是B+树,由于根或者树的上面几层被反复查询,所以这几块可以存在内存中,换言之,B树、B+树的根结点和部分顶层数据在内存中,大部分下层数据在磁盘上。
红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B/B+Tree作为索引结构,一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。一般来说,B/B+树的出度很大,所以树的深度就会比较小。而红黑树就会深很多。

RB 树

RB树与AVL树类似,也是一种平衡二叉查找树,广泛应用与 STL(set,map),Linux的进程调度(管理进程控制块),epoll在内核中的实现(管理事件块),nginx中(管理timer),对 RB树 的操作在最坏情形下花费 O(logN)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色;(2)根节点是黑色;(3)如果一个节点是红色的,则它的子节点必须是黑色的;(4)从一个节点到NULL节点的任意路径上包含相同数目的黑节点(确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树);
(5)NULL 节点是黑色的。

红黑树示意图:


着色法则的一个推论是,红黑树的高度最多是 2log(N + 1)。经验指出,平均红黑树大约和平均AVL树一样深,从而查找时间一般接近最优,红黑树的优点是执行插入所需要的开销相对于AVL较低,再有就是实践中发生的旋转相对较小。但是,红黑树的具体实现是复杂的,不仅因为有大量可能的旋转,而且还因为一些子树可能是空的,以及处理根的特殊情况(尤其是根没有父节点)。

红黑树的 Insert 操作有两种做法:
1)自底向上(插入的树叶涂红色)
2)自顶向下(两个儿子都是红色的翻转颜色)
两种方法都会涉及单旋转与双旋转的操作,类似AVL树,但注意还要变换颜色。

Delete操作可用自底向上,也可自顶向下。

AVL 树和红黑树的比较:1)如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。2)其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。3)map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。


**B+tree **是一个n叉树,每个节点有多个叶子节点,一颗B+树包含根节点,内部节点,叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上叶子节点的节点。
B+tree的性质:
1.n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容