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

红黑树(Red-Black Tree)

一、概念

        红黑树(Red Black Tree)是一种自平衡的二叉搜索树,通过添加颜色信息来确保在进行插入和删除操作时,树的高度保持在对数级别,从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普通二叉搜索树可能退化为链表的问题。

        在此文中会时不时用红黑树和AVL树作类比,朋友们可以查阅了解AVL树相关内容:AVL 树-CSDN博客

        红黑树和AVL树有一些共同点:

                1.平衡二叉搜索树

                2.解决普通二叉搜索树在特殊情况退化为类似链表的问题

1.1红黑树的规则:

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

为了大家能更快的认识和理解红黑树,看看以下的树,都是红黑树结构

上面4棵树均是符合黑红色树规则的树。

1.2 推理

        由上面4点规则推理:最长路径不超过最短路径的2倍

思考:红黑树如何确保最长路径不超过最短路径的2倍?

  •         根据规则4,从根到NULL节点的每条路径都有相同数量的黑色节点。所以,在极端情况下,最短路径是全由黑色节点组成的路径,假设最短路径长度为bh(black height)。
  •         根据规则2和规则3,任意一条路径不会有连续的红色节点。因此,极端情况下,最长的路径是由一黑一红交替组成的,那么最长路径的长度为2*bh。
  •         结合红黑树的4点规则,理论上的全黑最短路径和一黑一红的最长路径并不会在每棵红黑树中都存在。假设任意一条从根到NULL节点的路径长度为x,那么bh ≤ h ≤ 2*bh。

说明

        《算法导论》等书籍补充了一条规则,即每个叶子节点(NIL)都是黑色的。这里所指的叶子节点不是传统意义上的叶子节点,而是我们所说的空节点。一些书籍中也把NIL称为外部节点。NIL的作用是方便准确地标识所有路径。《算法导论》在后续讲解实现细节时忽略了NIL节点,因此我们只需了解这个概念即可。

1.3 红黑树的效率

        假设N是红黑树中节点的数量,h是最短路径的长度,那么 2^h−1 ≤ N<2^2h−1 。由此推出 h ≈ log⁡N 。这意味着红黑树在增删查改操作中,最坏情况下也只是走最长路径 2log⁡N ,因此时间复杂度依然是 O(log⁡N) 。

        红黑树相对于AVL树表达更为抽象一些,AVL树通过高度差直接控制平衡。而红黑树通过四条颜色约束规则间接实现了近似平衡。虽然两者的效率同属一个档次,但在插入相同数量的节点时,红黑树的旋转次数更少,因为它对平衡的控制没那么严格。

 二、红黑树节点增加与查找

2.1 红黑树插入一个值的大概过程

  1. 插入一个值:按二叉搜索树规则进行插入。插入后需要观察是否符合红黑树的4条规则。

  2. 空树插入

    • 新增结点是黑色结点。(根节点必须是黑色)

  3. 非空树插入

    • 新增结点必须是红色结点,因为插入黑色结点会破坏规则4(很难维护)。

    • 如果父亲结点是黑色的,则没有违反任何规则,插入结束。

    • 如果父亲结点是红色的,则违反规则2,进一步处理。

  4. 处理违反规则3

    • c是红色,p为红,g必为黑。

    • 关键看叔叔u的情况,需要根据u分为以下几种情况分别处理。

【说明】

        下图中假设我们把新增结点标识为 (curr),c的父亲标识为 p(parent),p的父亲标识为 g(grandfather),p的兄弟标识为 u(uncle)。 


 情况1【变色】
  • 初始状态:c为红,p为红,g为黑,u存在且为红。

  • 操作:将p和u变黑,g变红。在g当做新的c,继续往上更新。

分析

  • 因为p和u都是红色,g是黑色。把p和u变黑,左边子树路径各增加一个黑色结点。

  • g再变红,相当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题。

  • 需要继续往上更新是因为  1)g是红色。如果g的父亲还是红色,那么就还需要继续处理;2)如果g的父亲是黑色,则处理结束了;3)如果g就是整棵树的根,再把g变回黑色。

  • 情况1只变色,不旋转。所以无论c是p的左还是右,p是g的左还是右,都是上面的变色处理方式。

