当前位置: 首页 > news >正文

一文详解红黑树

一文详解红黑树

  • 前言
  • 一、基本概念与特性
    • 1.1 红黑树的定义
    • 1.2 红黑树的特性
  • 二、红黑树的节点结构与表示
  • 三、红黑树的基本操作
    • 3.1 插入操作
    • 3.2 删除操作
  • 四、红黑树的应用场景
    • 4.1 编程语言的集合类
    • 4.2 数据库索引
    • 4.3 Linux 内核进程调度
  • 总结

前言

在数据结构的领域中,红黑树是一种高效且实用的自平衡二叉搜索树。它在保证二叉搜索树基本特性的同时,通过一系列规则维持树的平衡,从而确保插入、删除、查找等操作在平均和最坏情况下都能保持高效。红黑树广泛应用于编程语言的集合类、数据库索引、Linux 内核进程调度等场景。本文我将深入探讨红黑树的原理、结构特性、操作实现以及实际应用,结合代码示例,帮助读者全面掌握这一重要的数据结构。

一、基本概念与特性

1.1 红黑树的定义

红黑树是一种特殊的二叉搜索树,它的每个节点都被赋予了颜色属性,非红即黑。红黑树通过对节点颜色的约束以及特定的旋转和重新着色操作,来维持树的大致平衡,从而避免二叉搜索树在极端情况下退化为链表,保证操作的高效性。

1.2 红黑树的特性

红黑树必须满足以下五条特性

  1. 节点颜色属性:每个节点要么是红色,要么是黑色。

  2. 根节点属性:根节点是黑色。

  3. 叶子节点属性:每个叶子节点(NIL 节点,即空节点)是黑色。这里的叶子节点不是传统意义上的叶子节点,而是为了满足红黑树规则引入的虚拟节点。

  4. 红色节点约束:如果一个节点是红色的,那么它的两个子节点都是黑色的,即不存在连续的红色节点。

  5. 路径黑色节点数:从任意一个节点到其可达的叶子节点的所有路径上,包含相同数目的黑色节点。这个特性保证了红黑树的大致平衡,任何一条路径的长度都不会超过其他路径长度的两倍。

这些特性使得红黑树在插入和删除节点时,通过有限的旋转和颜色调整操作,就能重新恢复树的平衡状态。
0

二、红黑树的节点结构与表示

在实现红黑树时,首先需要定义节点结构。以 C++ 语言为例,红黑树的节点结构可以定义如下:

// 红黑树节点结构
struct RBNode {int key;  // 节点存储的关键字bool color;  // 节点颜色,true为红色,false为黑色RBNode* left;RBNode* right;RBNode* parent;RBNode(int k) : key(k), color(true), left(nullptr), right(nullptr), parent(nullptr) {}
};

在上述代码中,每个节点包含关键字key、颜色属性color、指向左子节点的指针left、指向右子节点的指针right以及指向父节点的指针parent。初始时,新插入的节点颜色设为红色,这是因为将新节点设为红色更有可能保持红黑树的特性,减少调整操作。

三、红黑树的基本操作

3.1 插入操作

红黑树的插入操作基于二叉搜索树的插入,在插入新节点后,需要通过重新着色和旋转操作来恢复红黑树的特性。插入操作的主要步骤如下:

  1. 执行二叉搜索树插入:按照二叉搜索树的规则,将新节点插入到合适的位置。

  2. 调整树的平衡:新节点插入后,可能会破坏红黑树的特性,需要进行调整。如果新插入节点的父节点是黑色,那么红黑树的特性依然满足,无需调整;如果父节点是红色,则需要通过重新着色和旋转操作来恢复特性。

以下是插入操作的 C++ 代码实现:

