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

C++ 红黑树

上一节我介绍了二叉搜索树家族的AVL树,这里我们来介绍二叉搜索树家族的另一个成员,也是使用最广泛的成员。

1.AVL树与红黑树的区别

  • 平衡性质
    • AVL 树:是严格的平衡二叉树,要求任意节点的左右子树高度差的绝对值不超过 1,能保证树的高度始终保持在O(logn)级别,查询效率非常稳定。
    • 红黑树:是一种弱平衡的二叉树,通过节点颜色和一些规则来保证从根节点到叶子节点的最长路径不超过最短路径的 2 倍,虽然不能像 AVL 树那样严格控制高度,但在实际应用中也能提供较为高效的操作。
  • 插入和删除操作
    • AVL 树:插入和删除节点后,为了保持平衡,可能需要进行多次旋转操作,调整的频率相对较高,导致其插入和删除操作的时间复杂度相对不稳定。
    • 红黑树:插入和删除操作相对简单,因为它的平衡条件相对宽松,所以在插入和删除时需要进行的调整操作通常比 AVL 树少,这使得红黑树在频繁进行插入和删除操作的场景下,效率可能更高。
  • 空间复杂度
    • AVL 树:节点结构相对简单,通常只需要存储数据和左右子节点的指针,不需要额外的空间来存储颜色等信息,所以空间复杂度相对较低。
    • 红黑树:由于需要为每个节点设置颜色属性,因此每个节点需要额外的存储空间来存储颜色信息,这使得红黑树的空间复杂度相对 AVL 树略高。
  • 应用场景
    • AVL 树:适用于查询操作非常频繁,对查询效率要求极高,且数据相对稳定,插入和删除操作较少的场景,如数据库索引、编译器的符号表等。
    • 红黑树:在插入和删除操作比较频繁,同时对查询效率也有一定要求的场景中表现出色,如 STL 中的 map、set 等容器,以及 Linux 内核中的进程调度等。

2.红黑树的概念

红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。

2.1 红黑树的规则

为了完成红黑树的功能,设计者设计了以下规则来控制

1. 每个结点不是红⾊就是⿊⾊
2. 根结点是⿊⾊的
3. 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的
红⾊结点。
4. 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点

由规则4可知,从根到NULL结点的每条路径都有相同数量的⿊⾊结点,所以极端场景下,最短路径 就就是全是⿊⾊结点的路径,假设最短路径⻓度为bh(black height)。
由规则2和规则3可知,任意⼀条路径不会有连续的红⾊结点,所以极端场景下,最⻓的路径就是⼀⿊⼀红间隔组成,那么最⻓路径的⻓度为2*bh。
•  综合红⿊树的4点规则⽽⾔,理论上的全⿊最短路径和⼀⿊⼀红的最⻓路径并不是在每棵红⿊树都存在的。假设任意⼀条从根到NULL结点路径的⻓度为x,那么bh <= h <= 2*bh。

2.2红黑树的效率

假设N是红⿊树树中结点数量,h最短路径的⻓度,那么2 ^h − 1 <= N < 2^( 2∗h) − 1 , 由此推出h logN  ,也就是意味着红⿊树增删查改最坏也就是⾛最⻓路径2 ∗ logN ,那么时间复杂度还是  O( logN )。
红⿊树的表达相对AVL树要抽象⼀些,AVL树通过⾼度差直观的控制了平衡。红⿊树通过4条规则的颜 ⾊约束,间接的实现了近似平衡,他们效率都是同⼀档次,但是相对⽽⾔,插⼊相同数量的结点,红⿊树的旋转次数是更少的,因为他对平衡的控制没那么严格。

3.红黑树的实现

3.1红黑树的结构

enum Colour
{RED,BLACK
};
template<class K,class V>
struct RBTreeNode
{pair<K, V> _kv;RBTreeNode* _left;RBTreeNode* _right;RBTreeNode* _parent;Colour _col;RBTreeNode(const pair<K,V>& kv):_kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr){}
};template<class K,class V>
class RBTree
{typedef RBTreeNode<K,V> Node;
public:
private:Node* _root = nullptr;
};

3.2 红黑树的插入