【图解】 

 


可以把总的情况做成抽象图:

对照抽象图下面还有一个例子供给大家参考,可以更具象地理解向上更新的过程:


 情况2【单旋 + 变色】
  • 初始状态:  c 为红,p 为红,g 为黑。u 不存在或者存在且为黑。

  • 如果 u 不存在,则 c 一定是新增结点。如果 u 存在且为黑,则 c 一定不是新增结点,c 之前是黑色,是在 c 的子树中插入,符合情况1,变色将 c 从黑色变成红色,更新上来的。

如图:

分析:

  • p 必须变黑,才能解决连续红色结点的问题。

  • u 不存在或者是黑色的,这里单纯的变色无法解决问题,需要旋转 + 变色

旋转 + 变色(操作):

  • 如果 pg 的左,cp 的左

  1. g 为旋转点进行右单旋。(和旋转的操作和搜索二叉树里的旋转是一样的)
  2. 再把 p 变黑,g 变红即可。
  3. p 变成这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点,且不需要往上更新,因为 p 的父亲是黑色、红色或空都不违反规则。
  • 如果 pg 的右,cp 的右

  1. g 为旋转点进行左单旋。

  2. 再把 p 变黑,g 变红即可。

  3. p 变成这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点,且不需要往上更新,因为 p 的父亲是黑色、红色或空都不违反规则。


        (其实无论左边或右边操作都思路都是一种思路,这里通过文字描述给大家做参考,如果不太喜欢文字叙述可以直接看图解)

【图解】 (对应上面举例)

 情况3 【双旋 + 变色】

 初始状态:c 为红,p 为红,g 为黑,u 不存在或为黑色

 

条件分析

       如果 u 不存在 或u 存在且为黑色(与需要单旋加变色的情况二相同)

【双旋+变色】 与 【单旋+变色】对比:

旋转 + 变色(操作):

  情况1:p 是 g 的左子节点,c 是 p 的右子节点(左-右双旋)

  1. 以p为旋转点,左单旋 

  2. 以g为旋转点,右单旋 

  3. 变色:p 和 g 变红,将 c 变黑。

  情况2:p 是 g 的右子节点,c 是 p 的左子节点(右-左双旋)

  1. 以p为旋转点,右单旋 

  2. 以g为旋转点,左单旋 

  3. 变色:p 和 g 变红,将 c 变黑。

        

【图解】 (对应上面举例) 

 抽象图讨论由子树更新上来的情况:

2.2红黑树节点查找

        红黑树的查找操作与普通的二叉搜索树的查找操作非常相似。

        都遵循相同的查找规则,即在每个节点比较查找键值和当前节点的键值,根据比较结果选择继续在左子树或右子树中查找。 

【步骤】 

  1. 从根节点开始:查找从树的根节点开始。

  2. 比较键值:将查找键与当前节点的键进行比较。

    • 如果查找键小于当前节点的键,则继续在左子树中查找。

    • 如果查找键大于当前节点的键,则继续在右子树中查找。

    • 如果查找键等于当前节点的键,则查找成功,返回该节点。

相关文章:

红黑树(Red-Black Tree)

一、概念 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;通过添加颜色信息来确保在进行插入和删除操作时&#xff0c;树的高度保持在对数级别&#xff0c;从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普…...

火电厂可视化助力提升运维效率

图扑智慧火电厂综合管理平台实现对火电厂关键设备和系统的实时监控和数据分析。图扑可视化不仅优化了运维流程&#xff0c;还增强了安全管理&#xff0c;有效提升了电厂整体运营效率。...

application.yml 和 bootstrap.yml

在 Spring Boot 中&#xff0c;application.yml 和 bootstrap.yml 都是用来配置应用程序的属性文件&#xff0c;通常用于环境配置、服务配置等。但是&#xff0c;它们有一些不同的用途和加载顺序。以下是它们之间的主要区别&#xff1a; 1. application.yml&#xff1a; 主要…...

