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

「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)

概述

DP,即动态规划是解决最优化问题的一类算法,我们要通过将原始问题分解成规模更小的、相似的子问题,通过求解这些易求解的子问题来计算原始问题。

线性DP是一类基本DP,我们来通过它感受DP算法的奥义。


最长上升子序列(LIS)

LIS问题,即最长上升子序列问题,是指找到原始序列中最长的单调元素序列这些(这些元素在原始序列中不一定是挨在一起的)。

LeetCode 2521:

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

思路

我们来找到规模更小的子问题。

对于本题来说,什么是规模更小的子问题?

如果在故事的最后我们希望找到整个数组的LIS,不妨先找到整个数组中更小规模的上升序列

如果我们用称可能的答案为一个状态,那么我们需要两个要素来表示这个状态,一个是描述规模的范围,一个描述这一段上升序列的长度。

那我们不妨定义 int dp[N],其中dp[i] = num,表示从原始数组中以nums[i]结尾的LIS为num。

当我们未开始计算时,dp[i] = 1,因为至少nums[i]这一个元素算是一个长度为1的递增子序列。

具体的,

const int n = nums.size();    // 获取数组的长度
vector<int> dp(n, 1);         // 考虑到n是一个运行期变量,我们使用vector

现在,我们来求解dp[i] = ? 的子问题。


算法过程

每个子问题都要被求解,前提是比它小的问题被求解了,而不论大小规模,这些问题的求解过程是一样的。

 求解DP问题,这被称为状态转移,也就是我们从小规模的状态推导出大规模的状态。

对于下标i来说, dp[i] = dp[j] + 1,其中 j < i && nums[j] < nums[i],考虑到可能有多个j符合情况,我们取最大值。

从0计算到n - 1,当计算 i 时,j 一定计算过了,所以这是合理的。

直观来说,我们需要一个二重循环:

for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++)if (nums[j] < nums[i])dp[i] = max(dp[i], dp[j] + 1);}

Code

class Solution {
public:int lengthOfLIS(vector<int>& nums) {const int n = nums.size();vector<int> dp(n, 1);int ans = INT_MIN;for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++)if (nums[j] < nums[i])dp[i] = max(dp[i], dp[j] + 1);ans = max(ans, dp[i]);}return ans;}
};

这种枚举是O(n²),怎么优化呢? 

优化方案

还记得二分查找吗?

「数组」二分查找模版|二段性分析|恢复二段性 / LeetCode 35|33|81(C++)

有两件事:

  • LIS一定是单调的。
  • 子问题LIS的起点越小、差分(LIS[i] - LIS[i - 1])越小,即上升越缓,越有利于后续的元素追加到末尾。

这两件事很直观,几乎无须证明。

在遍历到i时,我们不妨记录当前LIS,然后这么做:

  • 若nums[i]可以追加,则直接追加。
  • 若nums[i]不可以追加,则二分找到LIS中当前大于nums[i]的元素,如果这个元素的上一个元素小于nums[i],则用nums[i]替换这个元素,这就使得LIS的差分减小。

二分是由LIS的单调性保证的。

Code

class Solution {
public:int lengthOfLIS(vector<int>& nums) {const int n = nums.size();vector<int> LIS(n);int len = 0;for (int i = 0; i < n; i++)if (!len || nums[i] > LIS[len - 1])LIS[len++] = nums[i];else {auto pos = upper_bound(LIS.begin(), LIS.begin() + len, nums[i]);if(pos == LIS.begin() || *prev(pos) < nums[i])*pos = nums[i];}return len;}
};  

复杂度

时间复杂度: O(nlogn) //需求解n个状态,每次求解通过二分进行。

空间复杂度: O(n)         //预留dp数组空间


编辑距离

编辑距离,也称为Levenshtein Distance,是衡量两个字符串差异的一种度量方法。它定义为将一个字符串转换成另一个字符串所需的最少编辑操作次数,包括插入、删除和替换字符。编辑距离越小,两个字符串越相似。

