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

搜索树——AVL、红黑树、B树、B+树

目录

二叉搜索树

AVL树

2-3-4树

红黑树

旋转操作

概念讲解

旋转节点操作(左旋)

插入节点

删除节点

B树和B+树

B树

2.5.2 B+树


https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

难度高,如果想要了解红黑树的增加、删除节点操作,一定要穷举画图理解!!!

二叉搜索树

一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链。

BST存在的问题是,树在插入的时候会导致倾斜,不同的插入顺序会导致数的高度不一样,而树的高度直接影响了树的查找效率。最坏的情况所有的节点都在一条斜线上,这样树的高度为N。基于BST存在的问题,平衡查找二叉树(Balanced BST)产生了。平衡树的插入和删除的时候,会通过旋转操作将高度保持在LogN。其中两款具有代表性的平衡术分别为AVL树(高度平衡树,具备二叉搜索树的全部特性,而且左右子树高度差不超过1)和红黑树

AVL树

它的核心目标是通过动态调整树的结构,保持高度平衡,从而确保查找、插入和删除操作的时间复杂度始终为O(log n),避免普通二叉搜索树在极端情况下退化成链表的低效问题。

但是AVL树要求太过严格,左旋和右旋的开销会比较大,这时出现了红黑树,只要求黑色节点平衡即可。

2-3-4树

2-3-4树是四阶的 B树(Balance Tree),他属于一种多路查找树,它的结构有以下限制:所有叶子节点都拥有相同的深度。节点只能是 2-节点、3-节点、4-节点之一。

  • 2-节点:包含 1 个元素的节点,有 2 个子节点;

  • 3-节点:包含 2 个元素的节点,有 3 个子节点;

  • 4-节点:包含 3 个元素的节点,有 4 个子节点;

所有节点必须至少包含1个元素元素始终保持排序顺序,整体上保持二叉查找树的性质,即父结点大于左子结点,小于右子结点;而且结点有多个元素时,每个元素必须大于它左边的和它的左子树中元素。

生成2-3-4树简图

红黑树

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:

  1. 每个节点要么是黑色,要么是红色。

  2. 根节点是黑色。

  3. 每个叶子节点(NIL)是黑色。

  4. 每个红色结点的两个子结点一定都是黑色。

  5. 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色

操作描述
左旋以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点, 右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
右旋以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点, 左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
变色结点的颜色由红变黑或由黑变红。

旋转操作

概念讲解

左旋:以某个节点作为旋转点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。

右旋:以某!个节点作为旋转点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变。

