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

红黑树——如何靠控制色彩实现平衡的?

目录

引言

一、认识红黑树(RBTree)

二、为什么有了AVL树,还要红黑树?

1、AVL树 vs 红黑树,两棵树区别

2、如何选择?

三、红黑树的核心操作

3.1、红黑树结构定义

3.2、插入操作

四、红黑树的验证

五、完整代码


引言

什么是红黑树呢?

红黑树和AVL树一样也是一种平衡搜索树,只不过红黑树控制平衡的方式不一样,是一种近似平衡。 下面会详解他是如何维持平衡的。


一、认识红黑树(RBTree)

红黑树在节点的的定义上新加了个颜色属性,分别是RedBlack,这也是它为什么叫红黑树的原因了。通过节点之间颜色等的限制,来保证任意节点路径的节点个数不超过最短路径的两倍。所以它是近似平衡的。

保证平衡的核心性质:

  1. 每个节点的颜色不是红色就是黑色
  2. 根节点颜色一定是黑的
  3. 任何路径没有连续的红节点
  4. 每条路径上黑色节点的数量相等
  5. 所有叶子(NIL)节点都是黑色的

红黑树示例图:

为什么满足以上性质,就能保证红黑树的最长路径不超过最短路径的两倍呢?

注意性质3、4的条件下:

最短路径:一定是连续的黑色节点

最长路径:一定是红黑节点交替出现。类似下面这种样子:

所以在不破坏红黑树性质的情况下,红黑树的最长路径一定不超过最短路径的两倍。


二、为什么有了AVL树,还要红黑树?

1、AVL树 vs 红黑树,两棵树区别

AVL树特点:

  1. 是一颗严格平衡的二叉搜索树(左右子树高度差不超过1)
  2. 但是为了维护平衡因子,插入/删除可能需要多次旋转,效率O(logN)
  3. 查找效率嘎嘎快

红黑树特点:

  1. 是一颗近似平衡的二叉搜素树(最长路径 <= 2*最短路径)
  2. 树不平衡时,可以通过变色O(1)+旋转解决,插入/删除的旋转次数少
  3. 查找效率比AVL树慢点

插入效率分析:
假设向AVL树和红黑树分别插入1000个值,两棵树的高度分别是多少呢?

AVL:h \approx log(1000) \approx 10

红黑树:因为最长路径小于最短路径的2倍,所以 h \leq 2*log(1000) \approx 20

假设向AVL树和红黑树分别插入10亿个值,两棵树的高度分别是多少呢?

AVL:h \approx log(1000000000) \approx 30

红黑树:h \leq 2*log(1000000000) \approx 60

综上所述:

对于CPU而言跑10次/20次、30次/60次差别不大,说明这两颗树的性能是同一量级的。但是AVL树为了严格控制平衡是付出代价的,插入和删除需要大量的旋转。所以,红黑树也是很优秀的,也比AVL树好控制点。C++里的map/set也是用红黑树设计的。

2、如何选择?

  • 若查询次数 > 插入/删除次数(如字典)———  AVL树
  • 若插入/删除频繁(如游戏中的实时排行榜)——— 红黑树
  • 不确定时:默认选红黑树,它在综合场景下表现更稳健。

三、红黑树的核心操作

3.1、红黑树结构定义

enum Color
{RED,BLACK
};template<class K,class V>
struct RBTreeNode
{pair<K, V> _kv; // 节点的值,存储键值对RBTreeNode<K, V>* _parent; // 指向父节点RBTreeNode<K, V>* _left; // 指向左孩子RBTreeNode<K, V>* _right; // 指向右孩子Color _col; // 节点的颜色RBTreeNode(const pair<K, V>& kv):_kv(kv),_parent(nullptr),_left(nullptr),_right(nullptr),_col(RED){}
};//红黑树实现
template<class K,class V>
class RBTree
{typedef RBTreeNode<K, V> Node;
public:// ......private:Node* _root = nullptr;
};

3.2、插入操作

先分析一下,当我们要插入一个节点时,节点的颜色设置成红色还是黑色?