LeetCode 72:

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

思路

依旧要将原始问题处理成规模更小的子问题。

上一题倒是很爽,要存储两个信息,于是就用下标和值处理了,但这次我们需要三个信息,就需要二维数组了。

那我们不妨定义 `int dp[N][M]`,其中dp[i][j] = num,

表示从数组1中[1,  i]子数组与数组2中[1,  j]子数组的编辑距离为num。

做如下初始化:

for (int i = 1; i <= n; i++)dp[i][0] = i;
for (int j = 1; j <= m; j++)dp[0][j] = j;

*注意*:dp[i]对应原始的word[i - 1],我们从i = 1开始循环,即做了一格偏移,这是为了处理边界,直观来讲,可以认为dp[i]代表原始数组的前i个字符。 

解题过程

我们能想到很直观的二维循环。

有两种可能:

  • word[i] == word[j],这是好事啊,编辑距离无需增加,dp[i][j] = dp[i - 1][j - 1];
  • word[i] != word[j],dp[i][j] 至少为 dp[i - 1][j - 1],然后考虑:删除/替换/插入,这三者不过都是让二者相等的手段,我们只需要考虑之前的事,然后+1就行了。
  1. 考虑删掉word1[i - 1]/在word2[j - 1]后插入word1[i - 1],则dp[i][j] = dp[i - 1][j] + 1;
  2. 考虑删掉word2[j - 1]/在word1[i - 1]后插入word2[j - 1],则dp[i][j] = dp[i][j - 1] + 1;
  3. 考虑将word1[i - 1]替换为word2[j - 1],则dp[i][j] = dp[i - 1][j - 1] + 1;

注意这里dp[i]对应word[i - 1]。

以上三者,取最大值:

for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {dp[i][j] = dp[i - 1][j - 1];if (word1[i - 1] != word2[j - 1])dp[i][j] = min({dp[i][j], dp[i - 1][j], dp[i][j - 1]}) + 1;}

计算 i 和 j 时,i - 1 和 j - 1一定计算过了,这是合法的。

Code

class Solution {
public:int minDistance(string word1, string word2) {const int n = word1.size(), m = word2.size();vector dp(n + 1, vector(m + 1, 0));for (int i = 1; i <= n; i++)dp[i][0] = i;for (int j = 1; j <= m; j++)dp[0][j] = j;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {dp[i][j] = dp[i - 1][j - 1];if (word1[i - 1] != word2[j - 1])dp[i][j] = min({dp[i][j], dp[i - 1][j], dp[i][j - 1]}) + 1;}return dp.back().back();}
};

复杂度

时间复杂度: O(nm) //需求解n*m个状态。

空间复杂度: O(nm) //预留n*m个空间。


总结

线性dp的状态转移依靠的是非常直观的线性增长的问题规模。

dp算法都是通过求解子问题进而求解原始问题的一类算法,希望你了解线性dp这类基本dp后有所体会。

相关文章:

「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)

概述 DP&#xff0c;即动态规划是解决最优化问题的一类算法&#xff0c;我们要通过将原始问题分解成规模更小的、相似的子问题&#xff0c;通过求解这些易求解的子问题来计算原始问题。 线性DP是一类基本DP&#xff0c;我们来通过它感受DP算法的奥义。 最长上升子序列&#x…...

IP 地址和 MAC 地址是如何转换的

在计算机网络的世界里&#xff0c;IP 地址和 MAC 地址就像是网络设备的两个重要 “身份证”&#xff0c;各自承担着不同的职责。IP 地址基于网络层&#xff0c;用于在复杂的网络环境中定位设备&#xff1b;MAC 地址则是固化在网卡上的物理地址&#xff0c;是设备的硬件标识。那…...

[Unity]设置自动打包脚本

背景 我们经常会使用自动打包功能 文件名称: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…...

使用Docker部署魔豆文库:本地化搭建私有文档管理系统

