C++进阶--红黑树的实现
文章目录
- 红黑树的实现
- 红黑树的概念
- 红黑树的规则
- 红黑树的效率
- 红黑树的实现
- 红黑树的结构
- 红黑树的插入
- 变色+单旋(变色)+双旋(变色)
- 红黑树的查找
- 红黑树的验证
- 总结:
- 结语
很高兴和大家见面,给生活加点impetus!!开启今天的变成之路!!
今天我们来学习红黑树,重点了解是如何进行旋转的,即红黑树的插入接口
作者:٩( ‘ω’ )و260
我的专栏:C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!
红黑树的实现
红黑树的概念
红黑树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜⾊,可以是红色或者黑色。通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保没有⼀条路径会比其他路径长出2倍,因而是接近平衡的
红黑树的规则
红黑树的规则主要是有四点:
每个结点不是红色就是黑色
根结点一定是黑色的
如果一个结点是红色的,那么他的孩子结点必须是黑色的,即一条路径上不会有连续的红结点
对于红黑树任意一个路径上,黑结点的个数是相同的
下面我们来看几个红黑树:
这几个二叉搜索树都是满足这四个规律的,这时,就为红黑树。
细节说明:第四点:每一条路径,这个路径并非到达叶子结点,即一条路径只要能够到达nullptr的话,这就算作是一条路径了
来看下图:
这个点稍不注意其实就会看错的,为了避免这种情况,在《算法导论》中提出了⼀条每个叶子结点(NIL)都是黑色的规则。这里的叶子结点并非叶子结点,而是空结点。NIL的存在是为了标明每一条路径,来看下图:
这里再来提问一个问题,红黑树是如何保证最长路径不超过最短路径的二倍的?
由规则4可知,从根到NULL结点的每条路径都有相同数量的黑色结点,所以极端场景下,最短路径就就是全是黑色结点的路径,假设最短路径长度为bh(black height)
由规则2和规则3可知,任意⼀条路径不会有连续的红色结点,所以极端场景下,最长的路径就是一黑一红间隔组成,那么最长路径的长度为2bh
综合红黑树的4点规则而言,理论上的全黑最短路径和一黑一红的最长路径并不是在每棵红黑树都存在的。假设任意⼀条从根到NULL结点路径的长度为x,那么bh<=h<=2bh。
综上:只要我们满足了红黑树的四点规则,就能够满足最长路径不超过最短路径的二倍
红黑树的效率
我们假设红黑树的结点个数为N,h为最短路径的长度那么2 h- 1 < = N < 22h -1。因为红黑树具备二叉搜索树的性质,也就是意味着红黑树增删查改最坏也就是走最长路径2*logN,所以红黑树的时间复杂度为O(logN)
红黑树与AVL树的区别:红黑树是通过结点颜色近似平衡,AVL树是通过高度差严格控制平衡。AVL的旋转次数肯定是多于红黑树的,而红黑树的高度肯定是多于AVL树。
解释:为什么这里h的最短路径长度算出来是这个呢?
当我们是最短路径的时候,我们假设这个为完全二叉树,当为最长路径的时候,也同理,这样就能够使用二叉树方面的知识了(即二叉树高度与结点个数的关系:N=2h -1)
来看下图:
红黑树的实现
首先红黑树是具备二叉搜索树的性质的,而且与AVL树的差别就是控制树的平衡的方式不同,所以在代码部分与AVL树的部分代码类似:
红黑树的结构
我们来定义红黑树的结构:
enum Colour{RED,BLACK
};
template<class K,class V>
struct RBTreeNode{//红黑树结点结构pair<K,V> _kv;RBTreeNode<K,v> _left;RBTreeNode<K,v> _right;RBTreeNode<K,v> _parent;//主要是旋转的时候需要使用parent指针Colour _col;RBTreeNode(const pair<K,V>& kv):_left(nullptr),_right(nullptr),_parent(nullptr),_col(RED),_kv(kv){}
tmplate<class K,class V>
class RBTree{//红黑树结构
public:typedef RBTreeNode<K,V> Node;
private:Node* _root=nullptr;
};
}
细节:为什么我们要将结点颜色初始化为红色?
当我们插入一个值,肯定是需要将这个值转换成一个结点,插入结点,如果插入一个黑色结点,就会影响红黑树的其他所有的分支,因为必须保证红黑树中每一条路径的黑色结点数量相同。所以为了不保证影响其他路径,插入的结点我们选择为红色!!
红黑树的插入
红黑树的插入的大致过程:
1:插入⼀个值按二叉搜索树规则进行插入,插入后我们只需要观察是否符合红黑树的4条规则
2:如果是空树插入,新增结点是黑色结点。如果是非空树插⼊,新增结点必须红色结点,因为非空树插⼊,新增黑色结点就破坏了规则4,规则4是很难维护的
3:非空树插⼊后,新增结点必须红色结点,如果父亲结点是黑色的,则没有违反任何规则,插入结束,因为此时并没有违反这四条规则
4:非空树插⼊后,新增结点必须红色结点,如果⽗亲结点是红色的,则违反规则3
此时我们应该怎么办呢?
主要分为一下几种方法来处理违法规则三的情况。
变色+单旋(变色)+双旋(变色)
我们再来分一下类别,其实标题的这三种方法还可以分类:
具体的处理方法要看uncle的情况:
uncle有三种情况:
1:存在且为红
2:存在且为黑
3:不存在
而2,3点可以归为一类,1归为一类具体来看下面的图示:
1:叔叔存在且为红
下图中假设我们把新增结点标识为c(cur),c的父亲标识为p(parent),p的父亲标识为g(grandfather),p的兄弟标识为u(uncle)。
当叔叔(uncle)存在且为红的时候,我们直接将p和u变黑,g变红,此时仍然满足红黑树的性质。
那么cur和parent分不分插入的位置呢?其实是不分的,即这种情况cur在左还是在右,parent在左还是在右,处理方法都是相同的。
来看下图:
下面这四种情况使用这一种方法都是可以解决的。
一种情况是叔叔存在且为红
c为红,p为红,g为黑,u存在且为红,则将p和u变黑,g变红。在把g当做新的c,继续往上更新。直到我们更新到根结点的位置。
只变色,不旋转。所以无论c是p的左还是右,p是g的左还是右,都是上面的变色处理方式。
分析:因为p和u都是红色,g是黑色,把p和u变黑,左右子树路径各增加⼀个黑色结点,g再变红,相当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题,需要继续往上更新是因为,g是红色,如果g的父亲还是红色,那么就还需要继续处理;如果g的父亲是黑色,则处理结束了;如果g就是整棵树的根,再把g变回黑色。因为一棵树的根结点必须是黑色。
这里我们来画出抽象展开图:
2:叔叔不存在或者说是叔叔存在且为黑
先来看图示:
我们先来总结一下:当叔叔存在且为黑或者叔叔不存在时,此时需要旋转,旋转就分为单旋或双旋:如果此时高的一遍呈现直线(单旋),如果高的一遍呈现曲线(双旋),即一种是左边高的左边高,一般是左边高的右边高(一种是一个方向一高到底,一种是两边都出现)
c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增结点,u存在且为黑,则c⼀定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。
p必须变黑,才能解决,连续红色结点的问题,u不存在或者是黑色的,这里单纯的变色无法解决问题,需要旋转+变色
如果p是g的左,c是p的左,那么以g为旋转点进行右单旋,再把p变黑,g变红即可。p变成课这颗树新的根,这样⼦树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为p的父亲是黑色还是红⾊或者空都不违反规则
反之:
如果p是g的右,c是p的右,那么以g为旋转点进行左单旋,再把p变黑,g变红即可。p变成课这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为p的父亲是黑色还是红色或者空都不违反规则
注意:这里我们都是一边高,接下来我们来看双旋的情形:
如果p是g的左,c是p的右,那么先以p为旋转点进行左单旋,再以g为旋转点进行右单旋,再把c变黑,g变红即可。c变成课这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为c的父亲是黑色还是红是或者空都不违反规则。
反之:
如果p是g的右,c是p的左,那么先以p为旋转点进行右单旋,再以g为旋转点进行左单旋,再把c变黑,g变红即可。c变成课这颗树新的根,这样⼦树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为c的⽗亲是黑色还是红色或者空都不违反规则
总结:如果是第一种情况(叔叔存在且为红),是需要继续向上更新的,但是第二种情况,可以直接结束循环,因为只要旋转之后,我们新的根一定是黑色的。
接下来我们来进行代码实现:
bool Insert(const pair<K,V>& kv)
{if(_root==nullptr){_root=new Node(kv);_root->_col=BLACK;//根结点一定是黑色的}//循环找到合适的位置放kvNode*cur=_root;Node*parent=nullptr;while(cur){if(cur->_kv.first<kv.first){parent=cur;cur=cur->_right;}else if(cur->_kv.first>kv.first){parent=cur;cur=cur->_left;}else{return false;//实现去重的功能}}//此时找到了合适的位置,分清是左边放,还是右边放cur=new Node(kv);cur->_col=RED;//插入的结点必须是红结点if(parent->_left==cur){parent->_left=cur;cur->_parent=parent;}else{parent->_right=cur;cur->_parent=parent;}//此时需要看违背了红黑树的四条规则没,违反了就要进行处理操作while(parent&&parent->_col)//因为插入的结点是红色,连续红结点的话parent也是红色{Node*grandfather=parent->_parent;if(grandfather->_left==parent){Node*uncle=grandfather->_right;if(uncle&&uncle->_col==RED){uncle->_col=parent->_col=BLACK;grandfather->_col=RED;//继续往上遍历cur=grandfather;parent=cur->_parent;}else{//分单旋和双旋的情况if(cur==parent->_left)//单旋+变色{RotateR(grandfather);parent->_col=BLACK;//新的根grandfather->_col=RED;}else if(cur==parent->_right)//双旋+变色{RoteteL(parent);RotateR(grandfather);cur->_col=BLACK;//新的根grandfather->_col=RED;}break;//涉及的旋转,就要退出循环}}else//grandfather->_right==parent{Node*uncle=grandfather->_left;if(uncle&&uncle->_col==RED){uncle->_col=parent->_col=BLACK;grandfather->_col=RED;//继续往上遍历cur=grandfather;parent=cur->_parent;}else{//分单旋和双旋的情况if(cur==parent->_right)//单旋+变色{RotateR(grandfather);parent->_col=BLACK;//新的根grandfather->_col=RED;}else if(cur==parent->_left)//双旋+变色{RoteteL(parent);RotateR(grandfather);cur->_col=BLACK;//新的根grandfather->_col=RED;}break;//涉及的旋转,就要退出循环}}}_root->_col=BALCK;//让新的根重新为黑结点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;}
这里的代码简单,不做过多讲解
红黑树的验证
红黑树的检验:我们只需要检查是否满足红黑树的四点要求即可。
关键是每一条路径上的黑结点相同,这个该怎么来检验呢?
我们可以先来遍历任意一条路径,拿这条参考路径上的黑结点与任意路径上的黑结点个数进行比较,我们不用改变链表结构,只用使用局部变量来传递一个递归参数即可
来看代码:
bool IsBalanceTree()
{if(_root==nullptr) return true;if(_root->_col==RED) return false;//违反根结点是黑结点的规则int refNum=0;//参考值Node*cur=_root;while(cur){if(cur->_col==BLACK) refNum++;cur=cur->_left;}//参考路径上的黑色结点return check(_root,0,refNum)
}
bool check(Node*root,int blackNum,int refNum)
{if(root==nullptr)//说明此时走完了一个路径{if(blackNum!=refNum) return false;//路径上的黑结点个数不同return true;}if(root->_col==RED){if(root->parent->_col==RED) return false;//连续的红结点}if(root->_col==BLACK){refNum++;}return check(root->_left,blackNum,refNum)&&check(root->_right,blackNum,refNum);
}
这里我们需要注意一个点,当我们遍历到红结点的时候,我们不用去管他的孩子,因为孩子有三种(不存在,存在且为红,存在且为黑),不好判断,我们直接判断他的父亲即可
红黑树的删除这里我们不做讲解。
总结:
今天学习了红黑树,从概念,规则,实现角度出发,核心是插入接口的实现,其次就是验证红黑树的思路,是通过叔叔的角度来分析是否旋转,还是说只是变色即可,旋转的时候需要分清位置关系,而且是单旋还是双旋。
结语
今天的内容就分享到这里,不足之处欢迎留言指正,感谢大家的支持!!
古之成大事者,不惟有超世之才,亦必有坚忍不拔之志!加油!!
相关文章:
C++进阶--红黑树的实现
文章目录 红黑树的实现红黑树的概念红黑树的规则红黑树的效率 红黑树的实现红黑树的结构红黑树的插入变色单旋(变色)双旋(变色) 红黑树的查找红黑树的验证 总结:结语 很高兴和大家见面,给生活加点impetus&a…...
[C++类和对象]类和对象的引入
面向过程和面向对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用来逐步解决问题 C是基于面向对象的,关注的是对象,将一件事情分成不同的对象,靠对象之间完成交互 类的引入 C语言结构体中只能定义变量,在C中,结构体不仅仅可以定义变量,而且可以定义函…...
YOLOv12云端GPU谷歌免费版训练模型
1.效果 2.打开 https://colab.research.google.com/?utm_sourcescs-index 3.上传代码 4.解压 !unzip /content/yolov12-main.zip -d /content/yolov12-main 5.进入yolov12-main目录 %cd /content/yolov12-main/yolov12-main 6.安装依赖库 !pip install -r requirements.…...
课程审核流程揭秘:确保内容合规与用户体验
业务流程 为什么课程审核通过才可以发布呢? 这样做为了防止课程信息有违规情况,课程信息不完善对网站用户体验也不好,课程审核不仅起到监督作用,也是 帮助教学机构规范使用平台的手段。 如果流程复杂用工作流 说明如下ÿ…...
【LangChain高级系列】LangGraph第一课
前言 我们今天直接通过一个langgraph的基础案例,来深入探索langgraph的核心概念和工作原理。 基本认识 LangGraph是一个用于构建具有LLMs的有状态、多角色应用程序的库,用于创建代理和多代理工作流。与其他LLM框架相比,它提供了以下核心优…...
ATH12K 驱动框架
ATH12K 驱动框架 ath12k驱动框架及模块交互逻辑详解1. 总体架构2. 关键数据结构2.1 核心数据结构2.2 虚拟接口数据结构3. 硬件抽象层(HAL)4. 无线管理接口(WMI)5. 主机目标通信(HTC)6. 数据路径(DP)6.1 发送路径(TX)6.2 接收路径(RX)7. 多链路操作(MLO)8. 初始化和工作流程8.1 …...
CMA认证对象?CMA评审依据,CMA认证好处
CMA认证对象 CMA(中国计量认证,China Metrology Accreditation)的认证对象主要是第三方检测机构和实验室,包括: 独立检测机构:如环境监测站、产品质量检验所、食品药品检测机构等。 企业内部实验室&#…...
依赖关系-根据依赖关系求候选码
关系模式R(U, F), U{},F是R的函数依赖集,可以将属性分为4类: L: 仅出现在依赖集F左侧的属性 R: 仅出现在依赖集F右侧的属性 LR: 在依赖集F左右侧都出现的属性 NLR: 在依赖集F左右侧都未出现的属性 结论1: 若X是L类…...
解决应用程序在JAR包中运行时无法读取类路径下文件的问题
问题情景 java应用程序在IDE运行正常,打成jar包后执行却发生异常: java.io.FileNotFoundException: class path resource [cert/sync_signer_pri_test.key] cannot be resolved to absolute file path because it does not reside in the file system:…...
第十六届蓝桥杯B组第二题
当时在考场的时候这一道题目 无论我是使用JAVA的大数(BIGTHGER)还是赛后 使用PY 都是没有运行出来 今天也是突发奇想在B站上面搜一搜 看了才知道这也是需要一定的数学思维 通过转换 设X来把运算式精简化 避免运行超时 下面则是代码 public class lanba…...
龙虎榜——20250509
上证指数今天缩量,整体跌多涨少,走势处于日线短期的高位~ 深证指数今天缩量小级别震荡,大盘股表现更好~ 2025年5月9日龙虎榜行业方向分析 一、核心行业方向 军工航天 • 代表个股:航天南湖、天箭科技、襄阳轴承。 • 驱动逻辑…...
node提示node:events:495 throw er解决方法
前言 之前开发的时候喜欢使用高版本,追求新的东西,然后回头运行一下之前的项目提示如下 项目技术栈:node egg 报错 node:events:495 throw er; // Unhandled error event ^ Error: ENOENT: no such file or directory, scandir F:\my\gi…...
OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
目录 1. Ubuntu中编译 2. NDK环境配置 3. 编译 4. 安装 这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下: https://github.com/gentoo/eudev 相应的代码最好是在Ubuntu中先编译通过&#…...
[AI ][Dify] Dify Tool 插件调试流程详解
在使用 Dify 进行插件开发时,调试是必不可少的环节。Dify 提供了远程服务调试的能力,让开发者可以快速验证插件功能和交互逻辑。本文将详细介绍如何配置环境变量进行插件调试,并成功在插件市场中加载调试状态的插件。 一、调试环境配置 在 Dify 的插件调试过程中,我们需要…...
learning ray之ray强化学习/超参调优和数据处理
之前我们掌握了Ray Core的基本编程,我们已经学会了如何使用Ray API。现在,让我们将这些知识应用到一个更实际的场景中——构建一个强化学习项目,并且利用Ray来加速它。 我们的目标是,通过Ray的任务和Actor,将一个简单…...
gpu硬件,gpu驱动,cuda,CUDA Toolkit,cudatoolkit,cudnn,nvcc概念解析
组件角色依赖关系GPU硬件无CUDA编程模型/平台需NVIDIA GPU和驱动CUDA Toolkit开发工具包(含NVCC、库等)需匹配GPU驱动和CUDA版本cuDNN深度学习加速库需CUDA ToolkitNVCCCUDA代码编译器包含在CUDA Toolkit中 GPU硬件: 硬件层面的图形处理器&…...
【C/C++】范围for循环
📘 C 范围 for 循环详解(Range-based for loop) 一、什么是范围 for 循环? 范围 for 循环(Range-based for loop) 是 C11 引入的一种简化容器/数组遍历的方式。它通过自动调用容器的 begin() 和 end() 方法…...
嵌入式开发学习(第二阶段 C语言基础)
C语言:第4天笔记 内容提要 流程控制 C语句数据的输入与输出 流程控制 C语句 定义 C程序是以函数为基础单位的。一个函数的执行部分是由若干条语句构成的。C语言都是用来完成一定操作的任务。C语句必须依赖于函数存在。 C程序结构 C语句分类 1.控制语句 作…...
大物重修之浅显知识点
第一章 质点运动学 例1 知识点公式如下: 例2 例3 例4 例5 例6 第四章 刚体的转动 例1 例2 例3 例4 例5 例6 第五章 简谐振动 例1 例2 例3 第六章 机械波 第八章 热力学基础 第九章 静电场 第十一章 恒定磁场…...
随笔-近况
好久没写了,手都生了。 我写的东西可以分为两类:技术和随笔。当然技术没有我自己创新的,都是些在解决问题过程中查询了很多资料,经过验证后,可以在项目上使用的。但是自从 deepseek 出现后,问题一下子简单…...
赤色世界 陈默传 第一章 另一个陈默
赤色世界 陈默传 第一章 另一个陈默 陈默在一片纯白的空间中缓缓睁开眼睛。没有声音,没有光影的变化,只有无尽的空白包围着他,仿佛整个世界被擦去了所有的色彩和形状。他站在那里,赤脚踩在这片空无一物的地面上,却能感…...
isp流程介绍(yuv格式阶段)
一、前言介绍 前面两章里面,已经分别讲解了在Raw和Rgb域里面,ISP的相关算法流程,从前面文章里面可以看到,在Raw和Rgb域里面,很多ISP算法操作,更像是属于sensor矫正或者说sensor标定操作。本质上来说&#x…...
关于大数据的基础知识(一)——定义特征结构要素
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(一&a…...
C++(1):整数常量
目录 一、进制表示 二、后缀指定类型 三、示例与注意 四、总结表 一、进制表示 十进制(Decimal) 格式:无前缀,由数字 0-9 组成。 示例:123、42。 注意:不能以 0 开头(否则会被视为八进制&a…...
C# NX二次开发:宏录制实战讲解(第一讲)
今天要讲的是关于NX软件录制宏操作的一些案例。 下面讲如何在NX软件中复制Part体的录制宏。 NXOpen.Session theSession NXOpen.Session.GetSession(); NXOpen.Part workPart theSession.Parts.Work; NXOpen.Part displayPart theSession.Parts.Display; NXOpe…...
C++:书架
【描述】 John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有N头奶牛(1 ≤ N ≤ 20,000),每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N头奶牛的总高度为S。书架高度为B(1 ≤ B ≤ S <…...
34.笔记1
今天,我们回顾回顾曾经的知识。 1.二分 还记得当初的二分吗? 1.一开始的二分 就像下面这个故事: 有一只老鼠,躲在10个大瓷瓶后面。你的任务就是抓住这只老鼠,但在抓的过程会导致你选择的大瓷瓶成为分子碎片。 如…...
智慧工会服务平台建设方案Word(23页)
1. 引言 随着信息技术的快速发展,传统工会服务模式面临挑战,智慧工会服务平台应运而生。该平台旨在通过数字化手段,整合工会资源,优化服务流程,提高工作效率,为会员提供更加便捷、高效、个性化的服务体验。…...
常见降维算法分析
一、常见的降维算法 LDA线性判别PCA主成分分析t-sne降维 二、降维算法原理 2.1 LDA 线性判别 原理 :LDA(Linear Discriminant Analysis)线性判别分析是一种有监督的降维方法。它的目标是找到一个投影方向,使得不同类别的数据在…...
洛谷 P1179【NOIP 2010 普及组】数字统计 —— 逐位计算
题面:P1179 [NOIP 2010 普及组] 数字统计 - 洛谷 一:题目解释: 需要求一区间内数字 2 的出现次数。注意22则记为 2 次,其它没别的... 二:思路、 思想可以考虑动态规划需要计算在每一位上数字 2 的出现次数,然后将这些…...
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现-1
互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现-1 场景背景 在某互联网大厂的技术面试中,技术总监张总正在面试一位名为郑薪苦的求职者。郑薪苦虽然对技术充满热情,但回答问题时总是带着幽默感,有时甚至让人哭笑不得。…...
学习黑客5 分钟读懂什么是 CVE?
5 分钟读懂什么是 CVE? ⏱️🔐 目标读者: 安全小白 风格: ***式清晰、循序渐进 篇幅: 5 分钟速读 📖 目录 🚀 什么是 CVE?🤔 为什么要关注 CVE?🔍…...
SAM详解3.1(关于2和3的习题)
SAM SAMluogu5341SP8222SAM 推销一波前面的文章: SAM详解1 SAM详解2(初级应用) SAM详解3(SAM与AC自动机的相似性,SAM处理字符串匹配) luogu5341 题目链接 精简题意:给你一个字符串和 k k k,求 出现了 k k k 次的子串的长度 的出现次数 的最大值。 我们可以用 S…...
Java中医门诊系统源码 中医诊所系统源码
Java中医门诊系统源码 中医诊所系统源码 一、患者信息录入在中医问诊系统中,患者信息录入是第一步。系统会要求患者填写一些基本信息,如姓名、年龄、性别、职业等,以及一些关于健康状况的详细描述。这些信息将被系统自动保存,并用…...
Edwards爱德华STP泵软件用于操作和监控涡轮分子泵
Edwards爱德华STP泵软件用于操作和监控涡轮分子泵...
RabittMQ-高级特性2-应用问题
文章目录 前言延迟队列介绍ttl死信队列存在问题延迟队列插件安装延迟插件使用事务消息分发概念介绍限流非公平分发(负载均衡) 限流负载均衡RabbitMQ应用问题-幂等性保障顺序性保障介绍1顺序性保障介绍2消息积压总结 前言 延迟队列介绍 延迟队列(Delaye…...
deep seek简介和解析
deepseek大合集,百度链接:https://pan.baidu.com/s/10EqPTg0dTat1UT6I-OlFtg?pwdw896 提取码:w896 一篇文章带你全面了解deep seek 目录 一、deep seek是什么 DeepSeek-R1开源推理模型,具有以下特点: 技术优势: 市场定位&…...
Webug4.0靶场通关笔记24- 第29关Webshell爆破
目录 一、Webshell爆破原理分析 二、第29关webshell爆破渗透实战 1.环境搭建 2.打开靶场 3.暴力破解 (1)bp开启抓包模式 (2)输入密码12并抓包 (3)配置position (4)配置payl…...
Linux系统入门第十一章 --Shell编程之函数与数组
一、Shell函数 1、函数的用法 Shell函数可用于存放一系列的指令。在Shell脚本执行的过程中,函数被置于内存中,每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在Shell编程中函数并非是必须的元素,但使用函数可以对程序进…...
【文件系统—散列结构文件】
文章目录 一、实验目的实验内容设计思路 三、实验代码实现四、总结 一、实验目的 理解linux文件系统的内部技术,掌握linux与文件有关的系统调用命令,并在此基础上建立面向随机检索的散列结构文件;## 二、实验内容与设计思想 实验内容 1.设…...
软件系统中功能模型 vs 数据模型 对比解析
功能模型 vs 数据模型 对比解析 一、功能模型(Functional Model) 定义:描述系统 做什么(业务逻辑与操作流程) 核心关注:行为、交互、业务流程 建模工具: 用例图(UML Use Case Dia…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(17):「 」と言いました
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(17):「 」と言いました 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)复习(2)「…...
qiankun微前端任意位置子应用
qiankun微前端任意位置子应用 主项目1、安装qiankun2、引入注册3、路由创建4、路由守卫 二、子项目1、安装sh-winter/vite-plugin-qiankun2、main.js配置3、vite.config.js配置 三、问题解决 主项目 1、安装qiankun npm i qiankun -S2、引入注册 创建存放子应用页面 //whpv…...
普通IT的股票交易成长史--20250509晚复盘
声明: 本文章的内容只是自己学习的总结,不构成投资建议。价格行为理论学习可参考简介中的几位,感谢他们的无私奉献。 送给自己的话: 仓位就是生命,绝对不能满仓!!!!&…...
切比雪夫不等式专题习题
切比雪夫不等式专题习题 前言 本文为概率论习题集专栏的切比雪夫不等式专题习题,共设计10道由浅入深的习题,涵盖基本概念、计算应用、理论证明与实际场景应用。建议先独立完成后再参考解析篇。 一、基础概念题 习题1: 判断题(…...
JAVA包装类
一、基本数据类型 1.整型类型: 用于表示整数数值,不包含小数部分。 类型位数取值范围默认值示例byte8-128 至 1270byte num 100;short16-32,768 至 32,7670short num 5000;int32-2,147,483,648 至 2,147,483,6470int num 100000;long64-2^63 至 2^…...
[特征工程]机器学习-part2
1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程步骤…...
布隆过滤器:高效的数据结构与应用详解
引言 在处理大规模数据时,如何高效地判断某个元素是否存在于集合中是一个常见问题。传统的数据结构(如哈希表)虽然可以解决这一问题,但在存储空间和查询效率上可能存在瓶颈。布隆过滤器(Bloom Filter)作为…...
【免杀】C2免杀 | 概念篇
一、什么是 C2 ? Command and Control(命令与控制)的缩写,是指攻击者用来远程控制被入侵设备(如计算机、服务器等)的通信架构。C2 攻击 是指攻击者在目标系统中植入远程控制恶意软件(如木马、僵尸网络、后…...
期刊论文写作注意点
下面给出关于期刊写作的几个关键注意点 一、摘要突出创新点 最重要的是论文的摘要,因为在论文送审的时候,编辑如果没有时间,最先看的就是摘要。摘要要写好。如果投的是顶刊,在摘要里面尽量不要写是在什么方法的基础上进行改进之类…...