二叉树,平衡二叉树,红黑树,B树,B+树理解


文章出自于我自己的理解,
如果哪里写的不对了,留言给我,或者发我邮箱superealboom@163.com
写这段是因为在我看别的博客,资料学习的时候,发现了他们写的错。因为在学习,所以也怀疑是自己理解的有问题,于是百般纠结,当我翻到评论的时候,奥,原来大家都发现了这个错。于是引以为鉴。


这篇文章我放在数据库的分类下面,
那么就说存取数据库中的数据的问题,
数据库中的数据一般是放在磁盘里面,存取数据的时候就要访问磁盘,
物理访问过程:盘片旋转,磁臂移动 两个过程。盘片旋转到指定位置之后,移动磁臂开始进行数据的存取。

那么存取数据的时间(快慢)主要是在哪部分消耗呢?主要就是定位过程消耗的。
所以:考虑到提高存取数据的速率,实际上就是减少磁盘定位(I/O操作)的次数。

来举个例子。来顺序查找

图片是我自己画的

查找5的时候,从头到尾的遍历,一共需要定位5次。不用再赘述,显然这样的顺序查找是最低效的。

为了提高效率,来二叉树
二叉树的规范我就不说了,

图片来源:https://www.cnblogs.com/tiancai/p/9024351.html

一共6个数,无论查找哪个数,最多也就定位3次。
嗯,既然二叉树这么方便,那大家都用二叉树好了。额,其实图一那种情况,也算是二叉树,那算是一种情况。如果无法保证提高效率的稳定性,那这种结构还是不好。
(在这里记录一个知识点)
先序,中序,后序遍历。说一点就好,这里的先中后,说的是根节点。

为了提升稳定性,来平衡二叉树
平衡二叉树用平衡因子差值来判断是否平衡,并旋转二叉树。平衡因子:左右子树高度差。平衡二叉树里平衡因子不能超过1,否则旋转。
长叹一口气,这样稳定了吧?
稳定是稳定,但是为了二叉树的稳定,牺牲了一些更重要的东西——时间。
当新增删除数据导致的旋转二叉树时,很耗时间的!
所有的操作的目的都是为了节省时间,提高效率。这样操作舍本逐末了。但也不是丝毫没有可取之处。
使用场景:新增删除数据少,查找数据多的应用场景可以。

在稳定性的基础上,再优化一下,减少一下旋转次数吧,来红黑树
红黑树(Java中TreeMap)特性:
1、每个节点要么是红色,要么是黑色。
2、根节点必须是黑色。
3、红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
4、对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

图片来源:百度图片

红黑树旋转的关键逻辑是:确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一倍。举例:节点A,左子树高度X,右子树高度Y, X-Y<=min(X,Y);
所以当 X-Y > min(X,Y),然后开始旋转,红黑树的旋转逻辑请看这位大神博客。https://www.cnblogs.com/CarpenterLee/p/5503882.html ,很清晰了。

红黑树已经稳成这样了,满足吗?不满足,还可以更稳。来B树
学习B树的时候我曾看到这样的定义。
定义1

1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 ceil(m/2) ≤ k ≤ m
3.每一个叶子节点都包含k-1个元素,其中 ceil(m/2) ≤ k ≤ m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分
6.每个结点的结构为:(n,A0,K1,A1,K2,A2,…  ,Kn,An)
    其中,Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1)。
Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。
n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1。
--------------------- 
作者:z_ryan 
来源:CSDN 
原文:https://blog.csdn.net/z_ryan/article/details/79685072 
版权声明:本文为博主原创文章,转载请附上博文链接!

定义2

定义任意非叶子结点最多只有M个儿子,且M>2;
根结点的儿子数为[2, M];
除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
非叶子结点的关键字个数=儿子数-1;
所有叶子结点位于同一层;
k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。
--------------------- 
原文:https://www.cnblogs.com/xueqiuqiu/articles/8779029.html

子女?元素?孩子?值域?关键字?儿子?
OMG,虽然最后我理解了博主们的意思,但是这也太费劲儿了。所以按自己的理解,写一个试试看。

前提:M阶B树
三种结点:根结点,中间结点,叶子结点
孩子:指一个结点下的子结点
关键字:结点中的值

1、根结点孩子数量:[2,M]
2、中间结点孩子数量:[ceil(M/2), M]
3、根结点和中间结点的关键字数量:他们的孩子数量 -1

4、一个结点当中:指向孩子指针和关键字的位置关系是:(指针1) 关键字A (指针2) 关键字B (指针3)
   每个关键字的值 > 左指针 指向的孩子树里结点中的关键字
   每个关键字的值 < 右指针 指向的孩子树里结点中的关键字

5、叶子结点位于同一层
6、结点中的关键字从小到大排列
7、结点中关键字不重复

图片来源:百度图片

图片和定义都祭出之后,B树对于红黑树的优势很明显了,最明显的就是B树一个结点存放了多个关键字。将在磁盘中的定位操作移到了结点中的关键字大小比较

B树是很可以,但并不是对所有场景都友好。来B+树
先说说什么场景B树不友好,范围查询:比如要找上图中E->O,两个字母之间的所有字母。那B树的逻辑就是中序查找到E,继续中序查找到O,然后拿出来字母。
那么B+树对于这种场景就很简单了。来先说一说B+树基本的东西,说完也就知道了为什么用B+树范围查找比B树简单了。

1、根节点和中间结点 的 孩子数量 = 关键字数量
2、根节点和中间结点 的 关键字 是 关键字对应子树中所有关键字的最大值,同时也存在于子树中
3、根节点和中间结点 只做索引,不包含数据指针以及数据

4、叶子结点包含所有数据,并按照从小到大顺序排列
5、叶子结点用指针连在一起
图片来源:https://blog.csdn.net/u011240877/article/details/80490663

所以,对于范围查询:比如查找3-8之间的数字,B+树的做法是直接在叶子结点上的有序链表上遍历即可。
而且,B+树比B树的查找更加稳定,因为每次找到都会到叶子结点。
那为什么B+树每次都会到叶子结点?B树每次到哪里?
B树上的关键字代表一个索引key,和它同时存在的是key所指向的内容在内存中实际的存储位置。如果遍历到了某个关键字,那么就根据指针去真实数据的存储位置。
B+树上的 非叶子节点 关键字只代表索引key,叶子结点上存储真实数据 或者 指向真实数据位置 的指针。

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

推荐阅读更多精彩内容