文章目录 前言1.关于Moredoc2.本地部署Moredoc3.Moredoc简单使用4. 安装内网穿透5.配置Moredoc公网地址6. 配置固定公网地址 前言 电脑中文件超多的小伙伴们&#xff0c;是不是每次打开机都感觉像是打开了潘多拉魔盒&#xff1f;那些杂乱无章的文档和文件夹简直让人头大如斗&a…...

数据结构---【二叉搜索树】

必须满足的条件&#xff1a;左子树中所有节点的值< 根节点的值 < 右子树中所有节点的值 任意节点的左右子树也是搜索二叉树&#xff0c;也要满足上面的条件 二叉搜索树与堆不同&#xff0c;不一定是完全二叉树&#xff0c;采用链式结构 搜索二叉树的中序遍历是升序 1、查…...

智能检索革命全景透视——基于《搜索引擎信息检索困境破解体系》深度拆解

以下为严格遵循您要求的完整解析报告&#xff0c;全文约52000字符&#xff0c;包含7章26个子节156个量化指标&#xff1a; 智能检索革命全景透视——基于《搜索引擎信息检索困境破解体系》深度拆解 第一章 行业格局解码&#xff08;2987字&#xff09; 1.1 用户画像三维透视…...

STM32printf重定向到串口含armcc和gcc两种方案

STM32串口重定向&#xff1a;MDK与GCC环境下需重写的函数差异 在嵌入式开发中&#xff0c;尤其是使用 STM32系列微控制器 的项目中&#xff0c;调试信息的输出是不可或缺的一部分。为了方便调试&#xff0c;开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …...

蓝桥杯 序列计数

序列计数 原题目链接 题目描述 小明想知道&#xff0c;满足以下条件的正整数序列的数量&#xff1a; 第一项为 n&#xff1b;第二项不超过 n&#xff1b;从第三项开始&#xff0c;每一项小于前两项的差的绝对值。 请计算&#xff0c;对于给定的 n&#xff0c;有多少种满足…...

CSS常用属性_(进阶)

目录 1.尺寸单位与颜色 &#xff08;1&#xff09;尺寸 &#xff08;2&#xff09;颜色 常用2种 &#xff08;3&#xff09;颜色属性值&#xff08;透明度&#xff09; 例如&#xff1a; 2.字体属性font 例如&#xff1a; **顺序 3.文本属性 ​编辑例如&#xff1a; …...

模拟频谱分析仪(Linux c++ Qt)

此Demo由三个小项目组成,分布是模拟的硬件采集频谱数据端,后台处理端以及qt前端,于Linux系统下进行开发,使用的软件为clion和QtCreator,编程语言为c,使用了linux下的boost库(1.72),多线程和TCP,UDP以及c的一些新特性,为本人自己想的练手的小项目. 1.项目架构 整体设计采集端不…...

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…...

NLP 分词技术学习

文章目录 分词1. 分词方法2. 分词工具3. 分词难点 分词 分词是将连续的中文字符串序列切分成有意义的词语序列的过程&#xff0c;是 NLP 的基础任务之一。需要掌握以下内容&#xff1a; 1. 分词方法 基于规则/词典的方法&#xff08;字符串匹配&#xff09;&#xff1a; 正向…...

大模型——使用 StarRocks 作为向量数据库

大模型——使用 StarRocks 作为向量数据库 本章节介绍了 StarRocks,这是一款高性能的分析数据库,并演示了如何将其用作向量数据库。内容涵盖了设置、文档加载、标记化、创建向量数据库实例以及构建一个能够检索的问答系统。 StarRocks StarRocks 是一个次世代的亚秒级 MPP…...

涨薪技术|0到1学会性能测试第44课-apachetop模块监控

前面的推文我们认识了apache目录结构与配置知识&#xff0c;今天我们继续来看下apache监控技术&#xff0c;究竟是怎么做性能监控???后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法&#xff1a; 一是&…...