3.2.1红⿊树树插⼊⼀个值的⼤概过程

1. 插⼊⼀个值按⼆叉搜索树规则进⾏插⼊,插⼊后我们只需要观察是否符合红⿊树的4条规则。
2. 如果是空树插⼊,新增结点是⿊⾊结点。如果是⾮空树插⼊,新增结点必须红⾊结点,因为⾮空树插⼊,新增⿊⾊结点就破坏了规则4,规则4是很难维护的。
3. ⾮空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是⿊⾊的,则没有违反任何规则,插⼊结束。
4. ⾮空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是红⾊的,则违反规则3。进⼀步分析,c是 红⾊,p为红,g必为⿊,这三个颜⾊都固定了,关键的变化看u的情况,需要根据u分为以下⼏种情况分别处理。

3.2.2情况1:变⾊

c为红,p为红,g为⿊,u存在且为红,则将p和u变⿊,g变红。在把g当做新的c,继续往上更新。
分析:因为p和u都是红⾊,g是⿊⾊,把p和u变⿊,左边⼦树路径各增加⼀个⿊⾊结点,g再变红,相 当于保持g所在⼦树的⿊⾊结点的数量不变,同时解决了c和p连续红⾊结点的问题,需要继续往上更新 是因为,g是红⾊,如果g的⽗亲还是红⾊,那么就还需要继续处理;如果g的⽗亲是⿊⾊,则处理结束了;如果g就是整棵树的根,再把g变回⿊⾊。
情况1只变⾊,不旋转。所以⽆论c是p的左还是右,p是g的左还是右,都是上⾯的变⾊处理⽅式。

3.2.3情况2:单旋+变⾊

c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。 分析:p必须变⿊,才能解决,连续红⾊结点的问题,u不存在或者是⿊⾊的,这⾥单纯的变⾊⽆法解决问题,需要旋转+变⾊。

3.2.4情况2:双旋+变⾊

c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则 c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。 分析:p必须变⿊,才能解决,连续红⾊结点的问题,u不存在或者是⿊⾊的,这⾥单纯的变⾊⽆法解决问题,需要旋转+变⾊。

3.3红⿊树的插⼊代码实现

#pragma onceenum Colour
{RED,BLACK
};
template<class K,class V>
struct RBTreeNode
{pair<K, V> _kv;RBTreeNode* _left;RBTreeNode* _right;RBTreeNode* _parent;Colour _col;RBTreeNode(const pair<K,V>& kv):_kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr){}
};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){parent = cur;if (cur->_kv.first > kv.first){cur = cur->_left;}else if(cur->_kv.first<kv.first){cur = cur->_right;}else{return false;}}cur = new Node(kv);cur->_parent = parent;cur->_col = RED;if (kv.first < parent->_kv.first){parent->_left = cur;}else{parent->_right = cur;}//控制颜色的平衡while (parent && parent->_col == RED){Node* grandparent = parent->_parent;Node* uncle;if (parent == grandparent->_left){uncle = grandparent->_right;}else{uncle = grandparent->_left;}//uncle存在且为红色if(uncle && uncle->_col == RED){grandparent->_col = RED;uncle->_col = BLACK;parent->_col = BLACK;cur = grandparent;}else {if (parent == grandparent->_left){if(cur == parent->_left){RotateR(grandparent);grandparent->_col = RED;parent->_col = BLACK;}else{RotateLR(grandparent);cur->_col = BLACK;grandparent->_col = RED;}break;}else{if (cur == parent->_right){RotateL(grandparent);grandparent->_col = RED;parent->_col = BLACK;}else{RotateRL(grandparent);cur->_col = BLACK;grandparent->_col = RED;}break;}}}_root->_col = BLACK;return true;}Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;}void InOrder(){_InOrder(_root);}void _InOrder(const Node* root){if (root == nullptr)return;_InOrder(root->_left);cout << root->_kv.first << ' ';_InOrder(root->_right);}void RotateRL(Node* parent){Node* parentR = parent->_right;Node* parentRL = parentR->_left;RotateR(parent->_right);RotateL(parent);}void RotateLR(Node* parent){Node* parentL = parent->_left;Node* parentLR = parentL->_right;RotateL(parent->_left);RotateR(parent);}void RotateR(Node* parent){Node* parentL = parent->_left;Node* parentLR = parentL->_right;Node* parentPa = parent->_parent;if (parentPa){if (parent == parentPa->_left)parentPa->_left = parentL;elseparentPa->_right = parentL;}if (parentLR)parentLR->_parent = parent;parent->_parent = parentL;parent->_left = parentLR;parentL->_right = parent;parentL->_parent = parentPa;}void RotateL(Node* parent){Node* parentR = parent->_right;Node* parentRL = parentR->_left;Node* parentPa = parent->_parent;if (parentPa){if (parent == parentPa->_left)parentPa->_left = parentR;elseparentPa->_right = parentR;}if (parentRL)parentRL->_parent = parent;parent->_parent = parentR;parent->_right = parentRL;parentR->_parent = parentPa;parentR->_left = parent;}private:Node* _root = nullptr;
};

 3.4红⿊树的查找

