【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.hqwc.cn/news/486483.html

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

相关文章

全球游戏市场回暖,Flat Ads推动海外获客增长

摘要:热门游戏品类分析,解读新兴市场与赛道 近日,中国音数协游戏工委发布了《2023年中国游戏出海研究报告》,据报告数据显示,2023年,全球游戏市场规模11773.79亿元,同比增长6.00%,呈现增长回暖趋势。 图源:伽马数据 1.SLG和RPG游戏热度居高不下,休闲游戏增长势头强劲 目前,S…

MIT6.S081学习——二、相关命令行整理

MIT6.S081学习——二、相关命令行整理 1 添加user代码到xv6中并编译2 git版本管理 1 添加user代码到xv6中并编译 问题:如何让在xv6中运行copy.c 答:在xv6中运行copy.c文件,你需要先将该文件添加到xv6源代码目录中,然后修改Makefil…

iOS整理 - 关于直播 - 搭建服务端

前言 其实本人一直都想自己简单做一套直播(包括移动端和服务端)的开发测试,但是之前一直做得比较迷茫。最近偶然间在来了灵感,瞬间解除了我很多疑惑。我会分享出来,希望大家一起研究下。稍后,我完整做好了…

MKdocs添加顶部公告栏

效果如图: docs/overrides下新建main.html ,针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…

网安播报 | AI生成代码对组织和软件供应链构成了重大风险

1、AI生成代码对组织和软件供应链构成了重大风险 根据Veracode最新发布的软件安全报告,42%的应用程序和71%的组织中普遍存在软件安全债务,而AI生成代码的激增将导致安全债务问题恶化并对软件供应链构成重大风险。更令人担忧的是,46%的组织持续…

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例:高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

金蝶-EAS easWebClient 任意文件读取漏洞复现

前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、产…

2024年统计学、智能控制与软件科学国际会议(ICSICSS2024)

2024年统计学、智能控制与软件科学国际会议(ICSICSS2024) 会议简介 我们很高兴邀请您参加将在中国南京举行的2024年统计、智能控制和软件科学国际会议(ICSICSS2024)。此次活动将为就统计学、智能控制和软件科学以及解决人工智能的最佳实践进行富有成果…

智慧项目管理平台安全系统开发,实现智慧化、精细化、智能化管理

场景建设需求 1.建设内容:智慧项目管理平台以工程项目为载体,着眼交通运输铁路施工、道路施工、建筑施工相关行业,以标准化、统一化、动态管理为抓手,以互联网、大数据云计算、5G应用、数字孪生、趋势分析、安全预警、视频监控等…

【Python笔记-设计模式】原型模式

一、说明 原型模式是一种创建型设计模式, 用于创建重复的对象,同时又能保证性能。 使一个原型实例指定了要创建的对象的种类,并且通过拷贝这个原型来创建新的对象。 (一) 解决问题 主要解决了对象的创建与复制过程中的性能问题。主要针对…

Leetcoder Day17| 二叉树 part06

语言:Java/C 654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 …

git切换仓库地址

已有git仓库,要切换提交的仓库地址,用以下命令 git remote set-url origin 自己的仓库地址 用以下命令,查看当前仓库地址: git remote show origin 切换仓库后,用以下命令初始化提交仓库: git push -u o…