二叉搜索树、B树以及B+树

二叉搜索树(BST):

根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。其搜索效率与二叉树的树高有关,其查询时间复杂度为O(logN).

搜索节点:查找某个数字X,从根节点开始比较。如果X比根节点大,则去与根节点的右节点比较,如此类推,直到找到X(或子节点为空)为止。

插入新节点:如果新节点的key在树中已经存在,则把旧节点覆盖;如果没有,则插入。

查找最小值、最大值:最小值始终在左下的叶子节点、最大值始终在右下的叶子节点。

删除节点:A. 这个节点没子节点,此情况最为简单,直接删除这个节点即可。

         B. 这个节点只有一个子节点,把这个子节点和这个节点的父节点相连,然后删除这个节点

         C. 这个节点有两个子节点:

            1. 从此节点的右节点下面找出最小的节点X。

            2. 因为X节点是最小的,所以它的子节点数量肯定小于等于1个,把此子节点连到X的父节点上。

            3. 然后用X节点替换要删除的节点。

            4. 删除要删除的节点。

优点:查找速度、比较效率较高。

缺点:磁盘io较多,最坏的情况是io数等于树高。

所以,就想办法将“瘦高”的BST变得“矮胖”。

B-树( Balance-Tree)

B-树(不读做B减树)是一种多路平衡树,每个节点可以包含多个孩子,其上限k取决于磁盘大小,我们也把k称为树的阶。

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划


3阶B-树

拿(2,6)结点为例:包含两个元素(2与6),以及3个孩子1,(3,5),8,并且1小于2,(3,5)介于2与6之间,8大于2,符合特征。

相较于二叉搜索树,查询过程的比较次数并不比二叉搜索树少,尤其单个结点中的元素量较多时,但相较于磁盘io,内存中的比较耗时基本可以忽略,故而,只要树的高度足够低就可以降低IO次数,大大提升查找性能。

插入操作:

       1、 若该结点中关键码个数小于m-1,则直接插入即可。

  2、 若该结点中关键码个数等于m-1,则将引起结点的分裂。以中间关键码为界将结点一分为二,产生一个新结点,并把中间关键码插入到父结点(k-1层)中

  重复上述工作,最坏情况一直分裂到根结点,建立一个新的根结点,整个B树增加一层。


删除操作:

根据key删除记录,如果B树中的记录中不存对应key的记录,则删除失败。

1)如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步

2)该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。

3)如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。

否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。

原始状态:

删除27


原始状态:

删除32,父节点下移与兄弟节点结合。

[参考博客]https://www.cnblogs.com/nullzx/p/8729425.html

应用场景:文件系统、部分数据库索引(非关系型数据库MongoDB);

B+树

B+树是B-树的变体,具有更高的查询性能,MySql数据库的索引就是使用的B+树进行查询。

m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。最大/小的元素始终在根节点。

特点描述:

每个父节点元素都出现在子节点中,并且是最大/小的元素。

每个叶子节点都带有指向下一个叶子节点的指针,形成了一个有序链表。

仅叶子节点有卫星数据,其它中间节点都是索引,在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

由于B+树的中间节点不包含卫星数据,所以相较于B-树同一磁盘页可以容纳更多的节点元素。所以查询过程中的磁盘IO进一步降低。查询的终点始终在叶子节点所以使得查询效率非常稳定。

优势(相对于B-树):

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

其插入删除操作与B树类似。

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