Node* Find(const K& key)
{Node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;
}

3.5红⿊树的验证

这⾥获取最⻓路径和最短路径,检查最⻓路径不超过最短路径的2倍是不可⾏的,因为就算满⾜这个条件,红⿊树也可能颜⾊不满⾜规则,当前暂时没出问题,后续继续插⼊还是会出问题的。所以我们还是去检查4点规则,满⾜这4点规则,⼀定能保证最⻓路径不超过最短路径的2倍。
1. 规则1枚举颜⾊类型,天然实现保证了颜⾊不是⿊⾊就是红⾊。
2. 规则2直接检查根即可
3. 规则3前序遍历检查,遇到红⾊结点查孩⼦不太⽅便,因为孩⼦有两个,且不⼀定存在,反过来检查⽗亲的颜⾊就⽅便多了。
4. 规则4前序遍历,遍历过程中⽤形参记录跟到当前结点的blackNum(⿊⾊结点数量),前序遍历遇到⿊⾊结点就++blackNum,⾛到空就计算出了⼀条路径的⿊⾊结点数量。再任意⼀条路径⿊⾊结点数量作为参考值,依次⽐较即可。

bool IsRBTree()
{return _IsRBTree(_root);
}
bool _IsRBTree(const Node* root)
{if (root == nullptr)return true;if (root->_col == RED)return false;Node* cur = root;int RetNum = 0;while (cur){if (cur->_col == BLACK)RetNum++;cur = cur->_left;}return Check(root, 0, RetNum);
}bool Check(const Node*& root,int BlackNum,int refNum)
{if (root == nullptr){if (BlackNum != refNum){cout << "黑色节点数不匹配" << endl;return false;}return true;}if (root->_col == RED && root->_parent->_col == BLACK){cout << "红色节点重复" << endl;return false;}if (root->_col == BLACK){BlackNum++;}return Check(root->_left, BlackNum, refNum) && Check(root->_right, BlackNum, refNum);
}

相关文章:

C++ 红黑树

上一节我介绍了二叉搜索树家族的AVL树&#xff0c;这里我们来介绍二叉搜索树家族的另一个成员&#xff0c;也是使用最广泛的成员。 1.AVL树与红黑树的区别 平衡性质 AVL 树&#xff1a;是严格的平衡二叉树&#xff0c;要求任意节点的左右子树高度差的绝对值不超过 1&#xff…...

学习海康VisionMaster之线圆测量

一&#xff1a;进一步学习了 今天学习下VisionMaster中的线圆测量&#xff1a;核心就是坐标点到直线的距离量测 1&#xff1a;什么是线圆测量&#xff1f; 工业自动化中很常见的应用尺寸测量&#xff0c;需要量测一个零件的外形尺寸&#xff0c;其中一项如果是需要测量圆心到直…...

Uniapp:置顶

目录 一、出现场景二、效果展示三、具体使用一、出现场景 在项目的开发过程中,我们经常会用到置顶的功能,比如说从页面的最下方滑动到最上面太慢了,这个时候我们就可以使用置顶功能。 二、效果展示 三、具体使用 参数名类型必填说明scrollTopNumber否滚动到页面的目标位置…...