答案红色。在考虑性质3和性质4时,插入的颜色是红色的话,不会影响其他路径,只会影响当前路径。但如果插入节点颜色是黑色的话,性质4被破坏了,并且会影响其它路径。

插入情况分析:
由上图可知:只有当我们插入节点颜色为红色且父节点也为红色时,整棵树才违反红黑树规则需要调整来维持平衡。这里直接分析具体情况,其他情况类似分析即可:

情况1:cur为红,parent为红,grandfather为黑,uncle存在且为红

情况2: cur为红,parent为红,grandfather为黑,uncle不存在

在向上面那样处理的话,违反每条路径上黑色节点的数量相等

情况3: cur为红,parent为红,grandfather为黑,uncle存在且为黑

总结:

红黑树插入关键看uncle节点

  1. uncle存在且为红,变色+向上更新
  2. uncle不存在/uncle存在且为黑,旋转+变色

具体是左单旋,右单旋还是双旋看情况分析

代码示例:
 

bool insert(const pair<K, V>& kv)
{//这里按二叉搜索树规则找合适位置插入就行,主要看平衡操作// ......//控制红黑树平衡while (parent && parent->_col == RED){Node* grandfather = parent->_parent;if (parent == grandfather->_left){Node* uncle = grandfather->_right;if (uncle && uncle->_col == RED){//变色grandfather->_col = RED;parent->_col = uncle->_col = BLACK;//继续向上处理cur = grandfather;parent = cur->_parent;}else //uncle不存在 或 uncle == BLACK{if (parent->_left == cur){//      g//   p//cRotateR(grandfather);//变色parent->_col = BLACK;grandfather->_col = RED;}else {//      g//   p//      cRotateL(parent);RotateR(grandfather);//变色cur->_col = BLACK;grandfather->_col = RED;}//break;}}else // grandfather->right == parent{Node* uncle = grandfather->_left;if (uncle && uncle->_col == RED){//变色grandfather->_col = RED;parent->_col = uncle->_col = BLACK;//继续向上处理cur = grandfather;parent = cur->_parent;}else //uncle为空 或 uncle == BLACK{if (cur == parent->_right){// g//   p//     cRotateL(grandfather);//变色grandfather->_col = RED;parent->_col = BLACK;}else // cur == parent->left{// g//   p// cRotateR(parent);RotateL(grandfather);//变色grandfather->_col = RED;cur->_col = BLACK; }//break;}}}_root->_col = BLACK;return true;
}

四、红黑树的验证

红黑树的检测分为两步:

1. 检测其是否满足二叉搜索树(中序遍历是否为有序序列)

2. 检测其是否满足红黑树的性质