电子应用设计方案-49:智能拖把系统方案设计

智能拖把系统方案设计 一、引言 随着人们生活水平的提高和对清洁效率的追求&#xff0c;智能拖把作为一种创新的清洁工具应运而生。本方案旨在设计一款功能强大、操作便捷、清洁效果出色的智能拖把系统。 二、系统概述 1. 系统目标 - 实现自动清洁地面&#xff0c;减轻用户劳…...

Model Context Protocol 精选资源列表

Model Context Protocol 精选资源列表 Model Context Protocol 精选资源列表什么是MCP&#xff1f;教程社区说明服务器实现&#x1f4c2; 浏览器自动化☁️ 云平台&#x1f4ac; 社交&#x1f464; 数据平台&#x1f5c4;️ 数据库&#x1f4bb; 开发者工具&#x1f9ee; 数据科…...

Windows 11 12 月补丁星期二修复了 72 个漏洞和一个零日漏洞

微软于 2024 年 12 月为 Windows 11 发布的补丁星期二修复了其产品生态系统中的 72 个漏洞&#xff0c;包括 Windows 通用日志文件系统驱动程序中一个被积极利用的零日漏洞。 这个严重漏洞可以通过基于堆的缓冲区溢出授予攻击者系统权限&#xff0c;使其成为此版本中优先级最高…...

Python毕业设计选题:基于Hadoop 的国产电影数据分析与可视化_django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 免费电影管理 在线论坛 留言反馈 看板展示 系统…...

蓝桥杯我来了

最近蓝桥杯报名快要截止了&#xff0c;我们学校开始收费了&#xff0c;我们学校没有校赛&#xff0c;一旦报名缴费就是省赛&#xff0c;虽然一早就在官网上报名了&#xff0c;但是一直在纠结&#xff0c;和家人沟通&#xff0c;和朋友交流&#xff0c;其实只是想寻求外界的支持…...

大模型qiming面试内容整理-编码能力评估

编码能力评估是大模型相关岗位面试中非常关键的一环,面试官通常希望通过这个环节了解候选人对编程语言、算法与数据结构的掌握情况,以及其在实践中解决实际问题的能力。以下是编码能力评估的常见内容和类型,特别是针对机器学习、大模型和深度学习方向: 编程语言熟练度 ● P…...

Vivado ILA数据导出MATLAB分析

目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时&#xff0c;数据在VIVADO窗口获取的信息有限&#xff0c;可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号&#xff0c;单击右键后&#xff0c;会有export ILA DATA选项&#xff0c;将其保存成CS…...

Linux内核 -- 字符设备之read write poll基本实现

Linux字符设备&#xff1a;read、write和poll函数实现及完整代码 1. read函数 原型 ssize_t read(struct file *file, char __user *buf, size_t count, loff_t *pos);实现步骤 检查用户缓冲区&#xff1a;使用copy_to_user将数据从内核空间复制到用户空间。返回已读取的字…...

linux部署ansible自动化运维

ansible自动化运维 1&#xff0c;编写ansible的仓库&#xff08;比赛已经安装&#xff0c;无需关注&#xff09; 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上&#xff08;右下角呈绿色状态&#xff09; 3、查看光盘挂载信息 df -h…...

springboot421社区医疗服务可视化系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装社区医疗服务可视化系统软件来发挥其高效地信息处理的作用…...

vue渲染时闪光白屏问题怎么解决(笔记)

Vue渲染时出现闪光白屏问题&#xff0c;可能是因为页面内容需要较长时间才能加载完成&#xff0c;而在加载期间&#xff0c;页面会显示白屏或者空白内容&#xff0c;给用户体验带来负面影响。 解决方法&#xff1a; 为标签绑定 v-cloak 在样式中写 v-clock {displa&#xff…...

duxapp 2024-12-09 更新 PullView可以弹出到中间,优化CLI使用体验