UDP数据报和TCP流套接字编程

文章目录 UDP数据报套接字编程1.DatagramSocket类2.DatagramPacket类3. InetSocketAddress类构建服务端和客户端 TCP流套接字编程1. ServerSocket类2.Socket类构建服务端和客户端 扩展对话形式简易的字典多线程实现线程池实现 UDP数据报套接字编程 1.DatagramSocket类 Datagr…...

某建筑石料用灰岩矿自动化监测

1. 项目简介 某建材有限公司成立于2012年&#xff0c;是一家集矿山开采、石料生产及销售为一体的建筑材料生产企业&#xff0c;拥有两条年产500万吨的环保型精品骨料生产线&#xff0c;各类工程机械 30 多台套&#xff0c;运输车辆50多辆。公司坚持生态优先&#xff0c;以高质…...

C++11 的编译器支持

C11 主要功能特性一览 特性描述提案GCCClangMSVCApple ClangEDG eccpIntel CNvidia HPC C (ex PGI)*Nvidia nvccCrayEmbarcadero C BuilderIBM Open XL C for AIXIBM Open XL C for z/OSIBM XL CSun/Oracle CHP aCCDigital Mars C核心功能右值引用 (T&&)支持移动语义和…...

20250429 垂直地表发射激光测量偏转可以验证相对性原理吗

垂直地表发射激光测量偏转可以验证相对性原理吗 垂直地表发射激光测量偏转可以在一定条件下用于检验广义相对论中的等效原理和引力对光传播的影响&#xff0c;但要说直接验证整个相对性原理&#xff08;狭义广义&#xff09;是不准确的。我们可以逐步分析这个问题&#xff1a;…...

Makefile 在 ARM MCU 开发中的编译与链接参数详解与实践

内容大纲 引言 一、预处理与宏定义 头文件搜索路径:-I 宏定义:-D 二、编译器选项(CFLAGS) 架构与指令集:-mcpu、-mthumb 优化与调试:-Os、-O2、-g 警告与错误:-Wall、-Werror 代码剥离:-ffunction-sections、-fdata-sections 其他常用选项 三、链接器选项(LDFLAGS) 链…...

AimRT 从零到一:官方示例精讲 —— 四、logger示例.md

logger示例 官方仓库&#xff1a;logger 配置文件(configuration_logger.yaml​) 依据官方示例项目结构自行编写YAML配置文件&#xff1a; # 基础信息 base_info:project_name: Logger # 项目名称build_mode_tags: ["EXAMPLE", "SIMULATION", "TE…...

mybatis传递多个不同类型的参数到mapper xml文件

在业务中查询某张表时需要设置多个查询条件&#xff0c;并且还要根据id列表进行权限过滤&#xff0c;这时推荐采用Map<String, Object>作为参数进行查询&#xff0c;因为&#xff1a;Object可以设置成不同的类型&#xff0c;比如&#xff1a;List<Integer> ids&…...

信创开发中的数据库详解:国产替代背景下的技术生态与实践指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

【Linux】第十三章 访问Linux文件系统

目录 1. 存储设备是什么&#xff1f;怎么理解分区和格式化&#xff1f; 2. 文件系统是什么&#xff1f; 3. 挂载是什么&#xff1f;挂载点是什么&#xff1f; 4. 怎么理解块设备&#xff1f; 5. 在SATA附加存储中&#xff0c;第一磁盘上的第一个分区和第二磁盘的第二个分区…...

多态与虚函数

在 C 中&#xff0c;virtual 关键字用于实现多态性&#xff08;Polymorphism&#xff09;&#xff0c;这是面向对象编程&#xff08;OOPP&#xff09;的核心特性之一。多态性允许你编写通用的代码&#xff0c;该代码可以操作不同类型的对象&#xff0c;而这些对象可以有不同的内…...

Spring Boot - 配置管理与自动化配置进阶

Spring Boot 的配置管理和自动化配置是其核心特性之一&#xff0c;能够显著提升开发效率和应用灵活性。本文将深入探讨以下内容&#xff1a; 1、配置管理&#xff1a;多环境配置与优先级解析。 2、自动化配置&#xff1a;自定义 Spring Boot Starter 与 spring.factories 扩展…...