// 检查红黑树性质的核心递归函数
// root: 当前检查的节点
// blacknum: 当前路径已累积的黑色节点数(按值传递保持路径独立)
// benchmark: 基准黑高(从根到最左叶子的黑色节点数)
bool CheckColor(Node* root, int blacknum, int benchmark) 
{// 递归终止条件:到达叶子节点(NIL)if (root == nullptr) {// 检查当前路径黑高是否等于基准值if (benchmark != blacknum) {return false; // 黑高不一致,违反性质5}return true; // 当前路径合法}// 性质2:根节点为黑已在入口函数检查,此处无需处理// 统计黑色节点数量if (root->_col == BLACK) {++blacknum; // 遇到黑色节点,累计计数}// 性质4:检查连续红色节点if (root->_col == RED && root->_parent && root->_parent->_col == RED) {cout << root->_kv.first << "出现连续红色节点" << endl; // 输出违规位置return false; // 父子节点均为红,违反性质4}// 递归检查左右子树(注意blacknum是值传递,左右子树计数独立)return CheckColor(root->_left, blacknum, benchmark) && CheckColor(root->_right, blacknum, benchmark);
}// 外部调用的平衡性检查接口
bool IsBalance() 
{return IsBalance(_root); // 从根节点开始检查
}// 内部实现的平衡性检查入口
bool IsBalance(Node* root) 
{if (root == nullptr) {return true; // 空树视为平衡}// 根节点必须为黑if (root->_col != BLACK) {return false; // 根节点为红直接失败}// 计算基准黑高(从根到最左叶子路径的黑色节点数)int benchmark = 0;Node* cur = root;while (cur) {if (cur->_col == BLACK) {++benchmark; // 统计黑色节点}cur = cur->_left; // 沿左子树深入}// 从根节点开始递归检查所有路径,初始黑高计数为0return CheckColor(root, 0, benchmark);
}

五、完整代码

template<class K,class V>
class RBTree
{typedef RBTreeNode<K, V> Node;
public:bool insert(const pair<K, V>& kv){if (_root == nullptr){_root = new Node(kv);_root->_col = BLACK;return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_kv.first > kv.first){parent = cur;cur = cur->_left;}else if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}else{return false;}}cur = new Node(kv);cur->_col = RED;if (parent->_kv.first > kv.first){parent->_left = cur;}else{parent->_right = cur;}cur->_parent = parent;//控制红黑树平衡while (parent && parent->_col == RED){Node* grandfather = parent->_parent;if (parent == grandfather->_left){Node* uncle = grandfather->_right;if (uncle && uncle->_col == RED){//变色grandfather->_col = RED;parent->_col = uncle->_col = BLACK;//继续向上处理cur = grandfather;parent = cur->_parent;}else //uncle不存在 或 uncle == BLACK{if (parent->_left == cur){//      g//   p//cRotateR(grandfather);//变色parent->_col = BLACK;grandfather->_col = RED;}else {//      g//   p//      cRotateL(parent);RotateR(grandfather);//变色cur->_col = BLACK;grandfather->_col = RED;}//break;}}else // grandfather->right == parent{Node* uncle = grandfather->_left;if (uncle && uncle->_col == RED){//变色grandfather->_col = RED;parent->_col = uncle->_col = BLACK;//继续向上处理cur = grandfather;parent = cur->_parent;}else //uncle为空 或 uncle == BLACK{if (cur == parent->_right){// g//   p//     cRotateL(grandfather);//变色grandfather->_col = RED;parent->_col = BLACK;}else // cur == parent->left{// g//   p// cRotateR(parent);RotateL(grandfather);//变色grandfather->_col = RED;cur->_col = BLACK; }//break;}}}_root->_col = BLACK;return true;}void RotateR(Node* parent){Node* cur = parent->_left;Node* curright = cur->_right;parent->_left = curright;if (curright){curright->_parent = parent;}Node* ppnode = parent->_parent;parent->_parent = cur;cur->_right = parent;if (_root == parent){_root = cur;cur->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = cur;cur->_parent = ppnode;}else{ppnode->_right = cur;cur->_parent = ppnode;}}}void RotateL(Node* parent){Node* cur = parent->_right;Node* curleft = cur->_left;parent->_right = curleft;if (curleft){curleft->_parent = parent;}Node* ppnode = parent->_parent;cur->_left = parent;parent->_parent = cur;if (_root == parent){_root = cur;cur->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = cur;cur->_parent = ppnode;}else{ppnode->_right = cur;cur->_parent = ppnode;}}}private:Node* _root = nullptr;
};

相关文章:

红黑树——如何靠控制色彩实现平衡的?

目录 引言 一、认识红黑树&#xff08;RBTree&#xff09; 二、为什么有了AVL树&#xff0c;还要红黑树&#xff1f; 1、AVL树 vs 红黑树&#xff0c;两棵树区别 2、如何选择&#xff1f; 三、红黑树的核心操作 3.1、红黑树结构定义 3.2、插入操作 四、红黑树的验证 …...

金仓数据库KingbaseES技术实践类深度剖析与实战指南

一、语法兼容及迁移实战 &#xff08;一&#xff09;语法兼容的多元魅力 在当今多元化的数据库应用环境中&#xff0c;金仓数据库管理系统KingbaseES凭借其卓越的语法兼容能力脱颖而出。它采用的融合数据库架构&#xff0c;通过多语法体系一体化架构&#xff0c;实现了对Orac…...

Estimands与Intercurrent Events:临床试验与统计学核心框架

