【Algorithms 4】算法(第4版)学习笔记 10 - 3.3 平衡查找树(上篇)

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 0:符号表 ST 的回顾
      • 1:2-3 查找树
      • 1.1:定义
      • 1.2:2-3 树 demo 演示
      • 1.2.1:搜索:成功命中
      • 1.2.2:搜索:未命中
      • 1.2.3:插入:2-节点
      • 1.2.4:插入:3-节点 1
      • 1.2.5:插入:3-节点 2
      • 1.2.6: 插入:2-3 树构造
      • 1.3:2-3 树局部变换
      • 1.4:2-3 树全局性质
      • 1.5:2-3 树性能
      • 1.6:符号表实现小结
      • 1.7:2-3 树实现?

前言

由于本章节的内容很多,所以分成了上下两篇,本篇比较简单,主要内容是 2-3 树 以及其相关的 API 操作介绍。

在学习本章节前,建议先学习上一章节关于 BST(二叉搜索树)的内容。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《3.3 平衡查找树》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。

开篇的时候,Prof. Sedgewick 是这样介绍本章节的:

Which will lead us to an ultimate symbol table implementation that can provide fast performance for all the simulative options we’ve looked at, guaranteed.
这将引导我们得到一个终极符号表实现,能够确保为迄今为止我们所探讨的所有模拟选项提供快速的性能。

由此可见本章节的重要性,确实在实际中也有很多应用,在下篇的后面会有简单总结。

0:符号表 ST 的回顾

在这里插入图片描述

挑战:保证性能。
本课时:2-3树、左倾红黑树、B树。

(下篇将介绍左倾红黑树以及B树的相关内容)

1:2-3 查找树

1.1:定义

在这里插入图片描述

每个节点允许 1 或 2 个键。
2-节点:一个键,两个子节点。
3-节点:两个键,三个子节点。

在这里插入图片描述

完美平衡:从根节点到空链接的所有路径具有相同的长度。
对称顺序:中序遍历产生的键按升序排列。


这里插入一下,在刚开始的时候,没有很懂为什么不能 4 个节点,所以就问了一下通义:

Q:为什么 2-3 树,只能3节点不能4节点?
A: 2-3树的设计初衷是为了保持数据结构的自平衡,即在进行插入和删除操作时能够通过局部调整来维护节点间的平衡条件,从而确保查找、插入和删除等基本操作的时间复杂度维持在O(log n)。在2-3树中,节点可以是2节点或3节点:

  • 2节点:包含1个键值对和2个子指针(左子树和右子树)。
  • 3节点:包含2个键值对和3个子指针。

之所以设计成只有2节点和3节点,而不是直接引入4节点,是因为2-3树的平衡是通过将满的3节点分裂为两个2节点实现的,这样就能保证任何路径上的节点数量大致相等,进而维持了树的高度均衡。如果允许4节点存在,那么在处理插入和删除时需要更复杂的机制来保持平衡,而这种平衡机制在2-3树的基础上进一步扩展形成了2-3-4树(也称为2-4树),其中4节点可以容纳3个键值对和4个子指针。

在2-3-4树中,当一个4节点由于插入或删除变得不平衡时,可以通过拆分或合并节点的方
式重新达到平衡状态。而在经典的2-3树中,则不允许直接出现4节点以简化平衡过程。


1.2:2-3 树 demo 演示

在这里插入图片描述

搜索:

  • 将搜索键与节点中的键进行比较。
  • 找到包含搜索键的区间。
  • 沿着关联的链接(递归地)继续搜索。

书本中的说明:

要判断一个键是否在树中,我们先将它和根结点中的键比较。如果它和其中任意一个相等,查找命中;否则我们就根据比较的结果找到指向相应区间的链接,并在其指向的子树中递归地继续查找。如果这是个空链接,查找未命中。

1.2.1:搜索:成功命中

搜索 H:

初始状态:

在这里插入图片描述

与根节点 M 比较(更小),左移:

在这里插入图片描述

与节点 M 左子树节点 E J 比较(介于两者之间),走中路:

在这里插入图片描述

与节点 E J 中子树节点 H 比较(相等),搜索命中:

在这里插入图片描述

1.2.2:搜索:未命中

搜索 B:

初始状态:

在这里插入图片描述

与根节点 M 比较(更小),左移:

在这里插入图片描述

与节点 M 左子树节点 E J 比较(更小),左移:

在这里插入图片描述

与节点 E J 左子树节点 A C 比较(介于两者之间),走中路:

在这里插入图片描述

B 走中路为空链接,查找未命中(并返回null):

在这里插入图片描述

1.2.3:插入:2-节点

插入操作和普通 BST 类似,不同的是要调整 2-节点和 3-节点,让树保持完美的平衡。

在这里插入图片描述