UI库 修复 Button 禁用状态失效的问题Modal 组件即将停用&#xff0c;请使用 PullView 基础库 PullView side 新增 center 指定弹出到屏幕中间PullView 新增 duration 属性&#xff0c;指定动画时长新增 useBackHandler hook 用来阻止安卓端点击返回键 RN端 修复 windows …...

vue调试插件vue Devtools下载安装

Vue.js Devtools_6.6.3_Chrome插件下载_极简插件 进图官网点击推荐下载下载该调试工具 解压缩找到扩展程序开启开发者模式 将解压缩的文件拖拽到该页面空白处&#xff0c;点击添加扩展程序 点击详情允许访问文件网址 页面右键检查可以发现已经成功添加该页面调试插件...

.net core使用AutoMapper

AutoMapper 是一个用于 .NET 平台的对象映射工具&#xff0c;它简化了不同对象类型之间的转换过程。在软件开发中&#xff0c;尤其是在分层架构的应用程序里&#xff0c;常常需要在不同的对象模型之间进行数据传递&#xff0c;例如从数据库实体到视图模型、DTO&#xff08;数据…...

HTTP头注入

注入类漏洞经久不衰&#xff0c;多年保持在owasp Top 10的首位。今天就聊聊那些被人遗忘的http头注入。用简单的实际代码进行演示&#xff0c;让每个人更深刻的去认识该漏洞。 3|0HOST注入 在以往http1.0中并没有host字段&#xff0c;但是在http1.1中增加了host字段&#xff…...

110.【C语言】编写命令行程序(1)

目录 1.前置知识 "命令"的含义 运行C语言程序 2.介绍 main函数的参数 实验1 执行结果 实验2 执行结果 修改代码 实验3 分析 方法:遍历数组argv[]中的所有参数 执行结果 修改代码 执行结果 1.前置知识 "命令"的含义 WINR输入cmd,在cmd窗口下…...

k8s 之 StatefulSet

深入理解StatefulSet&#xff08;一&#xff09;&#xff1a;拓扑状态 k8s有状态与无状态的区别 无状态服务&#xff1a;deployment Deployment被设计用来管理无状态服务的pod,每个pod完全一致.什么意思呢? 无状态服务内的多个Pod创建的顺序是没有顺序的. 无状态服务内的多…...

PTA 7-2 从身份证号码中提取出出生年月

分数 12 作者 崔孝凤 单位 山东理工大学 输入一个18位的身份证号码&#xff0c;提取出年份和月份并输出&#xff0c;请判断输入的号码是否是18位&#xff0c;如果不是请提示"Invalid data,input again!"&#xff0c;并重新输入新的号码。 输入格式: 输入一个18位…...

Plugin - 插件开发04_Spring Boot中的SPI机制与Spring Factories实现

文章目录 Pre方案概览使用插件的好处Spring Boot中的SPI机制与Spring Factories实现1. Spring Boot中的SPI机制Spring Factories文件 2. Spring Factories实现原理3. Code3.1 定义一个服务接口3.2 定义 实现类3.3 配置 spring.factories 文件3.4 创建一个Controller来加载插件3…...

GUNS搭建

一、准备工作 源码下载&#xff1a; 链接: https://pan.baidu.com/s/1bJZzAzGJRt-NxtIQ82KlBw 提取码: criq 官方文档 二、导入代码 1、导入后端IDE 导入完成需要&#xff0c;需要修改yml文件中的数据库配置&#xff0c;改成自己的。 2、导入前端IDE 我是用npm安装的yarn npm…...

路径规划之启发式算法之十四:蜘蛛蜂优化算法(Spider Wasp Optimizer, SWO)

蜘蛛蜂优化算法(Spider Wasp Optimizer, SWO)是一种受自然界中蜘蛛蜂行为启发的元启发式智能优化算法。由Mohamed Abdel-Basset等人于2023年提出,算法模拟了雌性蜘蛛蜂的狩猎、筑巢和交配行为,具有独特的更新策略,适用于具有不同探索和开发需求的广泛优化问题。 一、算法背…...

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下&#xff1a; //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…...