1. Estimands(估计目标)概述 1.1 定义与作用 1.1.1 定义 Estimand是临床试验中需明确提出的科学问题,即研究者希望通过数据估计的“目标量”,定义“治疗效应”具体含义,确保分析结果与临床问题一致。 例如,在研究某种新药对高血压患者降压效果时,Estimand可定义为“在…...

测试基础笔记第十二天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、python基础1.认识python2.python环境搭建1.安装Python解释器2.安装PyCharm 3.基础语法1.注释2.变量3.标识符4.数据类型 4.程序的输入和输出1.程序的输入2.程序的…...

0. Selenium工具的安装

目录 前言一、安装Chrome浏览器与驱动1 安装2. 解压驱动包并将其放到Python目录中 二、安装Selenium0 前置条件&#xff1a;已经安装了Python1. 安装2.检查是否安装成功3. 测试用例 前言 提示&#xff1a;本篇介绍selenium工具的安装和使用 一、安装Chrome浏览器与驱动 1 安…...

MySQL元数据库完全指南:探秘数据背后的数据

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

嵌入式鸿蒙系统环境搭建与配置要求实现01

各位开发者大家好,今天主要给大家分享一下,鸿蒙系统的环境配置实现。 第一:鸿蒙配置基本要求 对电脑的要求,虚拟机配置建议 200GB 硬盘大小,10GB 内存,4*2CPU。 安装必要的依赖文件方法: sudo apt-get update && sudo apt-get install binutils git git-lfs g…...

【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)

Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning&#xff1f; 在传统的强化学习 (Reinforcement Learning, RL) 中&#xff0c;奖励函数是已知的&#xff0c;智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…...

Coding Practice,48天强训(23)

Topic 1&#xff1a;打怪&#xff08;回合数与刀数、先后手关系&#xff09; 登录—专业IT笔试面试备考平台_牛客网 #include <bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--) {int h, a, H, A;cin >> h >> a >> H…...

策略模式(Strategy Pattern)详解

文章目录 1. 什么是策略模式&#xff1f;2. 为什么需要策略模式&#xff1f;3. 策略模式的核心概念3.1 策略&#xff08;Strategy&#xff09;3.2 具体策略&#xff08;Concrete Strategy&#xff09;3.3 上下文&#xff08;Context&#xff09; 4. 策略模式的结构5. 策略模式的…...

websheet 之 table表格

本控件只实现table的基础功能。 {.is-danger} 一、table基本使用 可以通过addTable函数动态增加table&#xff0c;代码如下&#xff1a; let tableColumn [];let col 1;tableColumn.push(测试 (col) 列);tableColumn.push(测试 (col) 列);tableColumn.push(测试 (col) …...

Python Cookbook-6.9 快速复制对象

任务 为了使用 copy.copy&#xff0c;需要实现特殊方法__copy__。而且你的类的__init__比较耗时所以你希望能够绕过它并获得一个“空的”未初始化的类实例。 解决方案 下面的解决方案可同时适用于新风格和经典类: def empty_copy(obj):class Empty(obj.__class__):def __in…...

Linux NIO 原理深度解析:从内核到应用的高性能 I/O 之道

Linux 的 ​非阻塞 I/O&#xff08;Non-blocking I/O&#xff0c;NIO&#xff09;​​ 是构建高性能服务器的核心技术&#xff0c;其核心思想是通过 ​事件驱动模型​ 和 ​零拷贝技术​ 实现高并发、低延迟的网络通信。以下从底层机制到实际应用进行全面剖析。 一、Linux I/O …...

Redis 集群切片全解析:四种常见技术的原理、优劣与应用

Redis 集群切片是将数据分散存储在多个 Redis 节点上的技术&#xff0c;以提高系统的可扩展性和性能。以下是一些常见的 Redis 集群切片方式&#xff1a; 1.哈希切片 原理&#xff1a;通过对数据的键进行哈希运算&#xff0c;将哈希值映射到不同的切片&#xff08;槽&#xf…...

html中margin的用法

在 HTML 页面布局中&#xff0c;margin 是 CSS 中用于设置 元素与元素之间的外边距&#xff08;即元素外部的空白区域&#xff09; 的属性。 它可以单独设置四个方向的边距&#xff1a;上&#xff08;top&#xff09;、右&#xff08;right&#xff09;、下&#xff08;bottom…...