在底部插入一个 2-节点:

  • 按照常规方法搜索键。
  • 用 3-节点替换 2-节点。

插入 K:

初始状态:

在这里插入图片描述

搜索阶段步骤类似,遇到空链接则结束,K 完整移动路线图:

在这里插入图片描述

搜索完成:

在这里插入图片描述

将 2-节点改为 3-节点,双链改为三链,插入完成:

在这里插入图片描述


在这里插入图片描述

1.2.4:插入:3-节点 1

在这里插入图片描述

在底部插入一个 3-节点:

  • 向 3-节点添加新键以创建临时的 4-节点。
  • 将 4-节点中的中间键移至其父节点。

插入 Z:

初始状态:

在这里插入图片描述

搜索阶段步骤类似,遇到空链接则结束,Z 完整移动路线图:

在这里插入图片描述

搜索完成:

在这里插入图片描述

将 3-节点改为 临时 4-节点,三链改为 临时四链

在这里插入图片描述


在这里插入图片描述

对临时 4-节点 分解(拆分)

  • 4-节点中键移动到父节点,父节点由 2-节点变为 3-节点,双链变成三链
  • 右子树(S Z)拆分,由3-节点变为 2-节点
  • 插入完成

在这里插入图片描述


在这里插入图片描述

1.2.5:插入:3-节点 2

在这里插入图片描述

在底部插入一个 3-节点:

  • 向 3-节点添加新键以创建临时的 4-节点。
  • 将 4-节点中的中间键移至其父节点。
  • 如有必要,沿树向上重复此过程。
  • 如果到达根节点且该根节点是 4-节点,则将其拆分为三个 2-节点。

插入 L:

初始状态:

在这里插入图片描述

这里省略了搜索阶段,只讲解分解阶段。

在底部 3-节点 H P 插入节点 L:

在这里插入图片描述


在这里插入图片描述

临时 4-节点 H L P 分解:

  • 中键 L 移动至父节点
  • 3-节点 H P 分为 2 个 2-节点

在这里插入图片描述

再次分解 临时 4-节点 E L R:

  • 中键 L 上移变为新的根节点
  • 3-节点 E R 分为 2 个 2-节点
  • 树高 +1
  • 插入完成(不得不说,妙哇~!!!)

在这里插入图片描述


在这里插入图片描述

1.2.6: 插入:2-3 树构造

步骤太长,这里直接用书里的步骤插图。

在这里插入图片描述
图3.3.10 2-3树的构造轨迹

1.3:2-3 树局部变换

在这里插入图片描述
图3.3.9 4-结点的分解是一次局部变换,不会影响树的有序性和平衡性

1.4:2-3 树全局性质

在这里插入图片描述

不变性:保持对称有序和完美平衡。
证明:每次转换都保持了对称有序和完美平衡。

在这里插入图片描述
图3.3.8 在一棵 2-3 树中分解一个 4-结点的情况汇总

1.5:2-3 树性能

在这里插入图片描述

1.6:符号表实现小结

在这里插入图片描述

1.7:2-3 树实现?

在这里插入图片描述

直接实现较为复杂,原因在于:

  • 维护多种节点类型十分繁琐。
  • 需要多次比较才能向下遍历树。
  • 为了分解 4-节点,需要回溯至父节点。
  • 针对分解操作存在大量不同情况。

归根结底,虽然可以实现,但有更好的方法。

(未完待续)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地理位置查询定位:技术原理与实际应用

在互联网时代,IP地址是连接世界的桥梁,而了解IP地址的地理位置对于网络管理、个性化服务以及安全监控都至关重要。IP数据云将深入探讨IP地理位置查询定位的技术原理、实际应用场景以及相关的隐私保护问题,旨在为读者提供全面了解和应用该技术…

猫头虎分享已解决Bug || SyntaxError: Unexpected token < in JSON at position 0

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

ubuntu制作windows的u盘启动盘

概要: 本篇演示在ubuntu22.04中制作windows10的u盘启动盘 一、下载woeusb 1、下载woeusb 在浏览器中输入https://github.com/woeusb/woeusb/releases访问woeusb 点击红色矩形圈出来的部分,下载woeusb 2、安装wimtools wimtools是woeusb的一个必须的…

LiveGBS流媒体平台GB/T28181功能-自定义收流端口区间30000至30249UDP端口TCP端区间配置及相关端口复用问题说明

LiveGBS自定义收流端口区间30000至30249UDP端口TCP端区间配置及相关端口复用问题说明 1、收流端口配置1.1、INI配置1.2、页面配置 2、相关问题3、最少可以开放多少端口3.1、端口复用3.2、配置最少端口如下 4、搭建GB28181视频直播平台 1、收流端口配置 1.1、INI配置 可在lives…

开启智能互动新纪元——ChatGPT提示词工程的引领力