MySQL 基本查询(一)

文章目录 Create(insert)指定列的单行插入和全列插入多行全列插入和指定列的多行插入如果主键存在&#xff0c;要插入替换存在的值replace 基本select全列查询指定列查询where子句where子句案例语文成绩在 [80, 90] 分的同学及语文成绩数学成绩是 58 或者 59 或者 98 或者 99 分…...

Chrome 136 H265 WebRTC 支持 正式版本已包含

时间过的真快&#xff0c;去年8月份写过一篇文章介绍如何加参数方式启动Chrome H265 硬件解码器&#xff0c; 现在的136版本已经包含在内&#xff0c;至此WebRTC已经完整包含了H264和H265解码器&#xff0c;这个事情应该从2015年开始&#xff0c;Google强推VP9 AV1&#xff0c…...

涨薪技术|0到1学会性能测试第43课-apache status模块监控

前面的推文我们认识了apache目录结构与配置知识,今天我们继续来看下apache监控技术,究竟是怎么做性能监控的。后续文章都会系统分享干货,带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法: 一是:使用apache自带的status监控模块进行监控; 二是…...

一、Javaweb是什么?

1.1 客户端与服务端 客户端 &#xff1a;用于与用户进行交互&#xff0c;接受用户的输入或操作&#xff0c;且展示服务器端的数据以及向服务器传递数据。 例如&#xff1a;手机app&#xff0c;微信小程序、浏览器… 服务端 &#xff1a;与客户端进行交互&#xff0c;接受客户…...

研发效率破局之道阅读总结(4)个人效率

研发效率破局之道阅读总结(4)个人效率 Author: Once Day Date: 2025年4月30日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

word模板填充导出-(支持word导出、pdf导出)

word模板填充转pdf导出处理 关于word模板填充示例java根据word模板填充数据并导出-五官一体即忢 相关依赖插件【LibreOffice】 安装 LibreOffice&#xff1a;从LibreOffice 官方网站下载并安装适合 Windows 系统或者Linux系统的版本 启动 LibreOffice 服务&#xff1a;打开…...

【Kubernets知识】Secret组件更新大全

文章目录 Kubernetes Secret 更新机制详解及场景指南一、直接替换式更新&#xff08;全量覆盖&#xff09;操作命令特点适用场景风险提示 二、JSON Patch 精准更新操作命令特点适用场景示例流程 三、Strategic Merge Patch&#xff08;策略合并&#xff09;操作命令特点适用场景…...

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…...

MySQL RR (Repeatable Read) 隔离级别规则细节

准备 测试表&#xff1a; CREATE TABLE transaction_test (id int,value int,mtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id) ) ENGINE InnoDB;mysql设置&#xff1a; transaction_isolation REPEATABLE-READ auto…...

iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录

iOS HTTPS 抓包踩坑记&#xff1a;几种方案尝试与替代工具记录 最近负责一个 iOS App 的调试任务&#xff0c;遇到了 HTTPS 接口抓包难题&#xff0c;顺手做个记录&#xff0c;顺带分享一些试过的工具和方案。 背景 这个 App 启用了 HTTPS 双向认证和证书 pinning&#xff0…...

第十一节:Shell脚本编程

理论知识 Shell 脚本的基本概念&#xff1a;Shell 脚本是一种为 shell 编写的脚本程序&#xff0c;它可以将一系列的命令组合在一起&#xff0c;实现自动化任务。Shell 脚本通常以 .sh 为扩展名。Shell 脚本的执行方式&#xff1a;可以将 Shell 脚本作为可执行程序执行&#x…...

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字&#xff0c;要想体验图片聊天&#xff0c;需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…...

Learning vtkjs之OutlineFilter

过滤器 外轮廓包围盒生成 介绍 vtkOutlineFilter - 一个为较大单元生成三角形的过滤器 vtkOutlineFilter 是一个将具有三个以上点的单元转换为三角形的过滤器。 感觉就是一个包围盒生成的算法&#xff0c;而且试用下来&#xff0c;只能支持一个InputConnection 效果 核心逻…...