旋转节点操作(左旋)

 
private void leftRotate(RBNode p){if(p != null){RBNode r = p.right;// 1.设置 pr-rl 要变为 p-rl// 把rl设置到p的右子节点p.right = r.left;if(r.left != null){// 设置rl的父节点为pr.left.parent = p;}// 2.判断p的父节点情况r.parent = p.parent; // 不管 p是否有父节点,都把这个父节点设置为 r的父节点if(p.parent == null){root = r; // p没有父节点 则r为root节点}else if(p.parent.left == p){p.parent.left = r; // 如果p为 p.parent的左子节点 则 r 也为 p.parent的左子节点}else{p.parent.right = r; // 反之设置 r 为 p.parent的右子节点}// 最后 设置 p 为 r 的左子节点r.left = p;p.parent = r;}}

/*** 围绕p右旋* @param p*/public void rightRotate(RBNode p){if(p != null){RBNode r = p.left;p.left = r.right;if(r.right != null){r.right.parent = p;}r.parent = p.parent;if(p.parent == null){root = r;}else if(p.parent.left == p){p.parent.left = r;}else{p.parent.right = r;}r.right = p;p.parent = r;}}

插入节点

/*** 新增节点* @param key* @param value*/public void put(K key , V value){RBNode t = this.root;if(t == null){// 说明之前没有元素,现在插入的元素是第一个root = new RBNode<>(key , value == null ? key : value,null);return ;}int cmp ;// 寻找插入位置// 定义一个双亲指针RBNode parent;if(key == null){throw new NullPointerException();}// 沿着跟节点找插入位置do{parent = t;cmp = key.compareTo((K)t.key);if(cmp < 0){// 左侧找t = t.left;}else if(cmp > 0){// 右侧找t = t.right;}else{// 插入节点的值==比较的节点。值替换t.setValue(value==null?key:value);return;}}while (t != null);// 找到了插入的位置  parent指向 t 的父节点  t为null// 创建要插入的节点RBNode<K, Object> e = new RBNode<>(key, value == null ? key : value, parent);// 然后判断要插入的位置 是 parent的 左侧还是右侧if(cmp < 0){parent.left = e;}else{parent.right = e;}// 调整  变色 旋转fixAfterPut(e);}


private boolean colorOf(RBNode node){return node == null ? BLACK:node.color;}private RBNode parentOf(RBNode node){return node != null ? node.parent:null;}private RBNode leftOf(RBNode node){return node != null ? node.left:null;}private RBNode rightOf(RBNode node){return node != null ? node.right:null;}private void setColor(RBNode node ,boolean color){if(node != null){node.setColor(color);}}/*** 插入节点后的调整处理* 1. 2-3-4树 新增元素 2节点添加一个元素将变为3节点 直接合并,节点中有两个元素*      红黑树:新增一个红色节点,这个红色节点会添加在黑色节点下(2节点) --- 这种情况不需要调整* 2. 2-3-4树 新增元素 3节点添加一个元素变为4节点合并 节点中有3个元素*      这里有6中情况,( 根左左 根左右  根右右 根右左)这四种要调整  (左中右的两种)不需要调整*      红黑树:新增红色节点 会添加到 上黑下红的节点中 = 排序后中间节点是黑色,两边节点是红色**  3. 2-3-4树:新增一个元素 4节点添加一个元素需要裂变:中间元素升级为父节点,新增元素与剩下的其中一个合并*      红黑树:新增节点是红色+爷爷节点是黑色,父亲节点和叔叔节点为红色 调整为*              爷爷节点变红色,父亲和叔叔节点变为黑色,如果爷爷节点为root节点则调整为黑色* @param x*/private void fixAfterPut(RBNode<K, Object> x) {x.color = RED;// 本质上就是父节点是黑色的就不需要调整,对应的 2 3的情况while(x != null && x != root && x.parent.color == RED){// 1. x 的父节点是爷爷的 左孩子if(parentOf(x) == parentOf(parentOf(x)).left){// 获取当前节点的叔叔节点RBNode y = rightOf(parentOf(parentOf(x)));// 情况3if(colorOf(y) == RED){// 说明是 上3的情况  变色处理// 父亲节点和叔叔节点设置为黑色setColor(parentOf(x),BLACK);setColor(y,BLACK);// 爷爷节点设置为 红色setColor(parentOf(parentOf(x)),RED);// 递归处理x = parentOf(parentOf(x));}else{// 情况 2if(x == parentOf(x).right){// 如果x是父节点的右节点那么我们需要先根据 父节点 左旋x = parentOf(x);leftRotate(x);}// 叔叔节点为空  对应于 上面的情况2// 将父节点变为黑色setColor(parentOf(x),BLACK);// 将爷爷节点变为红色setColor(parentOf(parentOf(x)),RED);// 右旋转  根据爷爷节点右旋转rightRotate(parentOf(parentOf(x)));}}else{// x 的父节点是爷爷是右孩子// 获取父亲的叔叔节点RBNode y = leftOf(parentOf(parentOf(x)));if(colorOf(y) == RED){// 情况3setColor(parentOf(x),BLACK);setColor(y,BLACK);setColor(parentOf(parentOf(x)),RED);x = parentOf(parentOf(x));}else{// 情况2if( x == parentOf(x).left){x = parentOf(x);rightRotate(x);}setColor(parentOf(x),BLACK);setColor(parentOf(parentOf(x)),RED);leftRotate(parentOf(parentOf(x)));}}}root.color = BLACK;}

删除节点

红黑树删除操作的本质其实就是删除2-3-4树的叶子节点

private RBNode getNode(K key){RBNode node = this.root;while (node != null ){int cmp = key.compareTo((K) node.key);if(cmp < 0){// 在左子树node = node.left;}else if(cmp >0){// 右子树node = node.right;}else{return node;}}return null;}
 

/*** 删除节点* @param key* @return*/public V remove(K key){// 先找到这个节点RBNode node = getNode(key);if(node == null){return null;}// 把值存起来 删除后 返回V oldValue = (V) node.value;deleteNode(node);return oldValue;}/*** 删除节点*   3种情况* 1.删除叶子节点,直接删除* 2.删除的节点有一个子节点,那么用子节点来替代* 3.如果删除的节点右两个子节点,此时需要找到前驱节点或者后继节点来替代*    可以转换为 1、2的情况* @param node*/private void deleteNode(RBNode node){// 3.node节点有两个子节点if(node.left !=null && node.right != null){// 找到要删除节点的后继节点RBNode successor = successor(node);// 然后用后继节点的信息覆盖掉 要删除节点的信息node.key = successor.key;node.value = successor.value;// 然后我们要删除的节点就变为了 后继节点node = successor;}// 2.删除有一个子节点的情况RBNode replacement = node.left != null ? node.left : node.right;if(replacement != null){// 替代者的父指针指向原来 node 的父节点replacement.parent = node.parent;if(node.parent == null){// 说明 node 是root节点root = replacement;}else if(node == node.parent.left){// 双向绑定node.parent.left = replacement;}else{node.parent.right = replacement;}// 将node的左右孩子指针和父指针都指向null node等待GCnode.left = node.right = node.parent = null;// 替换完成后需要调整平衡if(node.color == BLACK){// fixAfterRemove(replacement)}}else if(node.parent == null){// 说明要删除的是root节点root = null;}else{// 1. node节点是叶子节点 replacement为null// 先调整if(node.color == BLACK){// fixAfterRemove(node)}// 再删除if(node.parent != null){if(node == node.parent.left){node.parent.left = null;}else{node.parent.right = null;}node = null;}}}

B树和B+树

B树

(Balanced Tree)这个就是我们的多路平衡查找树,叫做B-Tree(B代表平衡)。跟AVL树一样,B树在枝节点和叶子节点存储键值、数据地址、节点引用。它有一个特点:分叉数(路数)永远比关键字数多1。比如我们画的这棵树,每个节点存储两个关键字,那么就会有三个指针指向三个子节点。

B Tree的查找规则是什么样的呢?比如我们要在这张表里面查找15。因为15小于17,走左边。因为15大于12,走右边。在磁盘块7里面就找到了15,只用了3次IO。

这个是不是比AVL 树效率更高呢?那B Tree又是怎么实现一个节点存储多个关键字,还保持平衡的呢?跟AVL树有什么区别?比如Max Degree(路数)是3的时候,我们插入数据1、2、3,在插入3的时候,本来应该在第一个磁盘块,但是如果一个节点有三个关键字的时候,意味着有4个指针,子节点会变成4路,所以这个时候必须进行分裂(其实就是B+Tree)。把中间的数据2提上去,把1和3变成2的子节点。如果删除节点,会有相反的合并的操作。注意这里是分裂和合并,跟AVL树的左旋和右旋是不一样的。我们继续插入4和5,B Tree又会出现分裂和合并的操作。

从这个里面我们也能看到,在更新索引的时候会有大量的索引的结构的调整,所以解释了为什么我们不要在频繁更新的列上建索引,或者为什么不要更新主键。节点的分裂和合并,其实就是InnoDB页(page)的分裂和合并。

相比AVL树,B树的树高更低,尤其适用于​​磁盘存储场景​​。由于B树每个节点可存储多个关键字(如Max Degree=3时,每个节点最多存2个关键字),能显著减少IO次数,提升大规模数据查询效率。

2.5.2 B+树

加强版多路平衡查找树因为B Tree的这种特性非常适合用于做索引的数据结构,所以很多文件系统和数据库的索引都是基于B Tree的。但是实际上,MySQL里面使用的是B Tree的改良版本,叫做B+Tree(加强版多路平衡查找树)。

B+树的存储结构:

MySQL中的B+Tree有几个特点:

  1. 它的关键字的数量是跟路数相等的;

  2. B+Tree的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。InnoDB 中 B+ 树深度一般为 1-3 层,它就能满足千万级的数据存储。搜索到关键字不会直接返回,会到最后一层的叶子节点。比如我们搜索id=28,虽然在第一层直接命中了,但是全部的数据在叶子节点上面,所以还要继续往下搜索,一直到叶子节点。

  3. B+Tree的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。

总结, B+Tree的特点带来的优势:

  1. 它是B Tree的变种,B Tree能解决的问题,它都能解决。B Tree解决的两大问题是什么?(每个节点存储更多关键字;路数更多)

  2. 扫库、扫表能力更强(如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵B+Tree拿到所有的数据)

  3. B+Tree的磁盘读写能力相对于B Tree来说更强(根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多)

  4. 排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)

  5. 效率更加稳定(B+Tree永远是在叶子节点拿到数据,所以IO次数是稳定的)

相关文章:

搜索树——AVL、红黑树、B树、B+树

目录 二叉搜索树 AVL树 2-3-4树 红黑树 旋转操作 概念讲解 旋转节点操作&#xff08;左旋&#xff09; 插入节点 删除节点 B树和B树 B树 2.5.2 B树 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 难度高&#xff0c;如果想要了解红黑树的增加、…...

2007-2019年各省地方财政交通运输支出数据

2007-2019年各省地方财政交通运输支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政交通运输支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政交通运输支出是指地方…...

LeetCode算法题(Go语言实现)_29

题目 给你一个链表的头节点 head 。删除 链表的 中间节点 &#xff0c;并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点&#xff08;下标从 0 开始&#xff09;&#xff0c;其中 ⌊x⌋ 表示小于或等于 x 的最大整数。 对于 n 1、2…...

MINIQMT学习课程Day6

学习安装qmt 安装好后&#xff0c;点击启动国金qmt系统 之后将xtquant包手动安装到python中的site_package中&#xff0c;之后使用pycharm打开文件&#xff0c;创建本地命令文件。 具体的xtquant安装包以及qmt模拟环境&#xff0c;以及模拟账号密码&#xff0c;可以加我私信沟…...

WinForm真入门(7)——Button控件详解

WinForm Button 控件详解 Button&#xff08;按钮&#xff09;是 WinForm 中最基础的交互控件&#xff0c;用于触发操作&#xff08;如&#xff1a;点击登录按钮进入系统&#xff09;或提交数据&#xff08;如&#xff1a;写好请假申请后&#xff0c;点击提交&#xff0c;把申…...

035-Windows抓屏-GDI

Windows抓屏-GDI 一、技术原理 GDI&#xff08;Graphics Device Interface&#xff09;抓屏基于Windows系统提供的图形设备接口&#xff0c;通过设备上下文&#xff08;DC&#xff09; 实现屏幕内容捕获。核心流程如下&#xff1a; 获取桌面窗口句柄&#xff1a;通过 //获取…...

复古优雅感涂鸦手绘喷漆街头艺术字体 Enter Sonic Graffiti

Enter Sonic Graffiti 是 Rvq Typefoundry 的新字体&#xff0c;具有优雅感的字符集。要创建漂亮的组合&#xff0c;只需混合大写和小写&#xff0c;然后与其他字符形混合即可。新的 Graffiti 字体样式和 .我将这款字体献给我正在与癌症作斗争的母亲。我希望我的母亲和所有受癌…...

4.4 代码随想录第三十五天打卡

121. 买卖股票的最佳时机 (1)题目描述: &#xff0c; (2)解题思路: class Solution { public:int maxProfit(vector<int>& prices) {int len prices.size();if (len 0) return 0;vector<vector<int>> dp(len, vector<int>(2));dp[0][0] - pr…...

PyTorch 深度学习实战(34):神经架构搜索(NAS)实战

在上一篇文章中&#xff0c;我们探讨了联邦学习与隐私保护技术。本文将深入介绍神经架构搜索&#xff08;Neural Architecture Search, NAS&#xff09;这一自动化机器学习方法&#xff0c;它能够自动设计高性能的神经网络架构。我们将使用PyTorch实现基于梯度优化的DARTS方法&…...

【python】速通笔记

Python学习路径 - 从零基础到入门 环境搭建 安装Python Windows: 从官网下载安装包 https://www.python.org/downloads/Mac/Linux: 通常已预装&#xff0c;可通过终端输入python3 --version检查 配置开发环境 推荐使用VS Code或PyCharm作为代码编辑器安装Python扩展插件创建第…...

简易Minecraft python

废话多说 以下是一个基于Python和ModernGL的简化版3D沙盒游戏框架。由于代码长度限制&#xff0c;这里提供一个核心实现&#xff08;约500行&#xff09;&#xff0c;您可以通过添加更多功能和内容来扩展它&#xff1a; python import pygame import moderngl import numpy a…...

Linux信号处理解析:从入门到实战

Linux信号处理全解析&#xff1a;从入门到实战 一、初识Linux信号&#xff1a;系统级的"紧急电话" 信号是什么&#xff1f; 信号是Linux系统中进程间通信的"紧急通知"&#xff0c;如同现实中的交通信号灯。当用户按下CtrlC&#xff08;产生SIGINT信号&…...

2025-04-04 Unity 网络基础5——TCP分包与黏包

文章目录 1 分包与黏包2 解决方案2.1 数据接口2.2 定义消息2.3 NetManager2.4 分包、黏包处理 3 测试3.1 服务端3.2 客户端3.3 直接发送3.4 黏包发送3.5 分包发送3.6 分包、黏包发送3.7 其他 1 分包与黏包 ​ 分包、黏包指在网络通信中由于各种因素&#xff08;网络环境、API …...

Ubuntu 安装 JMeter:为你的服务器配置做好准备

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 要下载 Java&#xff0c;请遵…...

swift-oc和swift block和代理

一、闭包或block 1.1、swift 闭包表达式作为参数的形式 一、闭包的定义 func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) { print(fn(v1, v2)) } 二、调用 exec(v1: 10, v2: 20, fn: { (v1: Int, v2: Int) -> Int in return v1 v2 }) 1.2、swift 闭包表达式作为…...

【数据结构】_队列

hello 友友们~ 今天我们要开始学习队列啦~ 话不多说&#xff0c;让我们开始吧&#xff01;GO! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。 队列具有先进先出FIFO(First In First Out) 入队列&#x…...

【软考中级软件设计师】数据表示:原码、反码、补码、移码、浮点数

数据表示 一、数据表示1、整数的表示(1) 原码(2) 反码(3) 补码&#xff1a;(4) 移码 2、浮点数的表示&#xff08;IEEE 754标准&#xff09; 一、数据表示 计算机使用的是二进制&#xff0c;也就是0和1的组合。所有的数据&#xff0c;无论是数字、文字还是图片、声音&#xff…...

Linux(十二)信号

今天我们就要来一起学习信号啦&#xff01;&#xff01;&#xff01;还记得小编在之前的文章中说过的ctrlc吗&#xff1f;之前小编没有详细介绍过&#xff0c;现在我们就要来学习啦&#xff01;&#xff01;&#xff01; 一、信号的基本介绍 首先&#xff0c;小编带领大家先一…...

迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)

原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1&#xff1a;奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候&#xff0c;她决定坐飞机去更温暖的地方去度假。不幸的是&#xf…...

【数据结构】树的介绍

目录 一、树1.1什么是树&#xff1f;1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页&#xff0c;点击这里~ 数据结构专栏&#xff0c;点击这里~ 一、树 1.1什么是树&#xff1…...

【CF】Day24——Codeforces Round 994 (Div. 2) D

D. Shift Esc 题目&#xff1a; 思路&#xff1a; 典DP的变种 如果这一题没有这个变换操作&#xff0c;那么是一个很典型的二维dp&#xff0c;每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换&#xff0c;那我们就要考虑变换操作&#xff0c;首先一个显然…...

Python 字典

Python 字典 字典的介绍 字典不仅可以保存值&#xff0c;还能对值进行描述使用大括号来表示一个字典&#xff0c;不仅有值 value &#xff0c;还有值的描述 key字典里的数据都是以键值对 key-value 的形式来保留的key 和 value 之间用冒号 : 来连接多个键值对之间用逗号 , 来…...

yolov12检测 聚类轨迹运动速度

目录 分割算法api版: 分割算法: yolo_kmean.py 优化版: 第1步,检测生成json 第2步骤聚类: 分割算法api版: import json import os from glob import globimport cv2 import imageio import numpy as np from scipy.ndimage import gaussian_filter1d from scipy.s…...

【Lua】pcall使用详解

目录 基本语法核心作用基础示例示例 1&#xff1a;捕获一个简单错误示例 2&#xff1a;调用不存在的函数 高级用法1. 传递多个参数和接收多个返回值2. 捕获带 error 主动抛出的错误3. 匿名函数与 pcall 使用场景注意事项总结 在 Lua 中&#xff0c;pcall&#xff08;Protected …...

Floyd 算法 Java

图论算法实践&#xff1a;使用 Floyd 求任意两点最短路&#xff08;Java 实现&#xff09; 在图论算法中&#xff0c;Floyd-Warshall 算法是一个经典的动态规划算法&#xff0c;用于在一个加权图中寻找所有点对之间的最短路径。 场景描述 假设我们有一个包含 n 个点的无向图&…...

List结构之非实时榜单实战

像京东、淘宝等电商系统一般都会有热销的商品榜单&#xff0c;比如热销手机榜单&#xff0c;热销电脑榜单&#xff0c;这些都是非实时的榜单。为什么是非实时的呢&#xff1f;因为完全实时的计算和排序对于资源消耗较大&#xff0c;尤其是当涉及大量交易数据时。 一般来说&…...

OCR的备份与恢复

1.简介 在Oracle RAC环境中&#xff0c;ASM&#xff08;Automatic Storage Management&#xff09;管理的OCR&#xff08;Oracle Cluster Registry&#xff09;是集群的关键组件&#xff0c;存储集群配置和状态信息。 OCR的备份一般指物理备份&#xff0c;系统默认每4个小时自…...

算法思想之双指针(一)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之双指针(一) 发布时间&#xff1a;2025.4.4 隶属专栏&#xff1a;算法 目录 双指针算法介绍对撞指针&#xff1a;快慢指针&#xff1a; 例题移动零题目链接题目描述算法思路代码实现 复写零题目链接题目描…...

Pascal语言的设备管理

Pascal语言的设备管理 引言 在计算机科学中&#xff0c;设备管理是操作系统的重要组成部分之一。设备管理指的是操作系统对外部设备的控制和协调&#xff0c;实现对各种设备的有效利用。Pascal语言作为一种教育性编程语言&#xff0c;虽然最初并不是为了直接进行设备管理而设…...

【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记

DML (数据操作语言) 学习笔记 1. 数据表结构 首先创建员工表 employee&#xff1a; CREATE TABLE employee (id int unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) NOT NULL COMMENT 用户名,password varchar(32) DEFAULT 123456 COMMENT 密码,name va…...

React编程高级主题:背压(Backpressure)处理

文章目录 **5.1 背压&#xff08;Backpressure&#xff09;概述****5.1.1 缓冲&#xff08;Buffer&#xff09;****1. 基本概念****2. 缓冲的实现方式****3. 适用场景****4. 潜在问题** **5.1.2 丢弃&#xff08;Drop&#xff09;****1. 基本概念****2. 丢弃的实现方式****3. 适…...

Spring IoCDI

IoC容器 前⾯我们提到IoC控制反转&#xff0c; 就是将对象的控制权交给Spring的IOC容器 &#xff0c;由IOC容器创建及管理对 象。 也就是bean的存储. 在类上⾯添加 RestController 和 Controller 注解, 就是把这个对象交给Spring管理 , Spring 框架启动时就会加载该类. 把对象…...

COBOL语言的数据库交互

COBOL语言的数据库交互 引言 随着信息技术的不断发展&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中&#xff0c;COBOL&#xff08;Common Business-Oriented Language&#xff09;以其在商业应用中的稳…...

【C++11(中)】—— 我与C++的不解之缘(三十一)

一、可变参数模版 基本语法&#xff1a; C11支持可变参数模版&#xff0c;简单来说就是支持可变数量参数的函数模版或者类模版&#xff1b; 可变数目的参数被称为参数包&#xff0c;存在两种参数包&#xff1a;模版参数包(表示0个或者多个模版参数)&#xff0c;函数参数包(表示…...

JavaScript学习19-事件类型之鼠标事件

1. 2. 3....

文件或目录损坏且无法读取:数据恢复的实战指南

在数字化时代&#xff0c;数据的重要性不言而喻。然而&#xff0c;在日常使用电脑、移动硬盘、U盘等存储设备时&#xff0c;我们难免会遇到“文件或目录损坏且无法读取”的提示。这一提示如同晴天霹雳&#xff0c;让无数用户心急如焚&#xff0c;尤其是当这些文件中存储着重要的…...

python爬虫:小程序逆向实战教程

根据我之前发表的文章&#xff0c;我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我们进行搜索 2. 找到我们vx小程序的文件地址&#xff0c;我们就可以进行破解 破解步骤强看…...

第二十节课:python实例五:身体质量指数BMI计算

python实例五&#xff1a;身体质量指数BMI计算 一、问题分析 BMI计算公式&#xff1a; BMI 体重(kg) / 身高(m)^2国际与国内标准对比 分类国际标准国内标准偏瘦<18.5<18.5正常18.5-2518.5-24偏胖25-3024-28肥胖≥30≥28 二、实现要点 输入处理 # 同时接收身高体重…...

八、重学C++—动态多态(运行期)

上一章节&#xff1a; 七、重学C—静态多态&#xff08;编译期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146999362?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp/dynamicPolymorphic.cpp CuiQingCheng/cppstudy - 码云 - 开源中…...

思维链 Chain-of-Thought(COT)

思维链 Chain-of-Thought&#xff08;COT&#xff09;&#xff1a;思维链的启蒙 3. 思维链 Chain-of-Thought&#xff08;COT&#xff09;存在问题&#xff1f;2. 思维链 Chain-of-Thought&#xff08;COT&#xff09;是思路是什么&#xff1f;1. 什么是 思维链 Chain-of-Thoug…...

React框架的Fiber架构

以下是关于 Fiber 架构 的系统梳理: 一、Fiber 架构的出现背景 React 15 及之前的问题 同步递归渲染:虚拟DOM的diff过程不可中断,导致主线程长时间阻塞。掉帧问题:复杂组件树渲染时,用户交互无法及时响应。无法实现增量渲染:无法拆分任务优先级,无法利用浏览器空闲时间。…...

PCI与PCIe接口的通信架构是主从模式吗?

PCI&#xff08;Peripheral Component Interconnect&#xff09;总线在通信架构上本质是主从模式&#xff0c;但其具体实现和角色分配在不同版本&#xff08;如传统PCI与PCI Express&#xff09;中存在差异。以下是详细分析&#xff1a; 传统PCI总线的主从模式 (1) 基本架构 主…...

【2011】【论文笔记】THz保护文化遗产——

前言 类型 太赫兹 + 文化保护 太赫兹 + 文化保护 太赫兹+文化保护 期刊 I E E E T R A N S A C T I O N S O N T E R A H E R...

状态机思想编程练习

状态机实现LED流水灯 本次实验&#xff0c;我们将利用状态机的思想来进行Verilog编程实现一个LED流水灯&#xff0c;并通过Modelsim来进行模拟仿真&#xff0c;再到DE2-115开发板上进行验证。 ​ 首先进行主要代码的编写。 module led (input sys_clk,input sys_…...

三部门新政力推智能家居 居然智家数智化转型迎利好东风

2025年3月&#xff0c;工业和信息化部、教育部、市场监管总局联合印发《轻工业数字化转型实施方案》&#xff0c;明确提出重点培育智能家居、智能穿戴、智能骑行、智慧养老等消费端场景&#xff0c;深化人工智能技术在家电、家具等领域的应用&#xff0c;推动产业链供应链智能化…...

CCF GESP C++编程 七级认证真题 2025年3月

C 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B A B C B B B A D D A C B B D 一、单选题 第 1 题 下列哪个选项是C中的关键字&#xff1f; A. function B. class C. method D. object 第 2 题 下面代码输出的是&#xff08;&#xff09; int main()…...

【MySQL】navicat16 result字段识别不了

在mysql里面使用result字段 打印出来为空 之后换了个字段命名 使用outcome 成功能打印出来了。。 不知道是不是版本的问题...

【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框

背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…...

CExercise_05_1函数_1.1素数(要对键盘录入的数据做参数校验)

题目&#xff1a; 编写函数实现以下功能&#xff1a; 键盘录入一个正整数&#xff0c;请判断它是否是一个素数&#xff0c;然后控制台输出对应的结果。要对键盘录入的数据做参数校验&#xff0c;素数是一个大于1的自然数&#xff0c;它仅能被1和自身整除。 关键点 分析&#xf…...

运算放大器(五)电压比较器

比较器在最常用的简单集成电路中排名第二&#xff0c;仅次于排名第一的运算放大器。 电压比较器是一种用来比较输入信号电压与参考电压大小&#xff0c;并将比较结果以高电平或低电平形式输出的一种信号处理电路&#xff0c;广泛应用于各种非正弦波的产生和变换电路中&#xf…...