Java多线程与线程池技术详解(八)

《星游记》 “如果只有傻瓜才相信梦想&#xff0c;那么就叫我大傻瓜吧&#xff01;” 《一人之下》 “想走的路不好走&#xff0c;想做人不好做&#xff0c;都说是身不由己&#xff0c;不是废话么。己不由心&#xff0c;身又岂能由己&#xff01;” 目录 上一篇博客习题讲解 编…...

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…...

ThinkPHP 6.0 PHP新手教程

1、系统配置文件 下面系统自带的配置文件列表及其作用&#xff1a; 配置文件名描述app.php应用配置cache.php缓存配置console.php控制台配置cookie.phpCookie配置database.php数据库配置filesystem.php磁盘配置lang.php多语言配置log.php日志配置middleware.php中间件配置rou…...

【Excel学习记录】02-单元格格式设置

1.单元格格式工具美化表格 单元格格式位置 选中单元格&#xff0c;右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车&#xff1a;alt enter 格式刷 2.单元格数字格式 格式不影响数值&#xff0c;只是展示形式 日期本质也是数…...

Paimon Tag和Branch创建文件存储过程

结论&#xff1a; 如果data-file被引用则不会被压缩&#xff0c;压缩仅针对未被引用的文件&#xff0c;创建tag时候根据当前快照进行创建 1、实际表和Manifest的内容 查看tag的内容 select * from table$tags;或者直接查看tag ossutil cat oss://test-dataware/warehouse/te…...

HCIA笔记8--DHCP、Telnet协议

1. DHCP介绍 对于主机的网络进行手动配置&#xff0c;在小规模的网络中还是可以运作的&#xff0c;但大规模网络是无力应对的。因此就有了DHCP协议来自动管理主机网络的配置。 DHCP(Dynamic Host Configuration Protocol): 动态主机配置协议&#xff0c;主要需要配置的参数有…...

Tableau数据可视化与仪表盘搭建

1.Tableau介绍 可视化功能 数据赋能 数据赋能就是将我们的数据看板发布到我们的线上去 这里的IP地址是业务部门可以通过账号密码登入的 我们也可以根据需要下载&#xff0c;选中并点击下载即可 下载下来之后&#xff0c;自己就能根据数据进行自定义的分析 也可以下载图片 还有…...

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同&#xff0c;上一篇地址点击进入, 改动点1&#xff1a;在setting.py中最后再添加如下配置&#xff1a; # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…...

自动驾驶控制与规划——Project 1: 车辆纵向控制

目录 零、任务介绍一、环境配置1.1 CARLA的配置1.2 Docker Ubuntu 20.04 ROS2 Foxy的配置 二、算法2.1 定速巡航2.2 自适应巡航2.3 离散PID控制 三、代码实现3.1 代码补全3.2仿真验证 零、任务介绍 课程主页 配置Carla仿真器配置carla-ros-bridge补全src\ros-bridge\carla_s…...

基于python实现自动化的验证码识别:探索与实践

基于python实现自动化的验证码识别&#xff1a;探索与实践 一、验证码的类型及特点&#xff08;一&#xff09;图像验证码&#xff08;二&#xff09;短信验证码&#xff08;三&#xff09;语音验证码 二、验证码识别的方法*&#xff08;一&#xff09;传统图像处理方法&#x…...

如何保证消息队列的高可用?(RabbitMQ)

RabbitMQ 是基于主从&#xff08;非分布式&#xff09;做高可用性的&#xff0c;RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式 1、单机模式&#xff1a;一般没人生产用单机模式 2、普通集群模式&#xff1a; 普通集群模式用于提高系统的吞吐量&…...

es的join是什么数据类型