腾讯云CodeBuddy初体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”&#xff1b; 最近AI编程很火&#xff0c;据说我司程序员现在每天可以准点下班&#xff0c;AI起到了很大的作…...

加速LLM大模型推理,KV缓存技术详解与PyTorch实现

随着大型语言模型(LLM)规模和复杂度的指数级增长&#xff0c;推理效率已成为人工智能领域亟待解决的关键挑战。当前&#xff0c;GPT-4、Claude 3和Llama 3等大模型虽然表现出强大的理解与生成能力&#xff0c;但其自回归解码过程中的计算冗余问题依然显著制约着实际应用场景中的…...

江西省电价新政发布!微电网源网荷储充一体化平台重塑企业能源格局!

一. 江西省发改委发布发布 4月25日&#xff0c;江西省发改委发布关于公开征求《关于进一步完善分时电价机制有关事项的通知&#xff08;征求意见稿&#xff09;》意见的公告。征求意见提出&#xff1a; 江西省&#xff1a;中午3小时谷段电价&#xff0c;电价下浮60%~70% 除1…...

深夜突发:OpenAI紧急修复GPT-4o“献媚”问题

凌晨三点&#xff0c;OpenAI首席执行官Sam Altman发布官方声明&#xff0c;宣布针对GPT-4o的“献媚”问题展开紧急修复。这场突如其来的技术风波&#xff0c;源于近期大量用户对模型行为模式的不满。许多用户发现&#xff0c;当他们向GPT-4o提出类似“你觉得我怎么样”或“如果…...

Webpack 和 Vite 中静态资源动态加载的实现原理与方法详解

静态资源动态加载 需求背景&#xff1a;现在需要加载指定文件夹下的对应图片&#xff0c;需要根据用户选的参数自动加载对应图片 一、前言&#xff1a;模块化开发的演进需求 在现代前端工程中&#xff0c;随着SPA应用复杂度的提升&#xff0c;静态资源动态加载已成为优化首屏性…...

SMMU相关知识

1. 使用smmu的作用 支持具有DMA能力设备的虚拟化实现解决32位系统访问超过4G空间的地址解决系统动态分配大块连续内存 2. 为什么需要使用2级页表 SMMU&#xff08;系统内存管理单元&#xff09;采用二级页表架构的核心原因可归结为地址空间管理效率、内存资源优化以及虚拟化…...

2025年数字创意设计与图像处理国际会议 (DCDIP 2025)

2025 International Conference on Digital Creative Design and Image Processing 【一】、大会信息 会议简称&#xff1a;DCDIP 2025 大会地点&#xff1a;中国济南 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二…...

39.RocketMQ高性能核心原理与源码架构剖析

1. 源码环境搭建 1.1 主要功能模块 ​ RocketMQ的官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ​ RocketMQ的官方网站上下载指定版…...

SVTAV1 编码函数 svt_aom_is_pic_skipped

一 函数解释 1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。 具体分析如下 函数逻辑 参数说明&#xff1a;函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息&#xff0c;用于判断是否跳…...

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …...

WebRtc09:网络基础P2P/STUN/TURN/ICE

网络传输基本知识 NATSTUN&#xff08;Session Traversal Utilities for NAT&#xff09;TURNICE NAT 产生的原因 IPV4地址不够出于网络安全的原因 NAT种类 完全锥型NAT(Full Cone NAT)地址限制型NAT(Address Restricted Cone NAT)端口限制型NAT(Port Restricted Cone NAT…...

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 &#xff1a; 知道对端的端口号和IP可以直接传输&#xff0c;不需要建立连接 2..不可靠&#xff1a;没有确认机制&#xff0c;没有重传机制&#xff0c;不知道数据包能否能正确到达对端&#xff0…...

