数据结构编程实践20讲(Python版)—08红黑树

server/2024/10/18 3:14:37/

本文目录

    • 08 红黑树(Red-Black Tree)
      • S1 说明
      • S2 示例
      • S3:红黑树代码
        • 问题1:数据库索引
        • 问题2:时间调度
        • 问题3:内存管理

往期链接

01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树

08 红黑树(Red-Black Tree)

S1 说明

红黑树是一种自平衡的二叉搜索树(BST),它具有以下特性,以保持树的平衡性,从而确保基本操作(如插入、删除和查找)的时间复杂度为 O(log n)。

红黑树的性质:

  • 每个节点是红色或黑色。
  • 根节点是黑色。
  • 每个叶子节点(Nil或空节点)是黑色。
  • 如果一个节点是红色,则它的两个子节点都是黑色(即没有两个红色节点相邻)。
  • 从任何节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。

红黑树的应用

  • 数据库系统:用于实现索引,红黑树能够快速插入、删除和查找。
  • 内存管理:在一些内存分配器中,用于跟踪内存块的分配和释放。
  • 编程语言的标准库:如 C++ STL 中的 map 和 set,通常使用红黑树来实现。
  • 操作系统:在调度和资源管理中,红黑树可用于管理进程和任务。

红黑树和AVL树的对比

1. 平衡策略

  • AVL树:
    • 每个节点的平衡因子(左子树高度减去右子树高度)只能是 -1、0 或 1。
    • 更严格的平衡条件,通常导致树的高度更低。
  • 红黑树:
    • 通过颜色(红色或黑色)和一系列性质来保持平衡。
    • 允许更大的高度差,通常会导致树的高度相对较高。

2. 旋转操作

  • AVL树:
    • 在插入和删除操作后,可能需要进行多次旋转,以保持严格的平衡。
    • 单次操作后可能需要进行多次调整。
  • 红黑树:
    • 旋转和重新着色的操作相对较少,通常在插入或删除后最多只需进行两次旋转。

3. 查找性能

  • AVL树:
    • 由于更严格的平衡,查找操作通常更快,时间复杂度为 O(log n)。
  • 红黑树:
    • 查找操作的时间复杂度也是 O(log n),但由于可能的高度更高,查找速度可能稍慢于 AVL 树。

4. 插入和删除性能

  • AVL树:
    • 在插入和删除操作频繁的情况下,由于需要更多的旋转,性能可能较差。
  • 红黑树:
    • 对于插入和删除操作,红黑树的性能相对更好,更适合频繁修改的场景。

5. 应用场景

  • AVL树:
    • 适合查找频繁、插入和删除较少的场景。
    • 常用于需要快速查找的应用,例如内存管理和数据库索引。
  • 红黑树:
    • 更适合插入和删除操作频繁的场景。
    • 广泛用于各种标准库实现,例如 C++ STL 的 map 和 set。

S2 示例

python">import matplotlib.pyplot as plt
import networkx as nx
from networkx.drawing.nx_pydot import graphviz_layoutclass Node:def __init__(self, data, color='R', left=None, right=None, parent=None):self.data = dataself.color = colorself.left = leftself.right = rightself.parent = parentclass RedBlackTree:def __init__(self):self.NIL = Node(data=None, color='B')  # 哨兵 NIL 节点,所有空子节点都指向它self.root = self.NIL  # 初始化根节点为 NILdef insert(self, key):node = Node(data=key, left=self.NIL, right=self.NIL)  # 创建新节点,初始为红色self._insert_node(node)self._fix_insert(node)def _insert_node(self, node):parent = Nonecurrent = self.root# 找到插入位置while current != self.NIL:parent = currentif node.data < current.data:current = current.leftelse:current = current.rightnode.parent = parentif parent is None:self.root = node  # 树为空,新节点作为根节点elif node.data < parent.data:parent.left = nodeelse:parent.right = nodedef _fix_insert(self, node):# 修复红黑树性质while node != self.root and node.parent.color == 'R':parent = node.parentgrandparent = node.parent.parentif parent == grandparent.left:uncle = grandparent.rightif uncle.color == 'R':  # Case 1: 叔叔节点是红色parent.color = 'B'uncle.color = 'B'grandparent.color = 'R'node = grandparent

http://www.ppmy.cn/server/131268.html

相关文章

Agent ReAct小解

ReAct在AI Agent中是一种设计思想&#xff0c;它强调在执行任务时结合推理&#xff08;Reasoning&#xff09;和行动&#xff08;Acting&#xff09;两个方面&#xff0c;使得Agent能够在复杂和动态的环境中更有效地工作。以下是对Agent ReAct的详细解释&#xff1a; 一、ReAc…

windows下,在vscode中使用cuda进行c++编程

安装cuda CUDA Toolkit Downloads | NVIDIA Developer 这里网上教程多的是&#xff0c;在这个网址下载安装即可 我这台电脑因为重装过&#xff0c;所以省去了安装步骤&#xff0c;但是要重新配置环境变量。我重新找到了重装之前的CUDA位置(关注这个bin文件夹所在的目录) 在…

Django makemigrations时出现TypeError: ‘module‘ object is not iterable

使用Python 3.11、Django 5.1.2 写完model进行makemigrations时出现报错 报错的最下面提到了我自己创建的一个应用里的urls.py&#xff0c;尝试着给里面加上一个列表 然后问题解决了。。。 不知道为什么 makemigrations的时候会去检查urls。。。

图书馆自习室座位预约管理微信小程序+ssm(lw+演示+源码+运行)

摘 要 随着电子商务快速发展世界各地区,各个高校对图书馆也起来越重视.图书馆代表着一间学校或者地区的文化标志&#xff0c;因为图书馆丰富的图书资源能够带给我们重要的信息资源&#xff0c;图书馆管理系统是学校管理机制重要的一环&#xff0c;,面对这一世界性的新动向和新…

获取鸿蒙设备Udid遇到的问题

参考官方文档&#xff1a;注册调试设备-调试应用&#xff08;HarmonyOS&#xff09;-AppGallery Connect帮助中心 - 华为HarmonyOS开发者 (huawei.com) 坑一&#xff1a;The sdk hdc.exe version is too low, please upgrade to the latest version. 升级dev工具和sdk配置为api…

java脚手架系列4--测试用例、拦截器

异常处理、拦截器、数据库连接 1 测试用例 单元测试是一个老生常谈的问题&#xff0c;无论是后端对自己的代码质量把的第一道关也好&#xff0c;也是对测试减缓压力。这里就不过多讲述测试用例的重要性&#xff0c;但是有2个框架我们必须了解一下。 1.1 JUnit和mockito 我们…

【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程

文章目录 前言1. 预备知识&#xff1a;Debug的使用1.1 什么是Debug&#xff1f;1.2 我们用到的Debug功能1.3 进入Debug1.3.1 对于16位或者32位机器的进入方式1.3.2 对于64位机器的进入方式 1.4 R命令1.5 D命令1.6 E命令1.7 U命令1.8 T命令1.9 A命令 2. 总结3. 实操练习结语 前言…

入门端到端第一步!最新综述回顾基于深度学习的规划方法发展历程

这篇新的综述,系统的回顾了基于深度学习的预测和规划方法, 端到端方法的发展历程, 非常适合初学者了解领域背景. The Integration of Prediction and Planning in Deep Learning Automated Driving Systems: A Review 0. 摘要 自动化驾驶系统有潜力彻底改变个人、公共和货物…