BTreeB+Tree
B+B+B+BbalancebinaryB+B+AVLTreeB-TreeB+
二叉查找树
1122nn(1+2+2+3+3+3) / 6 = 2.3
2,3,5,6,7,8
――AVL
AVL Tree)
AVL1AVL<=1AVL31
AVLAVLLLRRLRRL
LLLeftLeft“”Left ChildLeft Child2AVL
RRRightRight“”Right ChildRight Child2AVL
LRLeftRight“”Left ChildRight Child2AVL
RLRightLeft“”Right ChildLeft Child2AVL
AVL
LLLLAVL
LL
RRRRLL
RR
LRLR
RR
LL
LR
RLRLLR
LL
RR
RL
B-Tree)
B-TreeB-Tree
block
InnoDBhttps://baike.baidu.com/item/innodb/8970025?fr=aladdin
InnoDBPageInnoDB16KBinnodb_page_size4K8K16KMySQL
mysql> show variables like 'innodb_page_size';
InnoDB16KBInnoDBI/O
B-TreeB-Tree[key, data] keydatakey
mB-Tree
1. m
2. Ceil(m/2)
3. 2
4.
5. nP0,P1,…Pn, k1,…kn
6. n
7. ki(i=1,…n)
8. Pi(i=1,…n)P(i-1)kik(i-1)
B-Tree3B-Tree
1735P117P217~35P335
29
1I/O1
2917,351P2
P23I/O2
2926,303P2
P28I/O3
829
3I/O33I/OB-TreeB-TreeAVLTreeI/O
B+Tree
B+TreeB-TreeInnoDBB+Tree
B-TreekeydatadatakeyB-TreeI/OB+TreekeykeyB+Tree
B+TreeB-Tree
B-TreeB+Tree4B+Tree
B+TreeB+Tree
22B+Tree
InnoDB16KBINT4BIGINT848B+Tree16KB/(8B+8B)=1KK10^33B+Tree10^3 * 10^3 * 10^3 = 10
B+Tree2~4mysqlInnoDB1~3I/O
B+Treeclustered indexsecondary indexB+TreeB+TreeInnoDB
红黑树
https://blog.csdn.net/sun_tttt/article/details/65445754
红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在
阅读以下需要了解普通二叉树的插入以及删除操作。
红黑树是在普通二叉树上,对没个节点添加一个颜色属性形成的,同时整个红黑二叉树需要同时满足一下五条性质
红黑树需要满足的五条性质:
性质一:节点是红色或者是黑色;
在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。
性质二:根节点是黑色;
根节点总是黑色的。它不能为红。
性质三:每个叶节点(NIL或空节点)是黑色;
这个可能有点理解困难,可以看图:
这个图片就是一个红黑树,
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点);
就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。
**性质五:从任一节点到其没个叶节点的所有路径都包含相同数目的黑色节点;**
还是看图:
1
2
3
从根节点到每一个
这五条性质约束了红黑树,可以通过数学证明来证明,满足这五条性质的二叉树可以将查找删除维持在对数时间内。
当我们进行插入或者删除操作时所作的一切操作都是为了调整树使之符合这五条性质。
下面我们先介绍两个基本操作,旋转。
旋转的目的是将节点多的一支出让节点给另一个节点少的一支,旋转操作在插入和删除操作中经常会用到,所以要熟记。
下面是左旋和右旋:
左旋:
右旋:
下面讲讲插入
我们先明确一下各节点的叫法
因为要满足红黑树的这五条性质,如果我们插入的是黑色节点,那就违反了性质五,需要进行大规模调整,如果我们插入的是红色节点,那就只有在要插入节点的父节点也是红色的时候违反性质四或者是当插入的节点是根节点时,违反性质二,所以,我们把要插入的节点的颜色变成红色。
下面是可能遇到的插入的几种状况:
这个时候插入一个红色的节点并没有对这五个性质产生破坏。所以直接插入不用在进行调整操作。
这个要分两种情况,一种是叔叔节点为黑的情况,一种是叔叔节点为红的情况。
当叔叔为黑时,也分为两种情况,一种是要插入的节点是父节点的左支,另一种是要插入的节点是父亲的右支。
我们先看一下当要插入的节点是父节点的左支的情况:
这个时候违反了性质四,我们就需要进行调整操作,使之符合性质四,我们可以通过对祖父节点进行右旋同时将祖父节点和父节点的颜色进行互换,这样就变成了:
经过这样的调整可以符合性质四并且不对其他性质产生破坏。
当插入的节点是父节点的右支的时候:
当要插入的节点是父节点的右支的时候,我们可以先对父节点进行左旋,变成如下:
如果我们把原先的父节点看做是新的要插入的节点,把原先要插入的节点看做是新的父节点,那就变成了当要插入的节点在父节点的左支的情况,对,是的,就是按照当要插入的节点在父节点的左支的情况进行旋转,旋转完之后变成如下:
这个时候的情况跟情况
这个时候,只需将父亲节点和叔叔节点涂黑,将祖父节点涂红。
以上就是插入的全部过程。
下面我们再讲讲删除的操作:
首先你要了解普通二叉树的删除操作:
将被删除元素与其右支的最小元素互换,变成如下图所示:
然后再将被删除元素删除:
我们下面所称的被删除元素,皆是指已经互换之后的被删除元素。
加入颜色之后,被删除元素和后继元素互换只是值得互换,并不互换颜色,这个要注意。
下面开始讲一下红黑树删除的规则:
由
变成
如图:
由
变成:
由:
变成:
由
先兄弟与兄弟的左子节点颜色互换,进行右转,变成:
然后在按照规则
由:
变成:
由:
交换兄弟节点与父亲结点的颜色,以父亲结点进行左旋 变成:
在按照情况四进行操作,变成:
好了,删除的步骤也讲完,没有讲到的一点就是,在添加删除的时候,时刻要记得更改根元素的颜色为黑。
这里并没有语言实现,只是讲了一下红黑树的插入删除步骤,你可以根据步骤自己把红黑树实现。
点击这里,照着规则一步一步的构建一个红黑树吧。(这里是别人的一个链接)
最后:
4.要时刻记得 ,一切的操作都是为了保持那五条性质。
最后的最后,其实还有一种更为简单的红黑二叉树,这个简单的红黑二叉树实际上是一个
最后的最后的最后,一定要尝试着自己推导一下插入删除规则啊,不然经常忘,是睡一觉起来再看就有点懵逼的那种忘。
我也不知道自己在哪里看到的,如有侵权立即删除。