平衡查找树(2-3-4 树)

简介:

二叉查找树(Binary Search Tree)在很多情况下可以良好的工作,但它的限制是最坏情况下的渐进运行时间为 O(n)。

平衡查找树(Balanced Search Tree)的设计则是保证其高度在最坏的情况下为 O(log n),其插入、删除和查找可以实现渐进运行时间 O(log n)。

现在其实存在很多种类的平衡查找树,常见的有 AVL树、红黑树、B 树等。

不同的平衡查找树的高度(height):

2-3 树

2-3 树中节点和存储的元素符合如下性质要求:

  1. 任一节点只能是 2 度节点或 3 度节点,不存在元素数为 0 的节点。
    • 2 度节点:包含 1 个元素的节点将只能有 2 个子节点;
    • 3 度节点:包含 2 个元素的节点将只能有 3 个子节点;
  2. 所有叶子节点都拥有相同的深度(depth)。
  3. 元素始终保持排序顺序。

相比二叉查找树,2-3 树的优势:

2-3 树可以获得更好的渐进查找时间 O(log2 n)。

2-3 树更容易保持树的平衡。

插入操作

将元素 I 插入到 2-3 树中,需要如下步骤:

  1. 定位元素 I 应被插入的叶子节点的位置;
  2. 将 I 插入到该叶子节点中;
  3. 如果叶子节点此时仅包含 2 个元素,则插入操作结束;
  4. 如果叶子节点此时包含 3 个元素,则需要分裂叶子节点成两个新的节点;

2-3-4 树(2-4 树)

2-3-4 树中节点和存储的元素符合如下性质要求:

  1. 任一节点只能是 2 度节点、3 度节点或 4 度节点,不存在元素数为 0 的节点。
    • 2 度节点:包含 1 个元素的节点将只能有 2 个子节点;
    • 3 度节点:包含 2 个元素的节点将只能有 3 个子节点;
    • 4 度节点:包含 3 个元素的节点将只能有 4 个子节点;
  2. 所有叶子节点都拥有相同的深度(depth)。
  3. 元素始终保持排序顺序。

          2 度节点                          3 度节点                            4 度节点

其中,每个子节点仍是一棵 2-3-4 树,但子节点可能为空。

在 2-3-4 树中,所有叶子节点都在同一层,也就是最底层。但是元素却可以出现在所有节点中,也就是说,即使是叶子节点,也可以包含1、2 或 3 个元素,但不能没有元素。2-3-4 树保持着完美的平衡,每一条到叶子节点的路径都是等长的。

非叶子节点必须拥有至少 1 个子节点。设节点的子节点的数量为 L,节点包含元素的数量为 D,则:L = D + 1 。

因为 2-3-4 树中的节点至多包含 4 个子节点,所以该树叶称为 4 阶多路树(multiway tree of order 4)。

查找节点

在 2-3-4 树中查找结点,分为以下几个步骤:

  1. 将被查找的元素与节点中存储的元素进行比较;
  2. 查找包含被查找元素的区间;
  3. 若区间存在,则移至子节点,回到第 1 步继续查找;

插入节点

插入节点时,将从根节点开始查找,步骤如下:

  1. 如果当前节点为 4 度节点(也就是有 3 个元素):
    • 移除并保存节点中间的元素值,然后生成一个 3 度节点(仅有 2 个元素);
    • 将该 3 度节点分裂成一对 2 度节点(仅有 1 个元素);
    • 如果当前节点是根节点:
      • 被保存的中间值将被设置为新的根节点,该根节点为 2 度节点,则树的高度将增加 1;
    • 否则,将中间值加入父节点中。
  2. 查找子节点中可以包含被插入值的区间;
  3. 如果找到的节点是一个叶子节点,则将被插入值放入该节点中,插入操作结束;
    • 否则,继续查找子节点,或回到步骤 1。

例如,现在要将值 "25" 插入到如下的 2-3-4 树中:

从根节点(10,20)开始查找,向子树查找,直到找到子节点(22,24,29)。因为区间(20,∞)包含 25。

节点(22,24,29)是一个 4 度节点,所以将其中间值 24 推到父节点中。

剩下的 3 度节点(22,29)将被分裂成一对 2 度节点,也就是(22)和(29)。新的父节点为(10,20,24)。

在下降到右侧子节点(29)。因为区间(24-29)包含 25。

节点(29)没有左孩子。可将 25 直接插入到该节点中,插入完毕。

节点的分裂方式

将 4 度节点分裂的方式如下:

如果一个 4 度节点的父节点是一个 2 度节点,则将按如下方式分裂 4 度节点:

如果一个 4 度节点的父节点是一个 3 度节点,则将按如下方式分裂 4 度节点:

删除节点

情况1:临近兄弟节点是 3 度节点或 4 度节点。

解决方案:通过旋转操作和移动子树来从临近节点偷元素(steal)。

情况2:临近兄弟节点是 2 度节点。

解决方案:通过与临近兄弟节点合并,并从父节点偷元素。

参考资料






本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/p/balanced_search_tree.html,如需转载请自行联系原作者

目录
相关文章
|
7天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1327 7
|
5天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
305 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
4天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
16天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1399 87
|
4天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
5天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
300 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
6天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
234 82
2025年阿里云域名备案流程(新手图文详细流程)