B树的异常恢复
B-Tree & Crash Recovery
B树作为平衡的n叉树
高度平衡树
许多实用的二叉树(如AVL树或红黑树)被称为高度平衡树,这意味着树的高度(从根节点到叶子节点)被限制为Ο(log 𝑁),因此查找操作的时间复杂度也是Ο(log 𝑁)。
B树同样是一种高度平衡的树;所有叶子节点的高度相同。
从二叉树推广到n叉树
n叉树可以从二叉树推广而来(反之亦然)。一个典型的例子是2-3-4树,它是一种特殊的B树,其中每个节点可以有2、3或4个子节点。2-3-4树与红黑树等价,但为了理解B树,我们不需要深入探讨这些细节。
可视化一个2层的B+树
以下是一个排序序列 [1, 2, 3, 4, 6, 9, 11, 12]
的2层B+树示例:
[1, 4, 9]/ | \v v v
[1, 2, 3] [4, 6] [9, 11, 12]
在B+树中:
- 只有叶节点包含实际值。
- 内部节点中的键用于指示子树的键范围。
在这个例子中,内部节点 [1, 4, 9]
表示其三个子树的键范围分别为:
[1, 4)
:第一个子树[1, 2, 3]
。[4, 9)
:第二个子树[4, 6]
。[9, +∞)
:第三个子树[9, 11, 12]
。
然而,实际上只需要两个键即可划分三个区间:
(-∞, 4)
:表示小于4的所有键。[4, 9)
:表示大于等于4且小于9的键。[9, +∞)
:表示大于等于9的所有键。
因此,第一个键 1
可以省略,简化后的键范围如下:
(-∞, 4)
。[4, 9)
。[9, +∞)
。
这种设计使得B+树的内部节点能够更高效地存储键,并减少冗余信息。
B+树的关键特性总结
-
叶节点存储实际数据:
- 所有的实际数据都存储在叶节点中,这使得查询路径更加一致和简单。
-
内部节点仅存储引导键:
- 内部节点的键用于划分子树的范围,帮助快速定位目标数据所在的叶节点。
-
高度平衡:
- B+树的高度始终保持平衡,确保查找、插入和删除操作的时间复杂度为Ο(log 𝑁)。
-
高效的范围查询:
- 由于所有叶节点通过指针链接在一起,范围查询变得非常高效。例如,查询
[4, 9)
范围内的所有数据时,只需遍历相关的叶节点。
- 由于所有叶节点通过指针链接在一起,范围查询变得非常高效。例如,查询
-
空间利用率高:
- 每个节点可以存储多个键和子节点,减少了树的高度,从而降低了磁盘访问次数。
为什么选择B+树?
相比于普通的B树,B+树更适合数据库和文件系统等需要频繁进行范围查询和顺序访问的应用场景。以下是B+树的主要优势:
- 叶节点链式结构:支持高效的范围查询和顺序扫描。
- 内部节点优化存储:内部节点只存储键而不存储实际数据,使得每个节点可以容纳更多的键,进一步降低树的高度。
- 写入友好:新数据总是插入到叶节点中,避免了频繁更新内部节点。
3.2 B树作为嵌套数组
理解B树的一种方法是从排序数组的角度出发,尤其是通过构建多级嵌套数组来模拟B树的行为。
两层嵌套数组
对于一个简单的排序数组,更新操作的时间复杂度是Ο(𝑁)。为了优化这一点,可以将数组分割成𝑚个较小的、互不重叠的数组。这样,更新操作的时间复杂度降低为Ο(𝑁 / 𝑚)。然而,为了找到需要更新或查询的具体小数组,我们需要另一个包含对这些小数组引用的排序数组,这实际上对应于B+树中的内部节点。
例如:
[[1,2,3], [4,6], [9,11,12]]
在这个例子中,外层数组(即内部节点)包含了指向各个子数组(即叶节点)的引用。查找操作仍然可以通过两次二分查找完成,总时间复杂度为Ο(log 𝑁)。如果选择𝑚为 ( N ) (\sqrt{N}) (N),那么更新操作的时间复杂度变为 O ( N ) O(\sqrt{N}) O(N),这是两层排序数组能达到的最佳效果。
O ( N ) O(\sqrt{N}) O(N)
多层嵌套数组
尽管 O ( N ) O(\sqrt{N}) O(N)的更新成本对于数据库来说可能还是不够理想,但如果继续增加层级,通过进一步分割数组,可以进一步减少成本。具体做法如下:
- 不断地分割数组直到所有的数组大小都不超过一个常数𝑠。
- 最终得到log (𝑁 / 𝑠)层,查找的成本为Ο(log (𝑁 / 𝑠) + log (𝑠)),简化后仍然是Ο(log 𝑁)。
对于插入和删除操作,找到对应的叶节点后,更新叶节点的时间复杂度通常是常数Ο(𝑠)。剩下的挑战在于维护节点大小不超过𝑠且非空的不变性条件。
维护节点的不变性
为了确保每个节点的大小保持在𝑠以内并且不为空,需要采取一些策略来处理插入和删除操作带来的影响:
-
分裂与合并:当某个节点超过最大容量𝑠时,需要将其分裂成两个较小的节点,并将中间元素提升到父节点。相反,当删除操作导致某个节点过小时,可能需要从兄弟节点借取元素或者与兄弟节点合并。
-
平衡树结构:通过上述分裂和合并操作,确保整个树的高度保持平衡,从而保证查找、插入和删除操作的时间复杂度均为Ο(log 𝑁)。
这种多级嵌套数组的设计思想实际上揭示了B树的核心机制:通过合理组织数据结构,使得即使在大规模数据集上也能高效地进行各种操作。它不仅提高了更新效率,还保证了查找性能的一致性。这种方法为理解和实现B树提供了一个直观的视角。
维护B+树
在更新B+树时,需要维护以下三个不变性(invariants):
- 所有叶子节点具有相同的高度。
- 节点大小由一个常数限制。
- 节点不为空。
通过分割节点扩展B树
当向叶节点插入数据时,可能会违反第二个不变性(节点大小超出限制)。此时,可以通过将节点分割成更小的部分来恢复这一不变性。
例如,假设我们在叶节点L2中插入了一个新元素,导致其大小超过了限制:
Before:parent/ | \
L1 L2 L6After inserting an element into L2:parent/ | \
L1 L2 L6*
Splitting L2:
parent
/ | | \
L1 L3 L4 L6* *
分割叶节点后,其父节点会获得一个新的分支。如果这个父节点也超出了大小限制,则可能也需要进行分割。这种节点分割的过程可以一直传播到根节点,从而增加树的高度。
Before growing the tree height:root/ | \
L1 L2 L6After growing the tree height by splitting nodes:new_root/ \N1 N2/ | | \
L1 L3 L4 L6
由于所有的叶子节点同时增加了高度,因此第一个不变性得到了保持。
通过合并节点收缩B树
删除操作可能导致某些节点变为空节点,这就违反了第三个不变性(节点不能为空)。为了恢复这一不变性,可以通过将空节点与其兄弟节点合并来实现。合并是分割的逆过程,它同样可以从某个节点开始,并可能传播至根节点,导致树的高度减少。
例如,假设我们从L2中删除了一个元素,使得L2变为空节点:
Before merging:parent/ | \
L1 L2* L6Merging L2 with a sibling (e.g., L1):parent/ | \
L1' L6
在这个例子中,L2与L1进行了合并,形成了新的L1’节点。合并可以在非空节点达到下限时提前执行,以减少空间浪费。这有助于维持树结构的紧凑性并提高性能。
总结
- 扩展B树:通过分割节点来处理节点过大问题。分割操作可能会沿着树向上直至根节点,导致树的高度增加。
- 收缩B树:通过合并节点来解决节点过小或为空的问题。合并操作可能会沿树向上直至根节点,导致树的高度减少。
- 维护不变性:确保所有叶子节点的高度一致、节点大小受控且不为空。这些不变性的维护对于保证B+树的高效查询和更新至关重要。
磁盘上的B树
在内存中实现B树已经可以通过上述原则完成,但在磁盘上实现B树时需要额外考虑一些因素。
基于块的分配
一个关键细节是如何限制节点大小。对于内存中的B+树,可以通过限制节点中键的最大数量来控制节点大小,而在磁盘上的数据结构中,则没有malloc/free
或垃圾回收机制可供依赖;空间分配和重用完全取决于我们自己。
如果所有分配都是相同大小的,可以使用空闲列表来进行空间重用,这将在后续实现。目前,所有的B树节点都被设定为相同的大小。
写时复制(Copy-on-Write)B树以确保安全更新
为了使磁盘数据更新具有抗崩溃能力,我们已经了解了三种方法:重命名文件、日志记录以及LSM树。核心思想是在更新过程中不破坏任何旧数据。这个概念也可以应用于树结构:通过复制节点并在副本上进行修改。
插入或删除操作从叶节点开始;在创建带有修改的副本后,必须更新其父节点以指向新的节点,这也需要在其副本上完成。这种复制过程会传播到根节点,最终形成一个新的树根。
- 原始树保持不变,并且可以从旧根访问。
- 新根,包含一直延伸到叶节点的所有更新副本,与其他部分共享原有的子树。
d/ \b e/ \
a c更新叶节点c:D*/ \B* e/ \
a C*这里,被复制的节点用大写字母表示(D, B, C),而共享的子树用小写字母表示(a, e)。
这种方法被称为写时复制数据结构,也被描述为不可变的、仅追加的(不是字面意义上的),或者是持久化的(与耐久性无关)。需要注意的是,数据库术语并不总是有一致的意义。
写时复制B树还剩下两个问题:
- 如何找到树根,因为每次更新后它都会改变?这个问题简化为单个指针更新的问题,稍后解决。
- 如何重用来自旧版本的节点?这是空闲列表的工作。
写时复制B树的优势
保留旧版本的一个优势是自动获得了快照隔离。事务从树的一个版本开始,并不会看到其他版本的变化。崩溃恢复也变得轻松;只需使用最后一个旧版本即可。
另一个优势是它适合多读取者单一写入者的并发模型,且读者不会阻塞写入者。这些将在后面探讨。
替代方案:带双写(Double-Write)的就地更新
虽然写时复制数据结构在崩溃恢复方面很明显,但由于高写放大效应,它们可能是不可取的。每次更新都需要复制整个路径Ο(log 𝑁),而大多数就地更新只触及一个叶节点。
可以在不使用写时复制的情况下进行带崩溃恢复的就地更新:
- 在某处保存整个更新节点的副本。这类似于写时复制,但不需要复制父节点。
- 使用
fsync
保存副本。(此时可以响应客户端。) - 实际上就地更新数据结构。
- 使用
fsync
更新。
崩溃后,数据结构可能处于半更新状态,但我们无法确切知道。我们所做的是盲目应用保存的副本,这样无论当前状态如何,数据结构最终都会处于更新后的状态。
双写(double-write)在MySQL术语中指的是保存的更新副本。但如果双写本身损坏了呢?这与处理日志的方式相同:使用校验和。
- 如果校验和检测到坏的双写,忽略它。因为它发生在第一次
fsync
之前,所以主数据仍处于良好且旧的状态。 - 如果双写良好,应用它将始终产生良好的主数据。
一些数据库实际上将双写存储在日志中,称为物理日志记录。存在两种类型的日志记录:逻辑日志和物理日志。逻辑日志描述了高级别的操作,如插入键,这些操作只能在数据库处于良好状态时应用,因此只有物理日志(低级别的磁盘页面更新)对恢复有用。
崩溃恢复的原则是比较双写与写时复制:
- 双写使得更新幂等;数据库可以通过应用保存的副本来重试更新,因为它们是完整的节点。
- 写时复制原子地切换一切到新版本。
两者基于不同的理念:
- 双写确保有足够的信息生成新版本。
- 写时复制确保旧版本得以保留。
如果我们保存原始节点而不是更新节点用于双写,那就是第三种从损坏中恢复的方法,并且像写时复制一样恢复到旧版本。我们可以将这三种方式合并为一个想法:在任何时候都有足够的信息来恢复到旧状态或新状态。
此外,某些复制总是必要的,因此较大的树节点更新速度较慢。我们将使用写时复制,因为它更简单,但可以根据具体情况偏离这一做法。
代码仓库地址:database-go
相关文章:
B树的异常恢复
B-Tree & Crash Recovery B树作为平衡的n叉树 高度平衡树 许多实用的二叉树(如AVL树或红黑树)被称为高度平衡树,这意味着树的高度(从根节点到叶子节点)被限制为Ο(log 𝑁),因此查找操作的…...
Centos9 离线安装 MYSQL8
centos 9 离线安装 mysql 8 参考教程 1. 官网下载mysql 下载地址 2. 将文件传输到Centos中解压 软件全部安装到了/opt中 在opt中新建mysql目录,解压到mysql目录中 tar -xvf mysql压缩文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…...
【RabbitMQ | 第2篇】RabbitMQ 控制台实现消息路由 + 数据隔离
文章目录 同步调用和异步调用MQRabbitMQ1. RabbitMQ控制台实现交换机路由到队列1.1 创建队列1.2 将消息发送给交换机,是否会到达队列 2. RabbitMQ控制台实现数据隔离2.1 添加一个用户2.2 创建新的虚拟主机 同步调用和异步调用 同步调用是指完成一个功能,…...
算法—选择排序—js(场景:简单实现,不关心稳定性)
选择排序原理:(简单但低效) 每次从未排序部分选择最小元素,放到已排序部分的末尾。 特点: 时间复杂度:O(n) 空间复杂度:O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …...
龙舟中国行走进湖南娄底 2025湖南省龙舟联赛娄底站盛大举行
鼓声震天破碧波,百舸争流显豪情。2025年4月20日星期日,"龙舟中国行2025"首站——龙舟中国行走进湖南娄底2025湖南省龙舟联赛娄底双峰站在双峰县湄水河育才桥至风雨桥水域火热开赛。12支劲旅劈波斩浪,在青山绿水间上演传统与现代交织…...
重构之去除多余的if-else
一、提前返回(Guard Clauses) 适用场景:当 else 块仅用于处理异常或边界条件时。 优化前:if (isValid) {doSomething(); } else {return; }优化后:if (!isValid) return; // 提前处理异常,主流程保持简洁…...
【Vim】vim的简单使用
文章目录 1. vi的模式2. 按键使用说明2.1 一般命令模式光标移动替换和查找删除/复制/粘贴 2.2 编辑模式插入/替换 2.3 命令行模式保存/退出环境修改 3. vim的缓存4. vim可视区块5. vim多文件编辑6. vim多窗口功能7. vim关键词补全 1. vi的模式 一般命令模式:以vi打…...
【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析
在当今互联网技术飞速发展的时代,分布式系统的架构设计愈发复杂。消息队列作为分布式系统中重要的组件,在解耦应用、异步处理、削峰填谷等方面发挥着关键作用。RocketMQ 作为一款高性能、高可靠的分布式消息中间件,被广泛应用于各类互联网场景…...
hadoop分布式部署
1. 上传jdk和hadoop安装包到服务器 2. 解压压缩包 tar xf jdk1.8.0_112.tgz -C /usr/local/ tar xf hadoop-3.3.6.tar.gz -C /usr/local/3. 关闭防火墙 systemctl stop firewalld systemctl disable firewalld4. 修改配置文件 core-site.xml、hadoop-env.sh、yarn-env.sh、…...
C++面试题集合(附答案)
C全家桶 C基础 1. C和C有什么区别? 2. C语言的结构体和C的有什么区别? 3. C 语言的关键字 static 和 C 的关键字 static 有什么区别? 4. C 和 Java有什么核心区别? 5. C中,a和&a有什么区别? 6. …...
23种设计模式-结构型模式之装饰器模式(Java版本)
Java 装饰器模式(Decorator Pattern)详解 🎁 什么是装饰器模式? 装饰器模式是一种结构型设计模式,允许向一个对象动态添加新的功能,而不改变其结构。 🧱 你可以想象成在原有功能上“包裹”一…...
UE5的BumpOffset节点
BumpOffset 节点的基本概念 本质上,BumpOffset 节点通过扭曲或偏移纹理坐标来创造深度错觉。它基于视角方向和高度信息动态地调整纹理采样位置,使平面表面看起来具有凹凸感。这是一种称为视差映射(Parallax Mapping)的技术的实现。 当你从不同角度观察…...
从跌倒到领跑:北京亦庄机器人马拉松如何改写人机协作未来?
目录 一、当铁骨遇见马拉松精神 二、半马背后的硬核突破 三、赛事背后的科技博弈 四、当机器人走出实验室 跌倒者的荣光 清晨7:30的南海子公园,发令枪响瞬间——20台形态各异的机器人以千奇百怪的姿态冲出起跑线,有的像蹒跚学步的孩童,有的如专业运动员般矫健,更有机器…...
Internet Protocol
一、IP 1. 基本概念 IP定义:IP 是为计算机网络相互连接进行通信而设计的协议,它规定了网络设备如何标识和寻址,以及数据如何在网络中传输和路由。IP作用:主要负责在不同的网络之间转发数据包,使数据能够从源主机准确…...
Android学习之实战登录注册能力
我们可以从本地 Token 存储、时效管理、服务端通知联动、定时器优化四个维度深入展开 一、本地 Token 存储设计(基于 SharedPreferences) 1. 存储结构优化(包含时效性字段) // 定义存储类(封装SharedPreferences操作…...
【数据可视化-19】智能手机用户行为可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
基于一致性哈希算法原理和分布式系统容错机制
一、传统取模算法的局限性分析 当使用User ID取模路由时,Pod挂断会导致以下问题: 数据雪崩效应:节点失效后所有请求需要重新计算取模值,导致缓存穿透和服务震荡服务不可用窗口:节点失效期间,原本路由到该节…...
[SpringBoot-1] 概述和快速入门(使用vscode)
1 SpringBoot 概念 SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程…...
学习笔记二十——Rust trait
🧩 Rust Trait 彻底搞懂版 👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 🛠 方法: 先给“心里模型”——用生活类比把抽象概念掰开揉…...
llama factory
微调大模型可以像这样轻松… https://github.com/user-attachments/assets/e6ce34b0-52d5-4f3e-a830-592106c4c272 选择你的打开方式: 入门教程:https://zhuanlan.zhihu.com/p/695287607框架文档:https://llamafactory.readthedocs.io/zh-…...
机器学习 Day12 集成学习简单介绍
1.集成学习概述 1.1. 什么是集成学习 集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它类似于: 超级个体 vs 弱者联盟 单个复杂模型(如9次多项式函数)可能能力过强但容易过拟合 组合多个简单模型(如一堆1次函数)可以增强能力而不易过拟合 集成…...
基于 Spring Boot 瑞吉外卖系统开发(五)
基于 Spring Boot 瑞吉外卖系统开发(五) 删除分类 分类列表中每条分类信息右侧提供了一个“删除”按钮,当需要将已经存在的分类信息删除时,可以通过单击“删除”按钮实现。 请求路径为/category,携带参数id…...
PyTorch基础笔记
PyTorch张量 多维数组:张量可以是标量(0D)、向量(1D)、矩阵(2D)或更高维的数据(3D)。 数据类型:支持多种数据类型(如 float32, int64, bool 等&a…...
什么是 IDE?集成开发环境的功能与优势
原文:什么是 IDE?集成开发环境的功能与优势 | w3cschool笔记 (注意:此为科普文章,请勿标记为付费文章!且此文章并非我原创,不要标记为付费!) IDE 是什么? …...
基于大数据的房产估价解决方案
基于大数据的房产估价解决方案 一、项目背景与目标 1.1 背景 在房地产市场中,准确的房产估价至关重要。传统的房产估价方法往往依赖于估价师的经验和有限的数据样本,存在主观性强、效率低等问题。随着大数据技术的发展,大量的房产相关数据被积…...
基于深度学习的线性预测:创新应用与挑战
一、引言 1.1 研究背景 深度学习作为人工智能领域的重要分支,近年来在各个领域都取得了显著的进展。在线性预测领域,深度学习也逐渐兴起并展现出强大的潜力。传统的线性预测方法在处理复杂数据和动态变化的情况时往往存在一定的局限性。而深度学习凭借…...
WEMOS LOLIN32
ESP32是結合Wi-Fi和藍牙的32位元系統單晶片(SoC)與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板,最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…...
VSCode 扩展离线下载方法
学习自该文章,感谢作者! 2025 年 VSCode 插件离线下载攻略:官方渠道一键获取 - 知乎 获取扩展关键信息 方法一:官网获取 打开 VSCode 扩展官方网站 搜索要下载的扩展,以 CodeGeeX 为例,网址为…...
计算机视觉与深度学习 | RNN原理,公式,代码,应用
RNN(循环神经网络)详解 一、原理 RNN(Recurrent Neural Network)是一种处理序列数据的神经网络,其核心思想是通过循环连接(隐藏状态)捕捉序列中的时序信息。每个时间步的隐藏状态 ( h_t ) 不仅依赖当前输入 ( x_t ),还依赖前一时间步的隐藏状态 ( h_{t-1} ),从而实现…...
对于网络资源二级缓存的简单学习
缓存学习 前言认识缓存磁盘储存内存储存磁盘内存组合优化 具体实现WebCacheMD5签名 WebDownloadOperationWebDownloaderWebCombineOperation 总结 前言 在最近的写的仿抖音app中,遇到了当往下滑动视频后,当上方的视频进入复用池后,会自动清空…...
【计量地理学】实验六 地理属性空间插值
一、实验目的 本次实验的主要目的在于熟练掌握空间克里格法插值的理论基础,包括其核心概念和步骤,能够通过数据可视化和统计分析方法识别数据中的异常值,并且掌握数据正态性的检验方法,理解正态分布对克里格法的重要性࿰…...
26考研 | 王道 | 数据结构 | 第六章 图
第六章 图 文章目录 第六章 图6.1. 图的基本概念6.2. 图的存储6.2.1. 邻接矩阵6.2.2. 邻接表6.2.3. 十字链表、临接多重表6.2.4. 图的基本操作 6.3. 图的遍历6.3.1. 广度优先遍历6.3.2. 深度优先遍历6.3.3 图的遍历与连通性 6.4. 图的应用6.4.1. 最小生成树6.4.2. 无权图的单源…...
window.addEventListener 和 document.addEventListener
window.addEventListener 和 document.addEventListener 是 JavaScript 中绑定事件的两个常用方法,核心区别在于 绑定的对象不同,导致事件的作用范围、触发时机和适用场景不同。下面用最直白的语言和案例对比说明: 一、核心区别:…...
51单片机的原理图和PCB绘制
51单片机最小系统原理图 加了两个led灯和按键检测电路。 PCB中原件摆放位置 成品 资源链接:https://download.csdn.net/download/qq_61556106/90656365...
kotlin知识体系(五) :Android 协程全解析,从作用域到异常处理的全面指南
1. 什么是协程 协程(Coroutine)是轻量级的线程,支持挂起和恢复,从而避免阻塞线程。 2. 协程的优势 协程通过结构化并发和简洁的语法,显著提升了异步编程的效率与代码质量。 2.1 资源占用低(一个线程可运行多个协程)…...
数据通信学习笔记之OSPF其他内容3
对发送的 LSA 进行过滤 当两台路由器之间存在多条链路时,可以在某些链路上通过对发送的 LSA 进行过滤,减少不必要的重传,节省带宽资源。 通过对 OSPF 接口出方向的 LSA 进行过滤可以不向邻居发送无用的 LSA,从而减少邻居 LSDB 的…...
Kubernetes相关的名词解释API Server组件(9)
什么是API Server? API Server(kube-apiserver) 是 Kubernetes 的核心组件之一,负责管理整个集群的通信和操作入口。 API Server 的作用在整个 Kubernetes 集群的正常运作中至关重要,可以说它是整个系统的神经中枢。…...
[密码学实战]密码服务平台部署架构详解与学习路线
密码服务平台部署架构详解与学习路线 引言 在数字化转型的浪潮中,数据安全已成为企业生存的“生命线”。国密算法(SM2/SM3/SM4)作为我国自主研发的密码标准,正在政务、金融、医疗等领域加速落地。然而,构建一套高可用、高性能、合规的密码服务平台,仍需攻克架构设计、性…...
如何成为Prompt工程师:学习路径、核心技能与职业发展
一、什么是Prompt工程师? Prompt工程师是专注于通过设计、优化和调试大语言模型(LLM)的输入提示词(Prompt),以精准引导模型输出符合业务需求结果的技术人才。其核心能力在于将模糊的业务需求转化为结构化、…...
OpenCV 边缘检测(Edge Detection)cv2.Canny
OpenCV 边缘检测(Edge Detection)cv2.Canny flyfish import cv2video_path input_video.mp4 cap cv2.VideoCapture(video_path)while True:ret, frame cap.read()if not ret:break # 视频结束# 转灰度frame_gray cv2.cvtColor(frame, cv2.COLOR_B…...
【C++】win 10 / win 11:Dev-C++ 下载与安装
目录 一、Dev-C 下载 (1)sourceforge 官网下载 (2)腾讯官网下载 二、Dev-C 安装 三、Dev-C 配置 (1)配置 C11 (2)配置产生调试信息 (3)个性化配置…...
2025年MathorCup竞赛助攻资料免费分享
对于本界竞赛B题其中问题需要设计软件框架,对于该问题回答,个人认为可以在设计框架下简单的进行软件展示,下面是初步展示的结果,仅供参考 【问题四:老城区平移置换决策软件设计】规划局希望这个案例能起到示范作用&am…...
征程 6 VIO 通路断流分析
自动驾驶场景中,常见的是多路感知通路,在不考虑应用获取释放帧异常操作的前提下,一般出现帧获取异常的情况,主要原因是通路中某段断流的情况,如何去准确的定位,对大部分客户来说,依赖我司的支持…...
JavaScript 性能优化
JavaScript 性能优化是提高 Web 应用性能的关键步骤,特别是在处理大量数据、复杂计算或频繁的 DOM 操作时。以下是一些常见的 JavaScript 性能优化技巧和策略: 文章目录 @[TOC]一、代码层面优化1. **减少全局变量**2. **避免使用 `with` 语句**3. **使用局部变量**4. **减少 …...
机器学习中的“三态模型“:过拟合、欠拟合和刚刚好
文章目录 说明1. 模型表现的"三国演义"2. 可视化理解:从曲线看状态3. 诊断模型:你的模型"病"了吗?4. 学习曲线:模型的"体检报告"5. 治疗"模型病"的药方 6. 偏差-方差分解:理解…...
在FVM(有限体积法)的CFD仿真中,AI和机器学习的应用
在FVM(有限体积法)的CFD仿真中,AI和机器学习(ML)可以通过以下方式显著提高收敛速度与计算效率,具体分为六个方向: 1. 加速非线性迭代收敛 替代传统松弛方法: 使用ML模型(…...
【21天学习打卡挑战赛】如何学习WEB安全:逼自己在短时间掌握WEB安全核心内容
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
网络安全知识点3
1.AES密钥长度可以为128,192,256位,但分组长度为128位 2.DES加密算法的密钥长度为56位,三重DES的密钥长度为112位 3.主动攻击:拒绝服务攻击,分布式拒绝服务DDOS,信息篡改,资源使用,欺骗,伪装,重放,会话拦截 被动攻击:窃听,流量分析,破解弱加密的数据流 4.IPSec可对数据进行…...
力扣每日打卡16 781. 森林中的兔子(中等)
力扣 781. 森林中的兔子 中等 前言一、题目内容二、解题方法1. 哈希函数(来自评论区大佬的解题方法)2.官方题解2.1 方法一:贪心 前言 这是刷算法题的第十六天,用到的语言是JS 题目:力扣 781. 森林中的兔子 (中等) 一、…...
STM32基础教程——HEX数据包接收
前言 串口,是一种应用范围十分广泛的通信接口,串口的成本较低,容易使用,通信线路简单,可以实现两个设备之间的通信。单片机的串口可以实现单片机与单片机,单片机与电脑,单片机与其他设备的通信…...