网络流量分析 | 流量分析基础

流量分析是网络安全领域的一个子领域&#xff0c;其主要重点是调查网络数据&#xff0c;以发现问题和异常情况。本文将涵盖网络安全和流量分析的基础知识。 网络安全与网络中的数据 网络安全的两个最关键概念就是&#xff1a;认证&#xff08;Authentication&#xff09;和授…...

语音合成之六端到端TTS模型的演进

端到端TTS模型的演进 引言Tacotron&#xff1a;奠基之作FastSpeech&#xff1a;解决效率瓶颈VITS&#xff1a;实现高保真和富有表现力的语音SparkTTS&#xff1a;利用LLM实现高效可控的TTSCosyvoice&#xff1a;一种可扩展的多语种TTS方法端到端TTS模型的演进与未来方向 引言 …...

文件的读取操作

#import time # 导入time 库 # 打开文件 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8")# 读取文件 print(f"读取文件的所有内容内容:{file.read()}\n") #\n是换行字符 print(f"读取10个字节的文件内容:{file.re…...

【Linux学习笔记】进程的fork创建 exit终止 wait等待

【Linux学习笔记】进程的fork创建 exit终止 wait等待 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】进程的fork创建 exit终止 wait等待前言1.进程创建1.1 fork函数初识1.2fork函数返回值1.3写时拷…...

一种专用车辆智能配电模块的设计解析:技术革新与未来展望

关键词&#xff1a;智能配电模块、STM32、CAN总线、电子开关、新能源汽车 引言&#xff1a;传统配电系统的痛点与智能化转型 传统配电系统依赖继电器和保险丝&#xff0c;存在体积大、寿命短、智能化低等缺陷&#xff08;如图1&#xff09;。而新能源汽车和无人驾驶技术对配电…...

第TR5周:Transformer实战:文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.准备工作 1.1.加载数据 import torch import torch.nn as nn import torchvision import os,PIL,warnings import pandas as pd warnings.filterwarnings…...

Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用

目录 一、背景与重要性‌二、CSS选择器基础与分类‌2.1 什么是选择器&#xff1f;‌2.2 选择器分类与语法‌ 三、核心选择器详解与实战案例‌3.1 基础选择器&#xff1a;精准定位元素‌3.2 组合选择器&#xff1a;元素关系控制‌3.3 伪类与伪元素&#xff1a;动态与虚拟元素‌3…...

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者&#xff1a; Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位&#xff1a; 1 ^{1} 1乔治梅森大学计算机科学系&#xff0c; 2 ^{2} 2美国陆军研究实验室&…...

ROS 快速入门教程04

12.激光雷达工作原理 激光雷达的作用是探照周围障碍物的距离&#xff0c;按照测量维度可以分为单线雷达和多线雷达。 按照测量原理可以分为三角测距雷达和TOF雷达。按照工作方式可以分为固态雷达和机械旋转雷达。 本次讲解以TOF雷达为例&#xff0c;雷达发射器发射激光遇到障碍…...

Node.js 开发项目

初始化 npm init## npm install 编辑packege.json 添加&#xff0c;以支持ES6的语法 "type": "module" 连接mysql示例 import db from ./db/ops_mysql.jsconst createTable async () > {const insert_data CREATE TABLE IF NOT EXISTS users (…...

Linux系统下的常用网络命令

1.ping命令 作用&#xff1a;用来检测网络的连通情况和分析网络速度&#xff1b;根据域名得到服务器IP&#xff1b;根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 参数&#xff1a;-c 数字&#xff1a;设定ping命令发出的消息包数量&#xff0c;如无…...

【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?

一、IGBT 是什么&#xff1f;重新认识这个 “低调的电力心脏” 你可能没听过 IGBT&#xff0c;但一定用过它驱动的设备&#xff1a;家里的变频空调、路上的电动汽车、屋顶的光伏逆变器&#xff0c;甚至高铁和电网的核心部件里&#xff0c;都藏着这个 “电力电子开关的瑞士军刀”…...

C++23 新特性深度落地与最佳实践

