2-3查找树-树-数据结构和算法(Java)

news2024/11/25 14:59:01

文章目录

    • 1 概述
    • 2 查找
    • 3 插入
      • 3.1 向2-结点中插入新键
      • 3.2 向一个只含有一个3-结点的树中插入新键
      • 3.3 向一个父结点为2-结点的3-结点中插入新键
      • 3.4 向一个父结点为3-结点的3-结点中插入新键
    • 4 分析
      • 4.1 局部变换
      • 4.2 全局性质
    • 5 后记

1 概述

我们前面学习过关于二叉树的算法已经能够很好地用于许多应用中,但他们在对坏情况下的性能很糟糕。比如将有序数列插入二叉查找树中,二叉查找树实际退化为单链表,时间复杂度为线性。在一棵含有N个结点的树中,我们希望树高为 ∼ lg ⁡ N \sim\lg N lgN,这样我们就能保证查找都能在 ∼ lg ⁡ N \sim\lg N lgN次比较内结束,就和二分查找一样。那么这里我们会介绍一种二分查找树并能保证物理如何构造它,它的运行时间都是对数级别的。

2-3树是最简单的B-树(或-树)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。高为h的2-3树包含的节点数大于等于高度为h的满二叉树的节点数,即至少有 2 h − 1 2^h-1 2h1个节点。

一棵2-3查找树为一棵空树或者由以下节结点构成:

  • 2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的结点都小于该结点,有链接指向的2-3树中的结点都大于该结点。
  • 3-结点:含有两个键(及其对应的值)和3条链接,左链接指向的2-3树中的结点都小于该结点中的较小建,中链接指向的2-3树中的结点位于该结点的2个键之间,右链接指向的2-3树中的结点都大于该结点中的较大键。

指向一棵空树的链接称为空链接。

2-3查找树示意图如下1-1所示:

在这里插入图片描述

一棵完美平衡的2-3查找树中的所有空链接(或叶结点)到根结点的距离都是相同的。

2 查找

将二叉查找树的插在算法一般化我们就能够得到2-3树的查找算法。要判断一个键是否在树中,我们先将它和根结点中的键比较。如果它和其中任一键相等,直接命中;否则我们就根据比较的结果找到链接对应的区间,并在其指向的子树中循环(或递归)查找。直到空链接,说明未命中,键不在树中。

命中和未命中查找,如下图2-1所示:在这里插入图片描述

3 插入

要在2-3树中插入一个新结点,我们可以和二叉查找树一样先进行一次未命中查找,然后把新结点挂载树的底部。但这样的话树无法保持完美平衡性。我们使用2-3树的主要原因就在于它能够在插入后保持完美平衡性。

3.1 向2-结点中插入新键

如果未命中查找结束于2-结点,我们只需要把该2-结点替换为3-结点,把要插入的键值保持在该结点即可,如下图3.1-1所示:在这里插入图片描述

3.2 向一个只含有一个3-结点的树中插入新键

如果未命中查找结束一个3-结点,情况相对来说有点复杂。在考虑一般情况之前,我们先假设当前只有一个3-结点即根节点,步骤如下:

  • 把该3-结点扩展为4-结点,把键值对放入合适位置
  • 该4-结点向上生长(拆分)为3个2-结点,拆分规则如下:
    • 跟结点包含中键
    • 根结点的左结点包含较小的键
    • 根结点右结点包含较大的键

这棵新的2-3树在保证有序的情况下,也保证了平衡性,因为所有的空结点到根结点的距离是相等的。这个例子很简单但值得学习,它说明了2-3树是如何生长的,即向上生长,如下图3.2-1所示:在这里插入图片描述

树的高度变化:

  • 插入前1
  • 插入后+1=2
    • 2-3树只会向上生长,只有根结点的生长使高度+1

3.3 向一个父结点为2-结点的3-结点中插入新键

假设未命中的查找结束于3-结点n3,它的父结点为一个2-结点p2,插入执行流程如下:

  1. 把n3 3-结点扩展为4-结点,键值插入合适位置,使该结点保持有序性。

  2. 把该4-结点分解,其中中键移动至其父结点中,插入父结点的合适位置,使之有序。

    • 父结点为2-结点有空间,扩展为3-结点
  3. 4-结点的剩余小大键分别作为其父结点的子结点,根据有序性链接到合适区间。

这些操作,中键移入父结点中,插入新键、中键分解、中键加入结点,父结点链接调整,这些操作都进行有序性调整,保证有序性;且保证了平衡性,空结点到根节点的距离依然不变。插入后2-3树依然是完美平衡的,如下图3.3-1所示:在这里插入图片描述

3.4 向一个父结点为3-结点的3-结点中插入新键

