其他分享
首页 > 其他分享> > 数据结构-2-3树及实现树

数据结构-2-3树及实现树

作者:互联网

数据结构-2-3树及实现树

2-3查找树:

为了保证查找树的平衡性,需要树有一些灵活性,因此在这里允许树中的一个结点保存多个键,确切地说,我们将一颗标准的二叉查找树中的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两个键和三条链。2-结点和3-结点中的每条链都对应着其中保存的键所分割产生的一个区间。

2-3查找树的定义

一颗2-3查找树要么为空要么满足下面两个要求:

1. 2-结点:
含有一个键及其对应的值和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3中的键大于该结点。
2. 3-结点:
含有两个键及其对应的值和三条链,左链接指向的2-3中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接执行的2-3中的键都大于该结点。

2-3查找树的操作及性质

  1. 任意空链接到根结点的路径长度是相等的。
  2. 4-结点变换为3-结点时,树的高度不会发生变化,只有当根结点是临时的4-结点,分解根结点时,树高+1。
  3. 2-3树与普通二叉查找树最大的区别在于,普通的二叉查找树是自顶向下生长,而2-3树是自底而上生长。

2-3查找树实现-红黑树:

2-3树能够保证插入元素之后,树依然保持平衡状态,它的最坏情况下所有子结点都是2-结点,树的高度为lgN,相比于我们普通的二叉查找树,最坏情况下树的高度为N,确实保证了最坏情况下的时间复杂度,但是2-3树实现起来过于复杂,下面是一个2-3树的简单实现:红黑树
红黑树主要是对2-3树进行编码,红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树,我们将树中的链接分为两种类型:
红链接:将两个2-结点连接成为起来构成一个3-结点;
黑链接:2-3树中的普通链接
确切地说:我们将3-结点表示为由一条左斜的红色链接(两个2-结点其中之一是另一个的左子节点)相连的两个2-3结点,这种表示法的一个优点是:我们无需修改就可以直接使用标准的二叉查找树的get方法。

  1. 红黑树的定义:
    红黑树是含有红黑链接并满足下列条件之一的二叉查找树:
    1. 红链接均为左连接
    2. 没有任何一个节点同时和两条红链接相连。
    3. 该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同。
  2. 平衡化:
    在对红黑树进行一些增删改查的操作之后,很有可能会出现红色的右链接或者两条连续的红色的链接,而这些都不满足红黑树的定义,所以我们需要对这些情况通过旋转进行修复,让红黑树保持平衡。
    1. 左旋:
      当某个结点的左子节点为黑色,右子节点为红色,此时需要左旋。
      前提:当前节点为h,它的右子节点为x;
      左旋过程:
      1. 让x的左子节点变为h的右子节点:h.right = x.left;
      2. 让h成为x的左子节点:x.left = h;
      3. 让h的color属性变为x的color属性值:x.color = h.color;
      4. 让h的color属性变为RED:h.color = true;
    2. 右旋:
      当某个结点的左子节点为红色,且左子节点的左子节点也是红色,需要右旋。
      前提:当前节点为h,它的左子节点为x;
      左旋过程:
      1. 让x的右子节点变为h的左子节点:h.left = x.right;
      2. 让h成为x的右子节点:x.right = h;
      3. 让h的color属性变为x的color属性值:x.color = h.color;
      4. 让h的color属性变为RED:h.color = true;

红黑树的操作:

  1. 插入:
    一颗只含有一个键的红黑树只含有一个2-节点,插入另一个键后,我们马上就需要将他们旋转。
  1. 颜色反转:
    当一个结点的左子节点和右子节点的color都为RED时,也就是出现了临时的4-结点,此时只需要把左子节点和右子节点颜色变为BLACK,同时让当前的结点的颜色变为RED即可。
  2. 根结点的颜色总是黑色:
    之前我们介绍结点API的时候,在结点Node对象中color属性表示的是父节点指向当前节点的连接的颜色,由于根结点不存在父节点,所以每次插入操作之后,我们都需要把根结点的颜色设置为黑色
  3. 向树底层的3-结点插入新键
    假设在数的底部的一个3-节点下加入一个新的节点,前面我们所讲的3种情况都会出现,指向新节点的链接可能是3-节点的右链接(此时我们只需要转换颜色即可)或者左链接(此时我们需要进行右旋转再转换),或是中链接(此时需要先左旋然后再右旋转,最后转换颜色),颜色转换会使中间节点的颜色变红,相等于将它送进了父节点,这意味着父节点中继续插入一个新键,我们只需要使用相同的方法解决问题即可,直到遇到一个2-节点或者根结点为止。

B树:

B树是一种树状的数据结构,它能够存储数据,对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作,这种数据结构中,一个结点允许多于两个key的存在。B树是一种树状的数据结构,它能够存储数据,对其进行排序并允许以O(logn)的时间复杂度进行查找,顺序读取,插入和删除排序等操作。

B树的特性

B树允许一个节点中包含多个Key,可以是3个,4个,5个甚至更多,并不确定,需要看具体的实现,现在我们选择一个参数M,来构造一个B数,我们可以把它称作是M阶的B数,那么该数会具有如下特点:

B树的应用场景

B树在磁盘中的应用。

B+树:

B+树就是将B数中用于查找的指针节点变为只存地址的节点,而它不存数据,数据只存在叶子节点中,然后所有叶子叶子节点都链接起来。

B+树和B树的对比

B+树的优点在于:

  1. 由于B+树在非叶子结点上不包含真正的数据,只当做索引使用,因此在内存相同的情况下,能够存放更多的key。
  2. B+树的叶子节点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索,而B树则需要进行每一次的递归遍历。

B树的优点在于:

  1. 由于B树的每一个节点都包含key和value,因此我们根据key查找value时,只需要找到key所在的位置,就能找到value,但B+树只有叶子节点存储数据,索引每一次的查找,都必须一次一次,一直找到树的最大深度处,也就是叶子节点的深度,才能找到value。

B+树在数据库中的应用

在数据库的操作中,查询操作应该是最繁琐的一种操作,因此在设计数据库时,必须要考虑查询的效率问题,在很多数据库中,都是用到了B+树来提高查询的数据

在操作数据库时,为了提高查询效率,可以基于某张表的某个字段建立索引,就可以提高查询效率,其实这个索引就是B+树这种数据结构实现的。

标签:左子,结点,数据结构,实现,链接,color,查找,树及,节点
来源: https://blog.csdn.net/x_lei_/article/details/115522064