第六章 QT基础:7、Qt中多线程的使用

在进行桌面应用程序开发时&#xff0c;假设应用程序需要处理比较复杂的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。 这种情况下&#xff0c;需要使用多线程&#xff1a; 主线程处理窗口事件和控件更新子线程进…...

前端Vue3 + 后端Spring Boot,前端取消请求后端处理逻辑分析

在 Vue3 Spring Boot 的技术栈下&#xff0c;前端取消请求后&#xff0c;后端是否继续执行业务逻辑的答案仍然是 取决于请求处理的阶段 和 Spring Boot 的实现方式。以下是结合具体技术的详细分析&#xff1a; 1. 请求未到达 Spring Boot 场景&#xff1a;前端通过 AbortContr…...

ShaderToy学习笔记 05.3D旋转

1. 3D旋转 1.1. 汇制立方体 由于立方体没有旋转&#xff0c;所以正对着看过去时&#xff0c;看起来是正方形的&#xff0c;所以需要旋转一下&#xff0c;才能看到立方体的样子。 常见几何体的SDF BOX 的SDF为 float sdBox( vec3 p, vec3 b ) {vec3 q abs(p) - b;return len…...

编程日志4.24

栈的链表基础表示结构 #include<iostream> #include<stdexcept> using namespace std; //模板声明&#xff0c;表明Stack类是一个通用的模板&#xff0c;可以用于存储任何类型的元素T template<typename T> //栈的声明 //Stack类的声明&#xff0c;表示一…...

通信设备制造数字化转型中的创新模式与实践探索

在数字化浪潮下&#xff0c;通信设备制造企业积极探索创新模式&#xff0c;推动数字化转型&#xff0c;以提升竞争力和适应市场变化。 在生产模式创新方面&#xff0c;企业引入工业互联网平台&#xff0c;实现设备互联互通与生产过程智能化监控。通过在生产设备上安装传感器&a…...

同一个路由器接口eth0和ppp0什么不同?

答案摘自 百度知道&#xff0c; eth0是以太网接口&#xff0c;是表示以太网连接的物理接口&#xff0c;路由器可能会有不止一个以太网接口&#xff0c;因此可能会eth0&#xff0c;eht1之类的。 ppp0是经以太网接口PPP拨号时创建的链路接口&#xff0c;用以建PPP拨号连接的&am…...

零训练成本优化LLM: 11种LLM权重合并策略原理与MergeKit实战配置

随着大语言模型的快速发展&#xff0c;如何在不消耗大量计算资源的情况下优化模型性能成为业界关注焦点。模型权重合并技术提供了一种零训练成本的高效解决方案&#xff0c;能够智能整合多个专业微调模型的优势&#xff0c;无需额外训练即可显著提升性能表现。本文系统剖析11种…...

基于tabula对pdf中多个excel进行识别并转换成word中的优化(五)

优化地方&#xff1a;处理合并的单元格内容。 1、修改为stream"complex" 2、增加换行符f"{table_data[i - 1][j]}\n{table_data[i][j]}".strip() 一、pdf中excel样例 二、完整代码 import tabula import numpy as np from docx import Document from docx…...

QT中的网络编程

Qt中的网络编程是通过封装操作系统的API进行实现的 C标准库中&#xff0c;并没有提供网络编程的封装接口 进行网络编程时本质是在编写应用层代码&#xff0c;需要传输层提供支持 传输层最核心的协议为UDP/TCP 使用Qt网络编程的API时&#xff0c;需要在.pro文件中添加network模块…...

0.5 像素边框实现

0.5 像素边框怎么实现 文章目录 0.5 像素边框怎么实现方法 1&#xff1a;使用 transform: scale() 缩放&#xff08;推荐&#xff09;方法 2&#xff1a;直接使用 0.5px 边框&#xff08;部分浏览器支持&#xff09;方法 3&#xff1a;使用 box-shadow 模拟边框方法 4&#xff…...

【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook

文章目录 Vagrant安装vagrant安装 VirtualBox如何使用 Ansible安装AnsiblePlaybook测试创建hosts文件创建setup.yml文件 Vagrant Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动…...