一、引言 C 作为一门历史悠久且广泛应用的编程语言&#xff0c;一直在不断发展和演进。C23 作为 C 标准的一个重要版本&#xff0c;引入了许多令人期待的新特性&#xff0c;这些特性不仅提升了代码的可读性、可维护性&#xff0c;还增强了程序的性能和安全性。本文将深入探讨 …...

26考研 | 王道 | 数据结构笔记博客总结

26考研 | 王道 | 数据结构笔记博客总结 笔者博客网站 分类: 数据结构 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第一章 数据结构绪论 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第二章 线性表 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第三章 栈和队列 |…...

Bolsig+超详细使用教程

文章目录 Bolsig介绍Bolsig的使用 Bolsig介绍 BOLSIG 是一款用于求解弱电离气体中电子玻尔兹曼方程的免费计算程序&#xff0c;适用于均匀电场条件下的群体实验、气体放电及碰撞型低温等离子体研究。在此类环境中&#xff0c;电子分布函数呈现非麦克斯韦特性&#xff0c;其形态…...

基于线性LDA算法对鸢尾花数据集进行分类

基于线性LDA算法对鸢尾花数据集进行分类 1、效果 2、流程 1、加载数据集 2、划分训练集、测试集 3、创建模型 4、训练模型 5、使用LDA算法 6、画图3、示例代码 # 基于线性LDA算法对鸢尾花数据集进行分类# 基于线性LDA算法对鸢尾花数据集进行分类 import numpy as np import …...

C#高级语法--接口

先引用一些通俗一点的话语说明 1. 接口就像“插座标准”(解耦) 🧩 场景: 你家的手机充电器(USB-C、Lightning)必须插进匹配的插座才能充电。问题:如果每个手机品牌插座都不一样,你换手机就得换充电器,太麻烦了!💡 接口的作用: 定义一个通用的充电口标准(比如U…...

软测面经(私)

测试流程 分析需求——>制定测试计划——>设计测试用例——>执行测试——>编写测试报告 黑盒测试 等价类划分、边界值分析法、猜错法、随机数法、因果图。 白盒测试 代码检查法、程序变异、静态结构分析法、静态质量度量法、符号测试法、逻辑覆盖法、域测试、…...

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…...

数据结构初阶:排序

概述&#xff1a;本篇博客主要介绍关于排序的算法。 目录 1.排序概念及应用 1.1 概念 1.2 运用 1.3 常见的排序算法 2. 实现常见排序算法 2.1 插入排序 2.1.1 直接插入排序 2.1.2 希尔排序 2.2 选择排序 2.2.1 直接选择排序 2.2.2 堆排序 2.3 交换排序 2.3.1 冒泡排序…...

openwrt查询网关的命令

方法一&#xff1a;route -n 方法二&#xff1a;ip route show...

优化非线性复杂系统的参数

非线性项组合的系统 对于系统中的每一个复杂拟合&#xff0c;即每一个残差函数&#xff0c;都能表示为非线性方程的趋势&#xff0c;例如较为复杂的系统函数组&#xff0c; from optimtool.base import sp, np x sp.symbols("x1:5") res1 0.5*x[0] 0.2*x[1] 1.…...

【QQMusic项目界面开发复习笔记】第二章

&#x1f339; 作者: 云小逸 &#x1f91f; 个人主页: 云小逸的主页 &#x1f91f; motto: 要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前&#xff0c;其次就是现在&…...

并发编程【深度解剖】

并发介绍 谈到并发&#xff0c;随之而来的就是那几个问题。并发 并行 线程 进程 注意&#xff01;&#xff01;&#xff01;本篇文章更多用诙谐的语调讲解&#xff0c;为保证易于理解&#xff0c;不够官方正式&#xff0c;所以可以结合AI读本篇文章&#xff0c;并且本文是以 g…...

前端如何连接tcp 服务,接收数据

在传统的浏览器前端环境中&#xff0c;由于浏览器的同源策略和安全限制&#xff0c;无法直接建立 TCP 连接。不过&#xff0c;可以通过 WebSocket 或者使用 WebRTC 来间接实现与 TCP 服务的通信&#xff0c;另外在 Node.js 环境中可以直接使用 net 模块建立 TCP 连接。下面分别…...

用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。

一、思路概要和知识回顾 1.思路概要 ①中缀表达式计算&#xff1a; 需要处理运算符的优先级&#xff0c;可能需要用到栈结构。 ❗❗如何将中缀表达式转换为后缀表达式&#xff1f;或者直接计算&#xff1f; 通常&#xff0c;中缀转后缀&#xff08;逆波兰式&#xff09;再…...

使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战

前言 在数据处理与分析的实际场景中&#xff0c;我们经常需要整合不同格式的数据&#xff0c;例如 Excel 表格、JSON 配置文件、HTML 报表等。本文以一个具体任务&#xff08;蓝桥杯模拟练习题&#xff09;为例&#xff0c;详细讲解如何使用 Python 的 Pandas 库结合其他工具&…...

常见游戏引擎介绍与对比

Unreal Engine (UE4/UE5) 主语言&#xff1a;C Unreal Engine 主要使用 C 作为开发语言。C 提供了高性能的底层控制&#xff0c;适用于需要精细调优的 AAA 级游戏。C 在 Unreal 中用于开发核心游戏逻辑、物理引擎等性能要求较高的部分。 脚本语言&#xff1a;蓝图&#xff08;B…...

第十一天 主菜单/设置界面 过场动画(Timeline) 成就系统(Steam/本地) 多语言支持

前言 对于刚接触Unity的新手开发者来说&#xff0c;构建完整的游戏系统往往充满挑战。本文将手把手教你实现游戏开发中最常见的四大核心系统&#xff1a;主菜单界面、过场动画、成就系统和多语言支持。每个模块都将结合完整代码示例&#xff0c;使用Unity 2022 LTS版本进行演示…...

vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包

场景&#xff1a; 之前写过一篇 vite vue2 的配置&#xff0c;但是现在项目使用 vue3 较多&#xff0c;再更新一下 vue脚手架初始化之后的项目&#xff0c;每个项目都是独立的&#xff0c;导致项目多了之后&#xff0c;node依赖包过多&#xff0c;占用内存较多。想实现的效果…...

k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)