// 左旋操作
void leftRotate(RBNode*& root, RBNode* x) {RBNode* y = x->right;x->right = y->left;if (y->left != nullptr) {y->left->parent = x;}y->parent = x->parent;if (x->parent == nullptr) {root = y;} else if (x == x->parent->left) {x->parent->left = y;} else {x->parent->right = y;}y->left = x;x->parent = y;
}// 右旋操作
void rightRotate(RBNode*& root, RBNode* x) {RBNode* y = x->left;x->left = y->right;if (y->right != nullptr) {y->right->parent = x;}y->parent = x->parent;if (x->parent == nullptr) {root = y;} else if (x == x->parent->right) {x->parent->right = y;} else {x->parent->left = y;}y->right = x;x->parent = y;
}// 插入后修复红黑树特性
void insertFixup(RBNode*& root, RBNode* z) {while (z != root && z->parent->color == true) {if (z->parent == z->parent->parent->left) {RBNode* y = z->parent->parent->right;if (y != nullptr && y->color == true) {z->parent->color = false;y->color = false;z->parent->parent->color = true;z = z->parent->parent;} else {if (z == z->parent->right) {z = z->parent;leftRotate(root, z);}z->parent->color = false;z->parent->parent->color = true;rightRotate(root, z->parent->parent);}} else {RBNode* y = z->parent->parent->left;if (y != nullptr && y->color == true) {z->parent->color = false;y->color = false;z->parent->parent->color = true;z = z->parent->parent;} else {if (z == z->parent->left) {z = z->parent;rightRotate(root, z);}z->parent->color = false;z->parent->parent->color = true;leftRotate(root, z->parent->parent);}}}root->color = false;
}// 插入节点
void insert(RBNode*& root, int key) {RBNode* z = new RBNode(key);RBNode* y = nullptr;RBNode* x = root;while (x != nullptr) {y = x;if (z->key < x->key) {x = x->left;} else {x = x->right;}}z->parent = y;if (y == nullptr) {root = z;} else if (z->key < y->key) {y->left = z;} else {y->right = z;}insertFixup(root, z);
}

3.2 删除操作

红黑树的删除操作比插入操作更为复杂,同样需要在删除节点后通过重新着色和旋转操作来恢复红黑树的特性。删除操作的主要步骤如下:

  1. 执行二叉搜索树删除:按照二叉搜索树的删除规则,找到要删除的节点,并将其从树中移除。

  2. 调整树的平衡:删除节点后,可能会破坏红黑树的特性,需要进行调整。根据被删除节点及其子节点的颜色情况,通过一系列的旋转和重新着色操作来恢复特性。

以下是删除操作的 C++ 代码实现(部分关键函数):