现在假设未命中查找结束于一个父结点也是3-结点的3-结点,插入流程如下:

  1. 把3-结点扩展为4-结点,键值插入合适位置,使该结点保持有序性。
  2. 中键分解移入父结点,因为父结点也是3-结点,执行同步骤1一样的操作
  3. 剩余小大键根据有序性,链入父结点合适位置
  4. 重复执行步骤1~3,直至父结点为2-结点或者根节点为3-结点
    • 父结点为2-结点,参考3.3操作
    • 父结点为3-根结点,参考3.2操作

推广到一般情况,我们一直向上分解临时4-结点把中键插入更高的父结点,直至遇到2-结点或者根节点为3-结点,分解根结点,依然保持了2-3树的完美平衡性,如图3.4-1所示:在这里插入图片描述

4 分析

4.1 局部变换

将一个4-结点分解为一棵2-3树的可能有6种情况。这个4-结点可能是根节点,可能是一个2-结点的左子结点或者右子结点,也可能是一个3-结点的左子结点、中子结点或者右子结点。2-3树的插入算法的根本在于这些变换都是局部的:除了相关的结点和链接之外不必修改或者检查树的其他部分。每次变换,变更的链接不会超过一个很小的常数。需要特别指出的是,不光是在树的底部,树中的其他任何地方只要符合相应的模式,变换都可进行。每个变换都会将4-结点中的一个键送入它的父结点中,并重构相应的链接而不必涉及树的其他部分。

4.2 全局性质

这些局部变换不会影响全局有序性和平衡性:任意空链接到根结点的路径长度都是相等的。

不同于标准的二叉查找树,2-3树的生长是由下向上的。

2-3树的分析和二叉查找树大不相同,因为我们主要感兴趣的的最坏情况下的性能而非一般情况。在符号表的实现中,一般我们无法控制用例会按照什么顺序向表中插入键,因此对最坏情况的分析是唯一提供性能保证的办法。

命题F。在一棵大小为N的2-3树中,查找和插入操作访问结点的比如不超过 lg ⁡ N \lg N lgN个。

证明。一棵含有N个结点的2-3树高度h的范围为 ⌊ lg ⁡ N ⌋ ≥ h ≥ ⌊ log ⁡ 3 N ⌋ \lfloor\lg N\rfloor\ge h\ge \lfloor \log_3N\rfloor lgNhlog3N

虽然我们分析了2-3树的性质特点和一些操作步骤,但是要 实现很复杂。包括维护2种类型的结点,将被查找的键和结点中的每个键进行比较,将链接和其他信息从一种结点复制到另外一种结点等等。实现这些不仅需要大量的代码,而且他们所产生的额外开销可能会使算法比标准的二叉查找树更慢。那我们为什么还要研究它呢?因为它是接下来我们要学习其他一些树形结构的理论基础。下面我们只需要一点点代价就能用一种统一的方式完成所有变换,即我们要学习的红黑树

5 后记

​ 如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/algorithm

[1][美]Robert Sedgewich,[美]Kevin Wayne著;谢路云译.算法:第4版[M].北京:人民邮电出版社,2012.10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDN工作原理以及使用CDN的好处

所有的大厂以及其他很多互联网公司都使用了CDN,那CDN到底是什么呢?为什么要使用?一起来看看吧! 文章目录1. 什么是CDN?2. CDN 是怎么工作的?3. 使用 CDN 有什么好处?3.1 缩短网站加载时间3.2 减…

Zookeeper[2]- Zookeeper集群环境搭建

前边步骤可参考: Zookeeper[1]-Zookeeper介绍与安装以及集群环境准备_豆虫儿的博客-CSDN博客Zookeeper的介绍和安装Zookeeper客户端使用ZookeeperJavaAPI使用我们为了学习Dubbo,而在dubbo中需要一个注册中心,而Zookeeper是我们在使用Dubbo是官方推荐的…

作业-12.13【使用QT制作一个简单的登录界面】

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //设置窗口属性 this->setWindowTitle("Sumeru Dance Training"); this->setFixedSize(8…

[激光原理与应用-52]:《激光焊接质量实时监测系统研究》-3-传感器选型和电路设计

目录 3.1 传感器的选取 3.1.1 光电探测基本概念 3.1.2 可见光传感器 3.1.4 声音传感器 3.2 信号调理电路 3.2.0 可见光电信号前置放大电路 3.2.1 红外光电信号前置放大电路 3.2.2 程控自适应增益的光信号放大电路 3.2.3 光信号滤波电路 3.2.4 声信号调理电路 3.3 数据…

【图像处理】边缘检测算子有哪些以及它们之间的对比

这个问题应该是做过传统图像处理的人都接触过的吧。粗略总结下,应该也不会问太细,面试官大概就考察下大家的知识面吧。 综述 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。图像边缘检测大幅度地减少了数据量&#xf…

第五章. 可视化数据分析图表—常用图表的绘制3—散点图,面积图,热力图