目录 提示词工程的引领力 高效利用ChatGPT提示词方法 提示词工程的引领力 近年来,随着人工智能技术的迅猛发展,ChatGPT提示词工程正逐渐崭露头角,为智能互动注入了新的活力。这一技术的引入,使得人机交流更加流畅、贴近用户需求&…

基于CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN(卷积神经网络)部分 4.2 GRU(门控循环单元)部分 4.3 Attention机制部分 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版…

自动化测试测试框架封装改造

PO模式自动化测试用例 PO设计模式是自动化测试中最佳的设计模式,主要体现在对界面交互细节的封装,在实际测试中只关注业务流程就可以了。 相较于传统的设计,在新增测试用例后PO模式有如下优点: 1、易读性强 2、可扩展性好 3、…

网络图谱构建系统目前已实现的功能

一.移动智能终端: 1.主页面: 地图层调用百度地图api。要在百度地图开发社区申请密钥和服务。 界面中卡片,悬浮按钮,上标题栏都采用谷歌公司material desgin设计风格。 2.标题栏: 采用toolbar,可以应用程…

基于springboot的线上阅读系统项目实战

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 2.1 用户模块实现 2.1.1 登入注册功能 2.1.2 修改功能 2.1.3 充值功能 2.1.4 会员功能 2.1.5 阅读记录 2.2 书架模块实现 2.2.1 增加功能 2.2.2 移除功能 2.2.3 排序功能 2.3 书库模块实现 2.3.1 排行榜功能 2.3.2 分类…

Android全新UI框架之常用ComposeUI组件

在Compose中,每个组件都是一个带有Composable注解的函数,被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。 在布局方面,Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多),类似于传统视图…

几个常见的C/C++语言冷知识

当涉及到C/C语言时,有一些冷知识可能并不为人所熟知,但却可以让你更深入地理解这门古老而强大的编程语言。以下是一些有趣的C/C语言冷知识。 1. 数组的下标可以是负数 在我们日常的C语言编程中,数组是一个非常常见的数据结构。我们习惯性地使…

Flutter学习4 - Dart数据类型

1、基本数据类型 num、int、double (1)常用数据类型 num类型,是数字类型的父类型,有两个子类 int 和 double 通过在函数名前加下划线,可以将函数变成私有函数,私有函数只能在当前文件中调用 //常用数据…

干货分享 | TSMaster 序列发送模块在汽车开发测试中的应用

众所周知,序列发送模块可以不需要脚本代码实现测试中特定控制报文序列的发送,该模块多用于循环顺序控制的测试案例中。序列发送模块的常用场景,主要是针对一些新开发的产品需要通过该模块来验证产品功能等等。本文重点和大家分享一下关于TSMa…

防御保护——内容安全笔记

双机热备配置 1,根据网段划分配置IP地址和安全区域 2,配置双机热备场景 主备场景配置 抢占延时仅对主设备生效。 hello报文周期时间--- 默认为1S,可以修改,但是,主备设备需要同时修改为相同值。 配置VRRP虚拟IP地址时&…

苹果iPad通过Code APP应用实现SSH连接服务器远程进行开发

文章目录 1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 本文主要介绍开源iPad应用IDE Code App 如何下载安装,并…

C语言第二十八弹---整数在内存中的存储

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、整数在内存中的存储 2、大小端字节序和字节序 2.1、什么是大小端? 2.2、为什么有大小端? 2.3、练习 2.3.1、练习1 2.3.2、练习2 2.…

性能全面提升!探索ONLYOFFICE最新8.0版:更快速、更强大,PDF表单编辑轻松搞定!

文章目录 PDF表单功能表单模板 屏幕朗读器功能EXCEL新增功能单变量求解图表向导数字排序 PPT 新增功能新增语言区域设置和优化插件界面 ONLYOFFICE 是由 Ascensio System SIA 推出的一款功能强大的办公套件,其中提供了适用于文本文档、表格以及演示文稿的在线编辑软…

2024 全国水科技大会暨第二届智慧水环境管理与技术创新论坛

论坛二:第二届智慧水环境管理与技术创新论坛 召集人:刘炳义 武汉大学智慧水业研究所所长、教授 为贯彻落实中共中央国务院印发《数字中国建设整体布局规划》和国务院关于印发《“十四五”数字经济发展规划》的通知,推动生态环境智慧治理&…

Spring Boot打war包部署到Tomcat,访问页面404 !!!

水善利万物而不争,处众人之所恶,故几于道💦 文章目录 Spring Boot打war包部署到Tomcat,访问页面404 !!!解决办法:检查Tomcat版本和Jdk的对应关系,我的Tomcat是6.x&#x…

3DSC特征描述符、对应关系可视化以及ICP配准

一、3DSC特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <pcl…