// 找到节点x的后继节点
RBNode* minimum(RBNode* x) {while (x->left != nullptr) {x = x->left;}return x;
}// 替换节点u和v
void transplant(RBNode*& root, RBNode* u, RBNode* v) {if (u->parent == nullptr) {root = v;} else if (u == u->parent->left) {u->parent->left = v;} else {u->parent->right = v;}v->parent = u->parent;
}// 删除后修复红黑树特性
void deleteFixup(RBNode*& root, RBNode* x) {while (x != root && x->color == false) {if (x == x->parent->left) {RBNode* w = x->parent->right;if (w->color == true) {w->color = false;x->parent->color = true;leftRotate(root, x->parent);w = x->parent->right;}if (w->left->color == false && w->right->color == false) {w->color = true;x = x->parent;} else {if (w->right->color == false) {w->left->color = false;w->color = true;rightRotate(root, w);w = x->parent->right;}w->color = x->parent->color;x->parent->color = false;w->right->color = false;leftRotate(root, x->parent);x = root;}} else {// 与x是左子节点的情况对称}}x->color = false;
}// 删除节点
void deleteNode(RBNode*& root, int key) {RBNode* z = root;while (z != nullptr && z->key != key) {if (key < z->key) {z = z->left;} else {z = z->right;}}if (z == nullptr) return;RBNode* y = z;bool yOriginalColor = y->color;RBNode* x;if (z->left == nullptr) {x = z->right;transplant(root, z, z->right);} else if (z->right == nullptr) {x = z->left;transplant(root, z, z->left);} else {y = minimum(z->right);yOriginalColor = y->color;x = y->right;if (y->parent == z) {x->parent = y;} else {transplant(root, y, y->right);y->right = z->right;y->right->parent = y;}transplant(root, z, y);y->left = z->left;y->left->parent = y;y->color = z->color;}if (yOriginalColor == false) {deleteFixup(root, x);}delete z;
}

四、红黑树的应用场景

4.1 编程语言的集合类

在 Java 中,TreeMapTreeSet的底层实现就是红黑树。它们利用红黑树的特性,保证了元素的有序存储,并且在插入、删除和查找操作上都具有较好的性能,时间复杂度均为 O ( log ⁡ n ) O(\log n) O(logn),其中n是集合中元素的个数。这使得它们在需要对元素进行排序和快速查找的场景中非常适用,例如统计单词出现频率并按字母顺序输出等。

4.2 数据库索引

在数据库系统中,红黑树可以用于实现索引结构。通过将数据按照特定的关键字构建成红黑树,能够快速定位到需要查询的数据记录,提高数据的查询效率。与哈希索引相比,红黑树索引不仅支持快速的等值查询,还支持范围查询,在很多场景下具有独特的优势。

4.3 Linux 内核进程调度

在 Linux 内核的进程调度算法中,也使用了红黑树来管理进程。红黑树用于存储进程的相关信息,如进程的优先级、运行时间等。通过红黑树的高效操作,内核可以快速找到需要调度的进程,实现公平且高效的进程调度。

总结

红黑树作为一种自平衡二叉搜索树,通过严格的节点颜色约束和巧妙的旋转、重新着色操作,在保证二叉搜索树基本功能的同时,维持了树的大致平衡,确保了插入、删除、查找等操作的高效性。从节点结构的定义到插入删除操作的实现,从理论原理到实际应用场景,红黑树都展现出了强大的功能和广泛的适用性。掌握红黑树的原理和应用,对于深入理解数据结构和算法,以及解决实际编程问题都具有重要意义。在后续的学习和实践中,我们还可以进一步探索红黑树与其他数据结构、算法的结合,发挥其更大的价值。

That’s all, thanks for reading!
创作不易,点赞鼓励;
知识无价,收藏备用;
持续精彩,关注不错过!

相关文章:

一文详解红黑树

一文详解红黑树 前言一、基本概念与特性1.1 红黑树的定义1.2 红黑树的特性 二、红黑树的节点结构与表示三、红黑树的基本操作3.1 插入操作3.2 删除操作 四、红黑树的应用场景4.1 编程语言的集合类4.2 数据库索引4.3 Linux 内核进程调度 总结 前言 在数据结构的领域中&#xff…...

Windows 安装显卡驱动

1.第一步&#xff1a;打开Nvidia 官网驱动下载页面 2.第二步&#xff1a;选择相关信息&#xff0c; 玩游戏选择&#xff0c;GeForce Game Ready ,创意设计、摄影直播 选择 NVIDIA Studio 驱动程序 &#xff08;NVIDIA Studio Driver - WHQL.&#xff09; 2.第三步&#xff1…...

【C语言】易错题 经典题型

出错原因&#xff1a;之前运行起来的可执行程序没有关闭 关闭即可 平均数&#xff08;average&#xff09; 输入3个整数&#xff0c;输出它们的平均值&#xff0c;保留3位小数。 #include <stdio.h> int main() {int a, b, c;scanf("%d %d %d", &a, &…...

C++类与对象--5 运算符重载

对已有的运算符进行重新定义&#xff0c;赋予不同的功能&#xff0c;以适应不同的数据类型 5.1 加号运算符 实现两个自定义数据类型的加运算 (1)通过成员函数实现“”重载 class Number { public:Number(int a, int b):m_A(a),m_B(b){}Number(){}Number operator(Number &a…...

接口排查不能靠猜:实战中如何用抓包工具精准定位问题(含 Charles 使用示例)

几乎每个写代码的开发者都经历过这样的时刻&#xff1a;接口突然返回空、请求超时、前端数据没更新……你试过重启服务、翻查日志、改代码打印&#xff0c;最后还是无解。 我想说&#xff0c;其实很多问题的答案都藏在“网络请求”里&#xff0c;只是你没有去看。 这篇文章&a…...

【占融数科-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

4.7 时间模块

时间模块&#xff1a; * 1. time&#xff1a;操作时间本身 2.datetime&#xff1a;主要用于设置某一时间 3.calendar&#xff1a;主要用于时间份量计算 import time # 1. actimr:把一个表示时间的元组转换为字符串。要是不给出参数则返回当前本地时间。 print(time.asctime())…...

SHIMADZU岛津 R300RC300 Operation Manual

SHIMADZU岛津 R300RC300 Operation Manual...

(C语言篇)处理字符串的四个基础函数

strlen、strcpy、strcat、strcmp使用以及注意事项 在C语言中&#xff0c;strlen、strcpy、strcat、strcmp是处理字符串的四个基础函数&#xff0c;都在<string.h>头文件中声明。下面为你详细介绍它们的功能、用法和注意事项。 1. strlen - 计算字符串长度 函数原型&am…...

mysql的安装方式

1.yum/apt安装 yum安装&#xff1a; 先搭建yum仓库&#xff0c;可以在清华源内找&#xff1a;mysql | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror vim /etc/yum.repos.d/mysql.repo[mysql-connectors-community] nameMySQL Connectors Communit…...

嵌入式(C语言篇)Day11

嵌入式Day11 一、动态内存分配核心函数 &#xff08;一&#xff09;函数列表 函数名功能头文件返回值malloc分配连续的size字节堆内存stdlib.h成功返回首地址&#xff08;void*&#xff09;&#xff0c;失败返回NULLcalloc分配num个元素size字节/元素的堆内存&#xff0c;自…...

Java集合框架解析:从基础到底层源码

Java集合框架解析&#xff1a;从基础到底层源码 一、集合体系 1.1 两大核心接口深度解析 Collection 单列集合 List 系列 ArrayList&#xff1a;动态数组实现&#xff0c;初始容量10&#xff0c;扩容策略为 原容量的1.5倍// JDK17 扩容源码片段 int newCapacity oldCapacity…...

C语言实现android/linux按键模拟

C语言实现 input事件模拟 #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/input.h>int main() {int fd open("/dev/input/event0", O_RDWR);if (fd < 0) {perror("Failed to open device");ret…...

VisionPro:轴承错位标识

找出轴承缺陷并标记:效果 1.打开导入图片 2.添加CogToolblock:方便后续写代码 3.对零件进行模板匹配 4.对图片进行预处理(重点) 5.添加找圆工具和展开工具 根据下图将线链接 6.添加模板匹配工具并运行 7.训练模板 好的全找出来 8.代码编写 红色框为添加的代码(下面有完整代码) …...

专题五:floodfill算法(扫雷游戏精讲)

以leetcode529题 题目解析&#xff1a; M表示&#xff1a;未挖出的地雷 E表示&#xff1a;未挖出的空白方块 什么叫未挖出&#xff0c;就是你没玩的时候&#xff0c;棋盘是什么样的&#xff0c;就是你站在上帝视角看待棋盘 B&#xff1a;表示挖出来是空白的&#xff0c;如…...

MySQL企业版免费开启,强先体验

近期Oracle突然宣布&#xff0c;MySQL企业版面向开发者免费开放下载&#xff0c;这一消息瞬间引爆DBA圈。作为数据库领域的“顶配车型”&#xff0c;企业版长期因高昂授权费让中小团队望而却步&#xff0c;如今免费开放无异于“劳斯莱斯开进菜市场”。 本文将深度拆解企业版的…...

React Contxt详解

React Contxt详解 React 的 Context API 是用于跨组件层级传递数据的解决方案&#xff0c;尤其适合解决「prop drilling」&#xff08;多层组件手动传递 props&#xff09;的问题。以下是关于 Context 的详细解析&#xff1a; 文章目录 React Contxt详解一、Context 核心概念二…...

前端工程的相关管理 git、branch、build

环境配置 标准环境打包 测试版&#xff1a;npm run build-test 预生产&#xff1a;npm run build-preview 正式版&#xff1a;npm run build 建议本地建里一个 .env.development.local 方便和后端联调时修改配置相关信息。 和 src 同级有一下区分环境的文件&#xff1a; .env.d…...

鸿蒙 Location Kit(位置服务)

移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 Location Kit 使用多种定位技术提供服务&#xff0c;可以准确地确定设备在室外/室…...

人工智能、机器学习与深度学习:概念解析与内在联系

人工智能、机器学习与深度学习&#xff1a;概念解析与内在联系 一、人工智能&#xff08;Artificial Intelligence, AI&#xff09; &#xff08;一&#xff09;人工智能的定义 人工智能的定义随着技术发展不断演变。从广义上讲&#xff0c;人工智能是指通过计算机技术实现的…...

【Linux学习】Ubuntu对用户进行管理

目录 写在前面 【Linux学习】Ubuntu对用户进行管理一、为什么需要用户管理&#xff1f;二、用户管理基础操作&#xff08;一&#xff09;用户管理1. 用户管理命令表格2. 关键操作场景说明场景一&#xff1a;创建用户并配置权限场景二&#xff1a;修改用户属性场景三&#xff1a…...

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析&#xff0c;涵盖 一、Serial GC&#xff08;单线程串行回收器&#xff09; 二、Parallel GC&#xff08;吞吐量优先回收器&#xff09; 三、CMS&#xff08;Concurrent Mark Sweep&#xff0c;低延迟回收器&#xff09; 四、G1&…...

JUC入门(三)

7、Callable 1、可以有返回值 2、可以抛出异常 3、方法不同 run()/call() 代码测试 老版本的应用 package com.yw.callable;public class Old {public static void main(String[] args) {new Thread(new MyThread()).start();} }class MyThread implements Runnable{Overri…...

RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据

通过代码的方式同时获取SMARTP模式的VENC码流数据和普通GOP模式的VENC码流数据&#xff0c;并进行对比画质。 一.RV1126 VI采集摄像头数据并同时编码SMARTP模式和普通GOP模式的编码码流流程 RV1126利用多线程同时获取普通GOP的VENC码流数据和SMARTP的码流数据一般如上图&#…...

MySQL事务、视图、索引、备份和恢复

1. 事务 如果不使用事务&#xff0c;那么如果出现了张三账户汇款成功-500元&#xff0c;但是李四那边的服务器出现了故障没有接收到500元&#xff0c;那么就会出现张三账户里有500元但是李四那边的账户还是1元的情况&#xff0c;转账的500元被吞了。 创建事务 2. 视图 创建视图…...

yolov8训练模型优化模型【误检】

针对 YOLOv8 模型在电动车人脸检测中出现误检行人人脸的问题&#xff0c;结合最新研究与实践经验&#xff0c;以下提供多维度优化方案及具体实施步骤&#xff1a; 一、数据集优化 数据清洗与标注增强 剔除干扰样本&#xff1a;确保训练集中所有标注仅包含骑行状态的人脸&#x…...

初识MySQL · 索引

目录 前言&#xff1a; 重温磁盘 认识索引 为什么这么做&#xff0c;怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言&#xff1a; 前文我们主要是介绍了MySQL的一些基本操作&#xff0c;增删查改一类的操作都介绍了&#xff0c;并且因为大多数情况下&am…...

Kubernetes in action-配置和应用升级

Kubernetes的配置和应用升级 1、配置1.1 configMap1.2 secret1.3 Downward API1.4 Kubernetes API 2、服务升级2.1 升级方式2.1.1 先删除所有的旧版pod&#xff0c;使用新版本pod替换2.1.2 先创建新版pod&#xff0c;再删除旧版本pod2.1.3 滚动优化 2.2 使用deployment声明式升…...

十三、面向对象底层逻辑-Dubbo序列化Serialization接口

一、引言&#xff1a;分布式通信的数据桥梁 在分布式服务调用中&#xff0c;参数的跨网络传输需要将对象转化为二进制流&#xff0c;这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系&#xff0c;支持多种序列化协议的无缝切…...

5.19 打卡

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入...

MathType公式如何按照(1)(2)…编号

在word中使用mathtype插入公式&#xff0c;发现插入的公式编号默认为(1.1),(1.2)…&#xff0c;但论文中常用的公式编号是(1)(2)…&#xff0c;分享一下如何实现(1.1)→(1)。 ①word菜单找到“MathType”&#xff0c;点击“插入编号”-“格式化”。 ②取消勾选“章编号”和“节…...

解决即使安装了pageoffice网页还是无法跳转、点击按钮没有反应等问题

出现的现象&#xff1a; 安装了pageoffice网页还是无法跳转、点击按钮没有反应 网页提示的错误&#xff1a; 点击按钮之前右键检查网页发现的错误&#xff1a; 点击无效按钮之后右键检查出现的错误&#xff1a; 原因&#xff1a; 鉴于安全性的考虑&#xff0c;新版浏览器不支…...

正点原子STM32新建工程

MDK 源自德国的 KEIL 公司&#xff0c;是 RealView MDK 的简称。 MDK5 由两个部分组成&#xff1a; MDK Core 和 Software Packs。 MDK Core 又分成四个部分&#xff1a; uVision IDE with Editor&#xff08;编辑器&#xff09;&#xff0c; ARMC/C Compiler&#xff08;编译…...

计算机网络 第三章:运输层(一)

运输层位于应用层和网络层之间&#xff0c;是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务。通常特别关注因特网协议&#xff0c;即 TCP 和 UDP 运输层协议。 讨论运输层和网络层的关析&#xff0c;为研究运输层第一个关键功能&#xff…...

机器学习(14)——模型调参

文章目录 一、动态调参方法论1. 调参策略选择2. 千万数据优化原则 二、模型调参策略对比1. LightGBM调参路线2. XGBoost调参路线3. 随机森林调参策略 三、代码实现示例通用数据准备&#xff08;适用于所有模型&#xff09;1. LightGBM调参示例2. XGBoost调参示例3. 随机森林调参…...

基于PetaLinux的Zynq PS应用自启动全攻略

一、嵌入式Linux启动管理的艺术 在工业机器人、智能摄像头、边缘计算网关等场景中,开机自启动管理是系统可靠性的第一道关卡。本文将深入讲解Zynq PS端在PetaLinux环境下实现: Systemd服务深度定制启动时序精准控制启动速度优化技巧动态服务管理创新方案二、环境搭建与工程配…...

贪心算法:多处最优服务次序、删数问题

多处最优服务次序问题 问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1≤i≤n)&#xff0c;共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 算法设计:对于给定的n个顾…...

使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件

Flask 文件和文件夹下载服务实现 以下是一个基于 Flask 框架的简单 Web 服务&#xff0c;用于开放指定文件夹&#xff08;./shared_files&#xff09;&#xff0c;允许用户通过浏览器浏览和下载文件夹中的所有文件和子文件夹。ZIP 和 TAR 文件将直接下载&#xff0c;而文件夹将…...

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素&#xff08;核心三部分&#xff09;1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...

软件设计师SQL考点分析——求三连

一、考点分值占比与趋势分析 综合知识分值统计表&#xff08;75分制&#xff09; 年份考题数量分值分值占比考察重点2018334%关系代数、权限控制2019222.67%SQL注入、授权语句2020445.33%投影操作、权限回收2021334%视图操作、权限传递2022222.67%数据库安全、WITH GRANT OPT…...

使用tcs34725传感器和51单片机识别颜色

使用TCS34725颜色传感器和51单片机来识别颜色是一个非常有趣的项目。TCS34725是一种常用的RGB颜色传感器&#xff0c;能够测量红、绿、蓝光的强度&#xff0c;从而实现颜色识别。 1. 硬件连接 TCS34725传感器通过IC接口与51单片机连接。以下是连接方式&#xff1a; SDA&…...

数据库-oracle-包-视图传参

并发下可能不准确 -- 修改包规范 CREATE OR REPLACE PACKAGE sczz.p_view_param IS function set_n(n varchar2) return varchar2; function get_n return varchar2; function set_ny(ny varchar2) return varchar2; function get_ny return varchar2; …...

深入探讨Java中的上下文传递与ThreadLocal的局限性及Scoped Values的兴起

在Java开发中,特别是在依赖框架的应用程序中,上下文数据的管理是一个常见但具有挑战性的问题。上下文数据可能包括元数据、配置信息或其他需要在代码不同部分之间共享的信息。传统的做法是通过方法参数显式传递这些上下文,但这种方法会导致代码复杂、难以维护,尤其是在大型…...

Spring boot 学习笔记2

Maven 项目管理工具&#xff1a;Maven 通过 pom.xml&#xff08;Project Object Model&#xff09;文件描述项目配置&#xff0c;包括依赖、构建流程、插件等&#xff0c;实现项目标准化管理 依赖管理&#xff1a;自动下载并管理项目所需的第三方库&#xff08;如 Spring、MyB…...

“保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板

保证医疗器械信息来源合法真实、安全的保障措施、情况说明及相关证明 一、医疗器械信息来源合法、真实、安全的管理措施 目前我公司网站所展示的医疗器械是企业代理品种&#xff0c;是取得合法注册资格的产品&#xff0c;拥有合法证明文件的产品。本网站仅展示本公司行政许可…...

Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

不锈钢保温容器行业2025数据分析报告

不锈钢保温容器市场概况 2024年全球不锈钢保温容器市场规模约为453.3亿元&#xff0c;预计到2031年将增长至608.3亿元&#xff0c;年均复合增长率&#xff08;CAGR&#xff09;为4.3%。这一增长主要得益于全球范围内对保温容器需求的持续增加&#xff0c;尤其是在户外活动、餐…...

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列&#xff08;Monotonic Queue&#xff09; 解决滑动窗口最大值问题的优化算法。我来简单解释一下&#xff1a; 核心思路 问题分析&#xff1a;在滑动窗口中&#xff0c;若存在两个下标 i < j 且 nums[i] ≤ nums[j]&#xff0c;则 nums[i] 永远…...

腾讯云怎么在游戏云中助力

腾讯云游戏云&#xff1a;依托深厚游戏基因&#xff0c;打造高质量全方位生态平台 在竞争激烈的云计算市场中&#xff0c;腾讯云凭借其得天独厚的游戏生态资源和深耕多年的技术沉淀&#xff0c;正成为游戏行业不可忽视的重要力量。腾讯不仅是全球领先的游戏开发和发行商&#…...

深入理解pip:Python包管理的核心工具与实战指南

# 深入理解pip&#xff1a;Python包管理的核心工具与实战指南 在Python开发中&#xff0c;第三方库是提升效率的关键。而pip作为Python官方的包管理工具&#xff0c;承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令&#xff0c;结合实例演示用法&#…...