第五章. 可视化数据分析图 5.3 常用图表的绘制3—散点图,面积图,热力图 本节主要介绍常用图表的绘制,主要包括散点图,面积图,热力图。 1.散点图(matplotlib.pyplot.scatter) 散点图主要用来查…

Redux Hooks actions 调用方式优化(一)

hooks 可以说是现在react编程的的主流,redux 迎合这个主流也推出 toolkit 工具集来。但是在用toolkit 搭建前端框架后,给人的感觉就是比原先的connect 那一套好些,但用起来还是挺繁琐的。 一 toolkit 搭建的正常使用版本 1.1 创建store im…

三、pcm音频转wav

前言 ffmpeg录制下来的音频为pcm格式(内部存储着十六进制数据),但pcm格式的音频无法直接播放 本文先将pcm转换成wav格式(提要提前了解音频知识) 首先分析wav文件格式(wav的本质是在pcm数据前加上文件头&a…

[附源码]Node.js计算机毕业设计电子工厂进销存管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

《Linux运维总结:Centos7.6使用yum安装Mysql8.0.31》

一、使用yum安装mysql服务 官方:下载对应的yum源 1、yum源下载 [rootlocalhost ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm [rootlocalhost ~]# rpm -ivh mysql80-community-release-el7-7.noarch.rpm如下图所示:…

vsftpd 升级3.0.2-29 和 增加账号访问

一、下载文件至/opt 百度网盘: 链接: https://pan.baidu.com/s/1Ad20bm5fvw8WvtaV3uHGYA 提取码: 2pa9 二、安装 2.1、切换目录 命令:cd /opt 2.2、授权 命令:chmod x centos7.6-vsftpd-upgrade.sh 2.3、安装 命令:./cent…

D. Lucky Chains(gcd + 线性筛)

Problem - D - Codeforces 如果一对正整数(x,y)的最大公除数等于1(gcd(x,y)1),我们就把它们命名为幸运。 让我们把由(x,y)引起的链定义为一个由(x,y), (x1,y1), (x2,y2), ..., (xk,yk)组成的序列,对于某个整数k≥0。 如果链中的所有配对都是幸运的&…

2022-12-13 note

1、linux内核的特点 1. linux内核是完全开源的作者:linusgit --> 代码版本管理工具 2. linux内核源码支持多种不同的架构,比如arm架构,powerPC,mips,Risc-V,X86等 3. linux内核采用模块化的编译的思想 4. 在linux内核中只允许出现C代码或…

优秀的PM如何轻松应对公司90%以上的沟通难题

项目经理和PMO工作中最多的事情往往是沟通,但是你在工作中会不会遇到很多沟通难题?如果其他环节的人处理不好还可以理解,但是咱们处理不好就说不过去了,并且还会让人感觉不专业,丧失很多机会,甚至失去领导的…

代码随想录Day49|121.买卖股票的最佳时期、122.买卖股票的最佳时期II

文章目录121.买卖股票的最佳时期、122.买卖股票的最佳时期II121.买卖股票的最佳时期、 文章讲解:代码随想录 (programmercarl.com) 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 题目: 给定一个数组 prices…

Metal每日分享,调整灰度系数gamma滤镜效果

本案例的目的是理解如何用Metal实现灰度系数效果滤镜,输入像素rgb进行次方运算获取到新的rgb; Demo HarbethDemo地址 实操代码 // 灰度系数滤镜 let filter C7Gamma.init(gamma: 3.0)// 方案1: ImageView.image try? BoxxIO(element: originImage,…

[附源码]Node.js计算机毕业设计儿童闲置物品交易网站Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

六、JavaScript——变量的内存结构

一、内存 定义&#xff1a;内存是用于存储数据的地方&#xff0c;程序要执行一段代码&#xff0c;要先从硬盘加载到内存当中&#xff0c;再由内存发送给CPU,CUP才能对代码进行执行。 注&#xff1a;变量并不存储任何值&#xff0c;而是存储值的内存地址 JS定义一个变量 <s…

Telerik模拟生成规则的新设置

Telerik模拟生成规则的新设置 添加了对Microsoft.NET 7官方版本的支持。 添加了控制模拟生成规则的设置。 Telerik JustLock是一个易于使用的模拟工具&#xff0c;它将帮助您以前所未有的速度、更高的质量编写单元测试。JustLock允许您轻松地将测试场景与难以配置的依赖关系(如…

5G现场网的数字孪生体系架构

现场网面向钢铁生产和统一管理的场景&#xff0c;实现现场设备与数据采集器和控制器的网络连接和数据互通&#xff0c;现场网的ZigBee、蓝牙等短距离技术以及窄带物联网&#xff08; narrowbandinternetofthings,NB-IoT&#xff09;、超远距离&#xff08;longrange,LoRa&#…