“连接世界的桥梁:深入理解计算机网络应用层”

一、引言 当你浏览网页、发送邮件、聊天或观看视频时&#xff0c;这一切都离不开计算机网络中的应用层&#xff08;Application Layer&#xff09;。 应用层是网络协议栈的最顶层&#xff0c;直接为用户的各种应用程序提供服务。它为用户进程之间建立通信桥梁&#xff0c;屏蔽了…...

Vulkan与OpenGL的对比

传统图形API与现代图形API 传统图形API指的是OpenGL/DirectX11这类简单易用、驱动托管严重的图形接口&#xff1b;而现代图形API则指的是Vulkan/Metal/DirectX12这类使用复杂、暴露更多底层硬件功能来显式控制的弱驱动设计的图形接口。 现代图形API与传统图形API相比&#xff…...

海外社交App的Web3革命:去中心化社交与Token经济实战指南

一、Web3社交的核心组件&#xff1a;从身份到经济的重构 去中心化身份&#xff08;DID&#xff09;技术栈&#xff1a;Ceramic IDX协议构建链上身份图谱代码示例&#xff1a;javascript// 创建DID const ceramic new CeramicClient() const did new DID({ provider: cerami…...

凯撒密码算法的实现

在密码学里&#xff0c;凯撒密码&#xff08;也叫恺撒密码、移位密码、恺撒代码或者恺撒移位&#xff09;是一种简单且广为人知的加密技术。它属于替换密码的一种&#xff0c;在这种加密方式中&#xff0c;明文中的每个字母都会被替换成字母表中往后移动固定位数的字母。例如&a…...

Chrome的插件扩展程序安装目录是什么?在哪个文件夹?

目录 前提 直接复制到浏览器中打开 Mac下Chrome extension 安装路径 最近换了mac pro用起来虽然方便&#xff0c;但是对常用的一些使用方法还是不熟悉。这不为了找到mac上chrome插件的安装路径在哪里&#xff0c;花费了不少时间。我想应用有不少像小编一样刚刚使用mac的小白…...

C++23中的std::forward_like:完美转发的增强

文章目录 一、背景与动机&#xff08;一&#xff09;完美转发的局限性&#xff08;二&#xff09;std::forward_like的提出 二、std::forward_like的设计与实现&#xff08;一&#xff09;基本语法&#xff08;二&#xff09;实现原理&#xff08;三&#xff09;与std::forward…...

AI与软件测试的未来:如何利用智能自动化改变测试流程

用工作流生成测试用例和自动化测试脚本&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;软件测试作为软件开发生命周期中的关键环节&#xff0c;正在经历一场前所未有的变革。传统的测试方法已经无法满足现代快速迭代和持续交付的需求&#xff…...

React Native 动态切换主题

React Native 动态切换主题 创建主题配置和上下文创建主题化高阶组件主应用组件主屏幕组件&#xff08;类组件形式&#xff09; 创建主题配置和上下文 // ThemeContext.jsimport React, { Component, createContext } from react;import { Appearance, AsyncStorage } from rea…...

得物 小程序 6宫格 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 部分python代码 if result …...

PocketFlow一个最小的Agent框架

1、背景 PocketFlow 2、使用 python 的版本需要python3.10 在cookbook中有如何使用的说明&#xff0c;如图所示 在tuils.py中修改代码 def call_llm(messages):# client OpenAI(api_keyos.environ.get("OPENAI_API_KEY", "your-api-key"))client Op…...

Objective-C Block 底层原理深度解析

Objective-C Block 底层原理深度解析 1. Block 是什么&#xff1f; 1.1 Block 的本质 Block 是 Objective-C 中的特殊对象&#xff0c;实现了匿名函数的功能 通过 isa 指针继承自 NSObject&#xff0c;可以响应&#xff08;如 copy、retain、release&#xff09;等内存管理方…...

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单&#xff0c;轻松上手】 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&…...

Linux systemd 从理论到实践:现代系统管理的核心工具