在 Elasticsearch 中,parent 并不是一个独立的数据类型,而是与 join 数据类型一起使用的一个概念。join 数据类型用于在同一个索引中建立父子文档之间的关系,允许你在一个索引内表示层级结构或关联关系。通过 join 字段,你可以定义不同类型的文档(如父文档和子文档),并指…...

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况&#xff0c;就是爬虫最初是正常运行、正常抓取数据的&#xff0c;一切看起来都是那么美好&#xff0c;然而一杯茶的工夫就出现了错误&#xff0c;例如 403 Forbidden&#xff0c;这时打开网页一看&#xff0c;可能会看到“您的IP访问频率太…...

golang实现简单的reids服务2

golang实现redis兼容的redis服务实现redis兼容的redis服务思路 golang实现redis兼容的redis服务 之前做的redis服务是通过tcp封装的自定义协议 原版项目地址:https://github.com/dengjiayue/my-redis.git 那么能不能实现一个redis兼容的redis服务,这样一般的redis包也可以调…...

CSS常用的尺寸单位

像素px 以屏幕上的一个点为单位&#xff0c;比较稳定和精确用的最多 em 以字体大小为参考&#xff0c;&#xff08;是自身字体大小的倍数&#xff09;当自身的字体大小改变时&#xff0c;em也会随着改变em * font-size px rem 以根元素 < html > 作为参考&#xff…...

计算机网络 备查

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元&#xff08;PDU&#xff09;和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段&#xff0c;并加上TCP头 4.网络层添加IP地址信息…...

JavaEE 【知识改变命运】05 多线程(4)

文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式&#xff08;DCL检查锁&#xff09; 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...

迭代器和生成器

一、迭代器&#xff08;Iterator&#xff09; 1. 什么是迭代器&#xff1f; 迭代器是一个可以在某一集合&#xff08;如列表、元组等&#xff09;中逐个访问元素的对象。它提供了一个方法&#xff0c;可以记住遍历的位置&#xff0c;每次取出一个元素&#xff0c;直到所有元素…...

小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)

当我还是初学者的时候&#xff0c;我经常思考有没有比慢慢求每一位数字然后考虑正序&#xff0c;逆序输出要快的办法...长期琢磨&#xff0c;必有所获&#xff01; 我刚学数据结构的时候还没意识到栈&#xff0c;队列还能这样用&#xff0c;虽然说有点杀鸡用牛刀的感觉&#x…...

前端换行、空格的多种表现形式

换行 1、<br> 标签 这是最直接的方式&#xff0c;用于在文本中插入一个简单的换行。<br> 标签是一个空元素&#xff0c;意味着它不需要结束标签。 示例&#xff1a; <p>这是第一行。<br>这是第二行。</p>2、CSS white-space 属性 通过CSS的w…...

自己总结:selenium高阶知识

全篇大概10000字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间30min 一、等待机制 如果有一些内容是通过Ajax加载的内容&#xff0c;那就需要等待内容加载完毕才能进行下一步操作。 为了避免人为操作等待&#xff0c;会遇到的问题&#xff0c; selenium将等待转换…...

无线遥控红外通信

无线遥控红外通信 红外发射装置一般是指红外遥控器由 键盘电路 &#xff0c;红外编码电路 电源电路 和红外发射 电路组成 一般的红外线波长为940nm左右&#xff0c;外形与普通发光二极管相同 红外遥控为了提高抗干扰性能和降低电源消耗&#xff0c;红外遥控器常用载波的方式传送…...

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…...

Rust包管理和构建工具

Cargo 是 Rust 语言的包管理和构建工具。它提供了一套完整的工具链&#xff0c;用于管理 Rust 项目的依赖关系、编译代码、运行测试和生成文档。Cargo 极大地简化了 Rust 项目的开发和部署过程&#xff0c;使得开发者可以专注于编写代码&#xff0c;而不是处理构建系统的复杂性…...

STM32输入捕获详解

目录 一、引言 二、输入捕获原理 三、寄存器介绍 四、配置步骤 1.开启时钟 2.GPIO 初始化 3.初始化定时器 4.配置输入捕获模式 5.使能捕获和更新中断 6.设置中断分组并编写中断服务函数 7.使能定时器 五、程序示例 六、总结 一、引言 在嵌入式系统开发中&#xff0…...