ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-08 18:59:14  阅读:170  来源: 互联网

标签:左子 结点 数据结构 实现 链接 color 查找 树及 节点


数据结构-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查找树的操作及性质

  • 查找:
    将二叉查找树的查找算法一般化我们就能直接得到2-3的查找算法,要判断一个键是否在树中,我们先将它和根结点中的键比较,如果它和其中任意一个相等,查找命中;否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归地继续查找,如果这个是空链接,查找未命中。
  • 插入:
    往2-3树中插入元素和往二叉查找树中插入元素一样,首先要进行查找,然后将节点挂到未找到的节点上,2-3数之所以能够保证在最差的情况下的效率好的原因在于其插入之后仍然能够保证平衡状态,如果查找后未找到的节点是一个2-结点,那只需要将新的元素放到这个2-3的结点里面使其变成一个3-结点即可,但是如果查找的节点结束与一个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-节点,插入另一个键后,我们马上就需要将他们旋转。
  • 如果新键小于当前节点的键,我们只需要新增一个红色节点即可,新的红黑树和单个3-结点完全等价。
  • 如果新键大于当前节点的键,那么新增的红色结点将会产生一条红色的右链接,此时我们需要通过左旋,把红色的右链接变成左链接,插入操作才算完成,形成的新的红黑树依然和3-节点等价,其中含有两个键,一条红色链接。
  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数,那么该数会具有如下特点:

  • 每个结点最多有M-1个key,并且以序排列
  • 每个结点最多有M个子节点
  • 根据点至少有两个子节点
    在实际应用中B树的阶数一般都比较大(通常大于100),所以,即使存储大量的数据,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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有