一、部署思路 1、前期设想 zookeeper集群至少需要运行3个pod集群才能够正常运行&#xff0c;考虑到节点会有故障的风险这个3个pod最好分别运行在&#xff13;个不同的节点上(为了实现这一需要用到亲和性和反亲和性概念)&#xff0c;在部署的时候对zookeeper运行的pod打标签加…...

Linux操作系统复习

Linux操作系统复习 一. Linux的权限和shell原理1. Linux从广义上讲是什么 从狭义上讲是什么&#xff1f;2. shell是什么&#xff1f;3. 为什么要设置一个shell外壳而不是直接和linux 内核沟通4. shell的原理是什么5. Linux中权限的概念6. 如何提升当前操作的权限7. 文件访问者的…...

深入解析 Linux 中动静态库的加载机制:从原理到实践

引言 在 Linux 开发中&#xff0c;动静态库是代码复用的核心工具。静态库&#xff08;.a&#xff09;和动态库&#xff08;.so&#xff09;的加载方式差异显著&#xff0c;直接影响程序的性能、灵活性和维护性。本文将深入剖析两者的加载机制&#xff0c;结合实例演示和底层原…...

总账主数据——Part 2 科目-1

本文主要介绍在S4 HANA OP中 总账主数据的后台配置及前台操作。 目录 1. 准备 1.1 科目表的定义(OB13) 1.2 给公司代码分配科目表(OB62) 1.3 定义科目组(OBD4) 1.4 定义留存收益科目(OB53) 1.5 维护科目表层“文本标识” (OBT6) 1.6 维护公司代码层“文本标识” (OBT…...

借助内核逻辑锁pagecache到内存

一、背景 内存管理是一个永恒的主题&#xff0c;尤其在内存紧张触发内存回收的时候。系统在通过磁盘获取磁盘上的文件的内容时&#xff0c;若不开启O_DIRECT方式进行读写&#xff0c;磁盘上的任何东西都会被缓存到系统里&#xff0c;我们称之为page cache。可以想象&#xff0…...