windows 下 oracle 数据库的备份与还原

1、备份 创建备份出来的文件存放的位置。 创建目录对象&#xff0c;在数据库中创建一个目录对象&#xff0c;该对象指向文件系统中用于存储导出文件的实际目录&#xff08; sql 命令&#xff0c;可以在 plsql 中执行&#xff09;。 -- 创建目录对象&#xff0c;\D:\Oracle19c\…...

LeetCode41☞缺失的第一个正数

关联LeetCode题号41 本题特点 数组&#xff0c;哈希表 本题思路 找缺失的最小正数&#xff0c;看举例说明缺失的正数&#xff0c;一种情况是连续的最小的正数&#xff0c;一种是缺失连续但不是最小的正数验证数组内数组是否连续&#xff0c;可以通过 nums[i]1 是否存nums组…...

毕业论文 | 基于STM32的自动烟雾报警系统设计

基于STM32的烟雾报警系统 一、系统设计原理1. **系统架构**2. **工作原理**二、核心公式与算法1. **MQ-2传感器浓度计算**2. **温度传感器数据处理**3. **校准与滤波**三、关键代码实现1. **ADC初始化与数据读取(以MQ-2为例)**2. **报警逻辑与阈值设置**3. **EEPROM存储阈值*…...

iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)

iOS 性能调优实战&#xff1a;三款工具横向对比实测&#xff08;含 Instruments、KeyMob、Xlog&#xff09; 在日常 iOS 开发中&#xff0c;性能问题往往是最难排查、最影响体验的部分。无论是 CPU 峰值、内存飙升&#xff0c;还是偶发卡顿、异常崩溃&#xff0c;背后都隐藏着…...

flutter 专题 五十八 关于Flutter提示Your Xcode project requires migration的错误

最近&#xff0c;升级了Flutter后&#xff0c;运行之前的项目报了一个如下的错误&#xff1a; Your Xcode project requires migration. See https://flutter.dev/docs/development/ios-project-migration for details. Error launching application on iPhone 11 Pro.想到之前…...

【c++】【STL】list详解

目录 list的作用list的接口构造函数赋值运算符重载迭代器相关sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse关系运算符重载&#xff08;非成员函数&#xff09; list的模拟实现结点类迭…...

redis 数据类型新手练习系列——List类型

redis 数据类型 Redis 主要支持以下几种数据类型&#xff1a; &#xff08;1&#xff09;string&#xff08;字符串&#xff09;: 基本的数据存储单元&#xff0c;可以存储字符串、整数或者浮点数。 &#xff08;2&#xff09;hash&#xff08;哈希&#xff09;:一个键值对集…...

文章记单词 | 第52篇(六级)

一&#xff0c;单词释义 grasp&#xff1a;英 [ɡrɑːsp] 美 [ɡrsp]&#xff0c;v. 抓住&#xff1b;紧握&#xff1b;理解&#xff1b;领会&#xff1b;n. 紧握&#xff1b;控制&#xff1b;理解glue&#xff1a;英 [ɡluː] 美 [ɡluː]&#xff0c;n. 胶水&#xff1b;胶…...

【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 kotori和气球(排列)走迷宫(BFS最短路)主持人调度&#xff08;二&#xff09;(贪心优先级队列) kotori和气球(排列) kotori和…...

Mysql数据库高可用解决方案-Mysql Router

目录 一.MySQL Router介绍 1. 什么是 MySQL Router&#xff1f; 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心组件 5. MySQL Router 的部署和配置 6. MySQL Router 的优势 7. 注意事项 8. MySQL Router 与其他工具的对比 9. 总结 …...

windows系统 压力测试技术

一、CPU压测模拟 工具&#xff1a;CpuStres v2.0 官网&#xff1a;https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能&#xff1a;是一个工具类&#xff0c;用来模拟在一个进程中启动最多64个线程&#xff0c;且可以独立控制任何一个线程的启动/暂停、…...