文章目录 引言&#xff1a;为什么需要 systemd&#xff1f;第一部分&#xff1a;systemd 核心理论1.1 systemd 的设计哲学1.2 核心组件1.3 单元文件&#xff08;Unit File&#xff09;结构 第二部分&#xff1a;实战操作指南2.1 基础命令2.2 服务管理高级操作2.3 日志管理&…...

分享一个移动端项目模板:React-Umi4-mobile

分享一个移动端项目模板&#xff1a;React-Umi4-mobile 大家好&#xff0c;今天想和大家分享一个我最近做的移动端项目模板 React-Umi4-mobile。 模板的主要内容 这个模板主要包括&#xff1a; 基于 Umi 4 框架使用了 antd-mobile 组件库配置了 px 自动转 vw&#xff08;基…...

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…...

ElasticSearch入门

1 elasticsearch概述 1.1 elasticsearch 简介 官网: https://www.elastic.co/ ElasticSearch是一个基于 Lucene 的搜索服务器&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;开源的企业级搜索引擎。 Elastic官方宣布Elasticsearch进入Version 8…...

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…...

【网络原理】TCP异常处理(二):连接异常

目录 一. 由进程崩溃引起的连接断开 二. 由关机引起的连接断开 三. 由断电引起的连接断开 四. 由网线断开引起的连接断开 一. 由进程崩溃引起的连接断开 在一般情况下&#xff0c;进程无论是正常结束&#xff0c;还是异常崩溃&#xff0c;都会触发回收文件资源&#xff0c;…...

[stm32] 4-1 USART(1)

文章目录 前言4-1 USARTUSART简介什么是USART?USART名字的含义&#xff1f;如何使用USART&#xff1f; USART的工作原理什么是串并转换&#xff1f;为什么要进行串并转换&#xff1f;移位寄存器串并行转换电路 USART寄存器组和完整框图 前言 本笔记内容&#xff0c;为本人依据…...

C++多线程与锁机制

1. 基本多线程编程 1.1 创建线程 #include <iostream> #include <thread>void thread_function() {std::cout << "Hello from thread!\n"; }int main() {std::thread t(thread_function); // 创建并启动线程t.join(); // 等待线程结束return 0; …...

【MCP Node.js SDK 全栈进阶指南】高级篇(4):自定义传输层开发

引言 在MCP(Model Context Protocol)应用开发中,传输层是连接客户端与服务器的关键环节,直接影响应用的性能、可靠性和扩展性。默认的传输方式虽然能满足基本需求,但在复杂场景下,自定义传输层能够为应用提供更高的灵活性和优化空间。本文将深入探讨MCP TypeScript-SDK中…...

当向量数据库与云计算相遇:AI应用全面提速

如果将AI比作一台高速运转的机器引擎&#xff0c;那么数据便是它的燃料。 然而&#xff0c;存储数据的燃料库--传统数据库&#xff0c;在AI时代的效率瓶颈愈发明显&#xff0c;已经无法满足AI对于数据的全新需求。 因此&#xff0c;向量数据库近年来迅速崛起。向量数据库通过…...

【2024-NIPS-版权】Evaluating Copyright Takedown Methods for Language Models

1.背景 目前 LLMs 在训练过程中使用了大量的受版权保护数据&#xff0c;这些数据会导致大模型记忆并生成与训练数据相似的内容&#xff0c;从而引发版权问题。随着版权所有者对模型训练和部署中的版权问题提起诉讼&#xff08;例如 Tremblay v. OpenAI, Inc. 和 Kadrey v. Met…...

【PyTorch动态计算图原理精讲】从入门到灵活应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:基础计算图构建案例2:条件分支动态图案例3:循环结构动态图运行结果验证三、性能对比测试方…...

阿里巴巴Qwen3发布:登顶全球开源模型之巅,混合推理模式重新定义AI效率

今天凌晨&#xff0c;阿里巴巴正式开源了新一代通义千问大模型Qwen3&#xff0c;这一举措不仅标志着国产大模型技术的又一里程碑&#xff0c;更以“混合推理”“极致性能”“超低成本”三大核心优势&#xff0c;刷新了全球开源模型的竞争格局。Qwen3在多项评测中超越DeepSeek-R…...