【算法学习】——整数划分问题详解(动态规划)
🧮整数划分问题是一个较为常见的算法题,很多问题从整数划分这里出发,进行包装,形成新的题目,所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。
「整数划分」通常使用「动态规划」解决,本篇将如何使用动态规划分析和解决这个问题。
可以的话,点赞👍和收藏💌支持一下哦!
文章目录
- 1. 问题描述📝
- 2. 动态规划简述💡
- 动态规划算法的基本要素
- 2.1动态规划基本思想
- 2.2 解题步骤
- 3. 问题分析🔍
- 3.1 明确问题的最优值和最优解
- 3.2 求递归定义最优值的公式
- 分析不同规模子问题之间的关系
- 根据分析结果写动态规划求解的递推公式
- 4. 以自底向上方式计算最优值💻
- 5. 优化 📊
- 问题回顾
- 原始二维动态规划
- 优化为一维动态规划
- 优化后的递推公式
- 递推公式的推导
- 实现优化后的程序
- 优化总结
- 6. 扩展思考 🎯
- 6.1 相关问题
- 6.2 实际应用场景
- 7. 练习建议 📝
- 总结 🎉
- 🤔 思考题
1. 问题描述📝
将正整数n表示成一系列正整数之和: n = n 1 + n 2 + … + n k n=n_1+n_2+…+n_k n=n1+n2+…+nk,其中 n 1 ≥ n 2 ≥ … ≥ n k ≥ 1 , k ≥ 1 n_1 \geq n_2≥…≥n_k≥1,k≥1 n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分,求正整数n的不同划分个数。
示例
正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
2. 动态规划简述💡
在使用动态规划解题之前,先简要回顾一下。
动态规划算法适用于求解最优化问题
如何判断这个问题能使用「动态规划」解决呢? 主要看是否具有两个要素。
动态规划算法的基本要素
- 最优子结构性质
问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
- 子问题重叠性质
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
2.1动态规划基本思想
动态规划算法与分治法类似,其基本思想是:
将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
动态规划算法与分治法不同的是,经分解得到的子问题往往不是相互独立的,有大量子问题会重复出现。
为了避免重复计算,动态规划法是用一个表来存放一计算过的子问题。
2.2 解题步骤
通常按四步骤设计动态规划算法:
(1)找出最优解的性质,并刻画其结构特征;
(2)递归定义求最优值的公式; ——(最为关键)
(3)以自底向上方式计算最优值;
(4)根据计算最优值时得到的信息,构造最优解。(看题目要求,有的题目不要求构造最优解)
接下来根据动态规划的思想,进行问题分析。
3. 问题分析🔍
3.1 明确问题的最优值和最优解
根据题意可知,最优值就是不同划分的个数
3.2 求递归定义最优值的公式
分析不同规模子问题之间的关系
在正整数n的所有不同划分中,将最大加数不大于m的划分个数记作q(n,m),可以建立q(n,m)的如下递归关系:
- q ( n , 1 ) = 1 , n ≥ 1 ; q(n,1)=1,n \geq 1; q(n,1)=1,n≥1;
当最大加数m不大于1时,任何正整数n只有一种划分形式,即 n = 1 + 1 + . . . + 1 ⏞ n n=\overset{n} {\overbrace{1+1+...+1}} n=1+1+...+1 n
- q ( n , m ) = q ( n , n ) , m ≥ n ; q(n,m)=q(n,n),m \geq n; q(n,m)=q(n,n),m≥n;
最大加数实际上不能大于n。
- q ( n , n ) = 1 + q ( n , n − 1 ) ; q(n,n)=1+q(n,n-1); q(n,n)=1+q(n,n−1);
正整数n的最大加数不大于n的划分由最大加数=n的划分和最大加数≤n-1的划分组成。
- q ( n , m ) = q ( n , m − 1 ) + q ( n − m , m ) , n > m > 1 ; q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; q(n,m)=q(n,m−1)+q(n−m,m),n>m>1;
正整数n的最大加数不大于m的划分由最大加数≤m-1的划分和最大加数=m的划分组成。
理解一下:
- 最大加数=m的划分: 相当于给定了一个前提条件,即至少有一个划分成m,故先减去这个被划分走了的m,则剩下的可以再划分的大小为 “n-m”,故最终的表达式为q(n-m,m)。
- 最大加数≤m-1的划分: 上一步已经求出了最大划分为m的情况的划分数,所以接下来就只需求出 最大划分为m-1 这一情况的划分数,那么我们只需要约束最大划分数为m-1,进而得到最终的表达式为q(n,m-1)。
注:
在理解了递归关系4之后,我们再反过来分析关系3:
3.其实是4.的特殊情况,即m=n,那么
q ( n , n ) = q ( n , n − 1 ) + q ( n − n , n ) − − 式① q(n,n) = q(n, n-1) + q(n-n, n) -- 式① q(n,n)=q(n,n−1)+q(n−n,n)−−式①
= q ( n , n − 1 ) + q ( 0 , n ) − − 式② = q(n, n-1) + q(0, n) -- 式② =q(n,n−1)+q(0,n)−−式②
- 在这里我们单单从表达式上理解的话,q(0, n) 在题目中是没有意义的,因为这是一个 “正整数” 的划分问题,n=0相当于没有东西可以划分了。
- 但是从实际意义上出发进行理解,q(n-n,n)就是最大加数=n的划分,即n大的正整数需要划分成包含一个大小为n的划分组合,那不就是只有“ n=n ”这一个划分嘛。
综上,我们可以知道:q(n-n, n) = 1,从而得到前面的关系3:q(n, n-1) + q(n-n, n) = q(n, n-1) + 1,而写成式②这样反而会导致表达式失去意义。
递推公式的直观理解 🤔
让我们通过一个例子来理解:
假设n=5,m=3时:
q(5,3)可以分为两类:
不使用 3 作为加数:q(5,2)
使用至少一个 3:q(5-3,3) = q(2,2)
最终的递推公式:
q ( n , m ) = { 1 , n ≥ 1 , m = 1 q ( n , n ) , n < m 1 + q ( n , n − 1 ) , n = m q ( n , m − 1 ) + q ( n − m , m ) , n > m > 1 q(n,m)=\begin{cases} 1 & \text{, } n \geq 1,m=1 \\q(n,n) & \text{, } n < m & \\1 + q(n,n-1) & \text{, } n = m \\q(n,m-1)+q(n-m,m) & \text{, } n>m>1 \end{cases} q(n,m)=⎩ ⎨ ⎧1q(n,n)1+q(n,n−1)q(n,m−1)+q(n−m,m), n≥1,m=1, n<m, n=m, n>m>1
求正整数n的不同划分个数,即求正整数n的划分数p(n)=q(n,n)。
根据分析结果写动态规划求解的递推公式
我们使用二维数组 d p [ i ] [ j ] dp[i][j] dp[i][j],记录划分整数i
且最大划分不超过j
的最大划分个数,则递推公式为:
d p [ i ] [ j ] = { 1 , i ≥ 1 , j = 1 d p [ i ] [ i ] , i < j 1 + d p [ i − j ] [ j ] , i = j d p [ i ] [ j − 1 ] + d p [ i − j ] [ j ] , i > j > 1 dp[i][j]=\begin{cases} 1 & \text{, } i \geq 1,j=1 \\dp[i][i] & \text{, } i < j & \\1 + dp[i-j][j] & \text{, } i = j \\dp[i][j-1]+dp[i-j][j] & \text{, } i>j>1 \end{cases} dp[i][j]=⎩ ⎨ ⎧1dp[i][i]1+dp[i−j][j]dp[i][j−1]+dp[i−j][j], i≥1,j=1, i<j, i=j, i>j>1
4. 以自底向上方式计算最优值💻
基于递推关系式,用二维数组存储 d p [ i ] [ j ] dp[i][j] dp[i][j]的结果,通过填记录最优值的表求解。以下为实现步骤:
#include <stdio.h>#define MAX_N 100 // 设置最大 n 的范围// 动态规划函数:计算整数划分
int integerPartition(int n)
{int dp[MAX_N + 1][MAX_N + 1] = {0}; // 初始化动态规划数组// 初始化边界条件for (int i = 0; i <= n; i++){dp[i][1] = 1; // 最大加数m为 1 时,只有一种划分方式}for (int i = 1; i <= n; i++){for (int j = 2; j <= n; j++){if (i < j){dp[i][j] = dp[i][i]; // n < m 的情况}else if (i == j){dp[i][j] = 1 + dp[i][i - 1]; // n == m 的情况}else{dp[i][j] = dp[i][j - 1] + dp[i - j][j]; // n>m>1的情况,转移方程}}}return dp[n][n]; // 返回最终结果
}int main()
{int n;printf("请输入正整数 n:");scanf("%d", &n);int res = integerPartition(n);printf("正整数 %d 的划分数是:%d\n", n, res);return 0;
}
运行结果:
5. 优化 📊
问题回顾
我们需要计算将正整数 n n n 划分为一系列正整数之和的划分数。例如, n = 4 n = 4 n=4 的划分数为 5,划分方式为:
4
3 + 1
2 + 2
2 + 1 + 1
1 + 1 + 1 + 1
原始二维动态规划
在原始代码中,我们使用了一个二维数组 dp[i][j]
,其中:
dp[i][j]
表示将整数 i i i 划分为最大加数不超过 j j j 的划分数。
递推公式为:
- 如果 i < j i < j i<j,则
dp[i][j] = dp[i][i]
。 - 如果 i = j i = j i=j,则
dp[i][j] = 1 + dp[i][j - 1]
。 - 如果 i > j i > j i>j,则
dp[i][j] = dp[i][j - 1] + dp[i - j][j]
。
这个递推公式的核心思想是:
- 将划分分为两类:不包含 j j j 的划分 和 包含 j j j 的划分
- 不包含 j j j 的划分数是
dp[i][j - 1]
。 - 包含 j j j 的划分数是
dp[i - j][j]
。
- 不包含 j j j 的划分数是
优化为一维动态规划
我们观察到,二维数组 dp[i][j]
的更新只依赖于当前行
和上一行
的值。具体来说:
- 在计算
dp[i][j]
时,只需要dp[i][j - 1]
和dp[i - j][j]
。 - 这意味着我们可以用一维数组
dp[i]
来存储当前行的值,并通过滚动更新的方式计算。
实际上,二维动态规划的依赖关系是:
dp[i][j]
依赖于:
dp[i][j−1]
(当前行的前一个值)。dp[i−j][j]
(上一行的某个值)。
这种依赖关系并不是简单的“当前行和上一行”,而是涉及到了更复杂的跳跃依赖(因为 dp[i−j][j] 的位置与 dp[i][j] 的位置相差 j 行)。
为什么可以优化为一维数组?
尽管依赖关系复杂,但我们仍然可以优化为一维数组,原因如下:
- 滚动更新的思想:
在计算 dp[i][j] 时,我们只需要 dp[i][j−1] 和 dp[i−j][j]。
如果我们按照一定的顺序更新 dp[i],可以确保在计算 dp[i] 时,dp[i−j] 已经被正确更新。
- 枚举顺序的调整:
在优化后的代码中,我们首先枚举最大加数 j(从 1 到 n),然后枚举目标数 i(从 j 到 n)。
这种枚举顺序确保了在计算 dp[i] 时,dp[i−j] 已经被正确更新。
- 一维数组的含义:
优化后的一维数组 dp[i] 表示将整数 i 划分为一系列正整数之和的划分数。
在枚举 j 时,我们逐步更新 dp[i],使其包含所有可能的划分。
优化后的递推公式
优化后的递推公式为:
d p [ i ] = d p [ i ] + d p [ i − j ] dp[i] = dp[i] + dp[i - j] dp[i]=dp[i]+dp[i−j]
其中:
dp[i]
表示将整数 i i i 划分为一系列正整数之和的划分数。j
是当前枚举的最大加数。
递推公式的推导
-
初始化:
dp[0] = 1
,表示空划分(即不选任何数)。
-
枚举最大加数 j j j:
- 对于每个 j j j(从 1 到 n n n),我们更新
dp[i]
的值。 - 更新规则:
dp[i] += dp[i - j]
。
- 对于每个 j j j(从 1 到 n n n),我们更新
-
解释更新规则:
dp[i]
表示将 i i i划分为一系列正整数之和的划分数。dp[i - j]
表示将 i − j i - j i−j 划分为一系列正整数之和的划分数。- 当我们加上
dp[i - j]
时,实际上是在考虑所有包含 j j j 的划分。 - 例如,如果 j = 2 j = 2 j=2,那么
dp[i] += dp[i - 2]
表示将 i i i 划分为包含 2 的划分数。
-
为什么可以这样更新:
- 在原始二维动态规划中,
dp[i][j] = dp[i][j - 1] + dp[i - j][j]
。 - 优化后的一维动态规划中,
dp[i]
相当于dp[i][j]
,而dp[i - j]
相当于dp[i - j][j]
。 - 通过滚动更新,
dp[i]
的值会逐步累积,最终得到正确的结果。
- 在原始二维动态规划中,
示例演示
以 n = 4 n = 4 n=4 为例,演示优化后的动态规划过程:
-
初始化:
dp = [1, 0, 0, 0, 0]
,其中dp[0] = 1
。
-
枚举 j = 1 j = 1 j=1:
- 更新
dp[i]
的值:dp[1] += dp[0]
→dp[1] = 1
dp[2] += dp[1]
→dp[2] = 1
dp[3] += dp[2]
→dp[3] = 1
dp[4] += dp[3]
→dp[4] = 1
- 此时
dp = [1, 1, 1, 1, 1]
。
- 更新
-
枚举 j = 2 j = 2 j=2:
- 更新
dp[i]
的值:dp[2] += dp[0]
→dp[2] = 1 + 1 = 2
dp[3] += dp[1]
→dp[3] = 1 + 1 = 2
dp[4] += dp[2]
→dp[4] = 1 + 2 = 3
- 此时
dp = [1, 1, 2, 2, 3]
。
- 更新
-
枚举 j = 3 j = 3 j=3:
- 更新
dp[i]
的值:dp[3] += dp[0]
→dp[3] = 2 + 1 = 3
dp[4] += dp[1]
→dp[4] = 3 + 1 = 4
- 此时
dp = [1, 1, 2, 3, 4]
。
- 更新
-
枚举 j = 4 j = 4 j=4:
- 更新
dp[i]
的值:dp[4] += dp[0]
→dp[4] = 4 + 1 = 5
- 此时
dp = [1, 1, 2, 3, 5]
。
- 更新
最终,dp[4] = 5
,即 n = 4 n = 4 n=4 的划分数为 5。
实现优化后的程序
#include <stdio.h>#define MAX_N 100 // 设置最大 n 的范围// 动态规划函数:计算整数划分
int integerPartition(int n)
{int dp[MAX_N + 1] = {0}; // 初始化一维动态规划数组dp[0] = 1; // 初始化 dp[0] = 1,表示空划分for (int j = 1; j <= n; j++) // 枚举最大加数 j{for (int i = j; i <= n; i++) // 枚举目标数 i{dp[i] += dp[i - j]; // 转移方程:dp[i] = dp[i] + dp[i - j]}}return dp[n]; // 返回最终结果
}int main()
{int n;printf("请输入正整数 n:");scanf("%d", &n);int res = integerPartition(n);printf("正整数 %d 的划分数是:%d\n", n, res);return 0;
}
优化总结
通过分析原始二维动态规划的递推公式,我们发现:
- 只需要一维数组即可存储中间结果。
- 通过枚举最大加数 j j j 并更新
dp[i]
,可以逐步计算出划分数。
优化后的递推公式为:
d p [ i ] = d p [ i ] + d p [ i − j ] dp[i] = dp[i] + dp[i - j] dp[i]=dp[i]+dp[i−j]
这种方法不仅减少了空间复杂度,还保持了相同的时间复杂度 O ( n 2 ) O(n^2) O(n2)。
6. 扩展思考 🎯
6.1 相关问题
- 完全背包问题
- 硬币找零问题
- 数字组合问题
6.2 实际应用场景
- 财务系统中的支付方案设计
- 资源分配问题
- 任务调度优化
7. 练习建议 📝
- 先从小规模问题入手,手动推导
- 画图辅助理解状态转移
- 多关注边界条件的处理
- 尝试不同的实现方式,比较优劣
总结 🎉
整数划分问题是一个非常经典的动态规划问题,通过本文的学习,我们不仅掌握了问题的解决方法,更重要的是理解了动态规划的思维方式和优化技巧:整数划分问题通过动态规划实现,将问题分解为子问题求解。
通过学习和实现这个问题,能够深入理解动态规划的核心思想,掌握处理类似问题的技巧。✨
希望本文对你有所帮助!💖
🎉 Happy Coding!
🤔 思考题
- 如何修改代码来输出所有的划分方案?
- 如果限制划分中数字不能重复使用,应该如何修改算法?
- 如果要求划分中的数字必须是奇数,如何调整递推公式?
欢迎在评论区分享你的想法和解答!
相关文章:
【算法学习】——整数划分问题详解(动态规划)
🧮整数划分问题是一个较为常见的算法题,很多问题从整数划分这里出发,进行包装,形成新的题目,所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。 「整数划分」通常使用「动态规划」解决࿰…...
【新教程】Ubuntu 24.04 单节点安装slurm
背景 网上教程老旧,不适用。 详细步骤 1、安装slurm sudo apt install slurm-wlm slurm-wlm-doc -y检查是否安装成功: slurmd --version如果得到slurm-wlm 23.11.4,表明安装成功。 2、配置slurm。 使用命令: sudo vi /etc/s…...
window下用vim
Windows 默认不支持 vim 命令,需要手动安装后才能使用。以下是解决方案: 1. 安装 Vim 编辑器 方法 1:通过 Scoop 或 Chocolatey 安装 使用 Scoop: 安装 Scoop(如果尚未安装):iwr -useb get.sco…...
citrix netscaler13.1 重写负载均衡响应头(基础版)
在 Citrix NetScaler 13.1 中,Rewrite Actions 用于对负载均衡响应进行修改,包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成,帮助你根据需求调整请求内容。以下是三种常见的操作: 1. Replace (替换响应头)…...
使用PWM生成模式驱动BLDC三相无刷直流电机
引言 在 TI 的无刷直流 (BLDC) DRV8x 产品系列使用的栅极驱动器应用中,通常使用一些控制模式来切换MOSFET 开关的输出栅极。这些控制模式包括:1x、3x、6x 和独立脉宽调制 (PWM) 模式。 不过,DRV8x 产品系列(例如 DRV8311&…...
常见的php框架有哪几个?
一直以来,PHP作为一种广泛使用的编程语言,拥有着许多优秀的框架来帮助开发人员快速构建稳定的Web应用程序。本文降为大家介绍几种常见的PHP的主流框架,以及它们相关的特点和使用场景。如有问题,欢迎指正! 1.Laravel&a…...
机器学习(2):线性回归Python实现
1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示: y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值);X1, X2, ... Xn 是自变量(特征)β0, β1,…...
Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例
文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…...
【Unity-Animator】通过 StateMachineBehaviour 实现回调
StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…...
并行服务、远程SSH无法下载conda,报错404
原下载代码无效,报错404 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 使用下面代码下载 wget --user-agent"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12…...
cuquantum 简介
1. 关于 cuquantum 概述 官方文档: https://docs.nvidia.com/cuda/cuquantum/latest/appliance/overview.html#prerequisites NVIDIA 的 cuQuantum 是一个专门用于量子计算的高性能库,旨在加速量子电路的模拟和量子算法的执行。cuQuantum 提供了一系列…...
小程序如何引入腾讯位置服务
小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意:小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务,如果没有就在插件管理中添加插件 2.腾讯位置服务…...
【react】使用antd Table渲染数据遇到的报错问题
记录自己在开发过程中遇到的报错问题: 目录 原本写法:错误分析:解决方案: 原本写法: render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...
55_OpenResty开发入门
Nginx编程需要用到Lua语言,因此我们必须先学习Lua的基本语法。Nginx本身也是C语言开发,因此也允许基于Lua做拓展。多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 1.OpenResty概述 OpenResty是一款基于NGINX和LuaJIT的Web平台。通过Lua扩展NGINX实现的可伸…...
(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力
文章目录 1、Half Wavelet Attention2、代码实现 paper:HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code:https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...
链家房价数据爬虫和机器学习数据可视化预测
完整源码项目包获取→点击文章末尾名片!...
全网首发:编译libssh,产生类似undefined reference to `EVP_aes_256_ctr@OPENSSL_1_1_0‘的大量错误
具体错误 前面和后面的: /opt/linux/x86-arm/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: warning: libcrypto.so.1.1, needed by ../lib/libssh.so.4.10.1, not found (try using -rpath or -rpat…...
springboot 集成javaFx 两个面板之间如何进行跳转
1.创建两个面板 可参考博主的 java8 springboot 集成javaFx 实现一个客户端程序 文章来实现 2.完善代码 以下是博主创建的两个模板 博主在这里实现的是登录跳转功能,注意:这里登录按钮的触发实现方式做了以下小小的改动,也可根据自己的习惯来处理 相较第一篇文章,博主在Lo…...
vue-cli项目配置使用unocss
在了解使用了Unocss后,就完全被它迷住了。接手过的所有项目都配置使用了它,包括一些旧项目,也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的,项目是vue2vue-cli构建的,node<20平常开…...
ASP.NET Core - IStartupFilter 与 IHostingStartup
ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)
用户在前端页面登录成功后会从服务端获取Token,后续调用服务器的服务接口时都得带着Token,否则就会验证失败。之前使用postman测试的时候,获取Token后再调用其它服务都是人工将Token添加到Header中,网页中没法这么做,只…...
【Vue】let、const、var的区别、适用场景
let、const、var,有哪些区别,适用场景 var 特点: var 是 JavaScript 中最传统的变量声明方式。具有函数作用域,即在函数内声明的 var 变量,在整个函数内都可以访问。变量提升:使用 var 声明的变量会被提升…...
【llama_factory】qwen2_vl训练与批量推理
训练llama factory配置文件 文件:examples/train_lora/qwen2vl_lora_sft.yaml ### model model_name_or_path: qwen2_vl/model_72b trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_target: all### dataset dataset: ca…...
计算机视觉与深度学习:使用深度学习训练基于视觉的车辆检测器(MATLAB源码-Faster R-CNN)
在人工智能领域,计算机视觉是一个重要且充满活力的研究方向。它使计算机能够理解和分析图像和视频数据,从而做出有意义的决策。其中,目标检测是计算机视觉中的一项关键技术,它旨在识别并定位图像中的多个目标对象。车辆检测作为目标检测的一个重要应用,在自动驾驶、智能交…...
Python 扫描枪读取发票数据导入Excel
财务需要一个扫描枪扫描发票文件,并将主要信息录入Excel 的功能。 文件中sheet表的列名称,依次为:发票编号、发票编码、日期、金额、工号、扫描日期。 扫描的时候,Excel 文件需要关闭,否则会报错。 import openpyxl …...
SpringMVC复习笔记
文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步:导入依赖第二步:Controller 层开发第三步:SpringMVC 配置类配置核心组件第四步:SpringMVC 环境搭建第五步:部…...
arcgis提取不规则栅格数据的矢量边界
效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…...
【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代,零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径࿰…...
链路追踪SkyWalking
链路追踪 链路追踪作用链路追踪的关键概念链路追踪的工作原理常用链路追踪工具链路追踪的实现步骤链路追踪的典型场景 SkyWalkingSkyWalking 的主要功能SkyWalking 的架构安装 SkyWalking从 SkyWalking 的官方 GitHub 仓库 下载最新版本。配置后端存储SkyWalking使用࿰…...
linux下的线程
一、pthread 线程 线程可以说是轻量级的进程,一般是一个进程中的多个任务。 进程:系统中的最小资源分配单元 线程:系统中最小执行单元 二、线程的特征 1、共享资源 2、效率高30% 3.使用第三方库(头文件加pthread.h 编译时添加 -lpthre…...
《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析
全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业,技术革新迅猛,市场竞争激烈。《全星研发管理 APQP 软件系统》的应用,为企业带来了革命性的变化,诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…...
mysql、oracle、sqlserver的区别
一、保存数据的持久性: MySQL:是在数据库更新或者重启,则会丢失数据。 Oracle:把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复。 SqlServer:2…...
CV(10)--目标检测
前言 仅记录学习过程,有问题欢迎讨论 目标检测 object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别;输出的是分类类别label物体的外框(x, y, width, height)。 目标检测算法:…...
SQL LAST()
SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而,需要注意的是,这个函数并不是SQL标准的一部分,因此并不是所有数据库系统都支持它。具体来说,只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…...
传统以太网问题与VLAN技术详解
传统以太网的问题 广播域:在网络中能接收同一广播信息的所有设备(计算机、交换机)等的集合 说明:在一个广播域内,当一个设备发送广播帧时,该域内的所有设备都能接收到这个广播帧。工作原理:在以…...
Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的?
Java 面试题 - ArrayList 和 LinkedList 的区别,哪个集合是线程安全的? 在 Java 开发中,ArrayList和LinkedList是两个常用的集合类,它们在数据结构和性能上有诸多不同,同时线程安全性也各有特点。深入理解这些差异&am…...
flutter 安卓端打包
在 Flutter 中打包 Android 应用程序是一个相对简单的过程。你可以使用 Flutter 的命令行工具来构建并打包你的 APK 或 AAB(Android App Bundle)。以下是打包 Flutter Android 应用的步骤: 1. 安装 Flutter 环境 确保你已经安装了 Flutter SDK,并且正确配置了 Android 开…...
前端开发:CSS背景属性
1.背景颜色 background-color: [ 指定颜色 ] background-color :blue; background-color : transparent //设置背景是透明的 2.背景图片 background-image : url ( ... ) 1. url 不要遗漏 . 2. url 可以是绝对路径 , 也可以是相对路径 3. url 上可以…...
【Python通过UDP协议传输视频数据】(界面识别)
提示:界面识别项目 前言 随着网络通信技术的发展,视频数据的实时传输在各种场景中得到了广泛应用。UDP(User Datagram Protocol)作为一种无连接的协议,凭借其低延迟、高效率的特性,在实时性要求较高的视频…...
centos 8 中安装Docker
注:本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载,选择适合你们的下载即可! 1、CentOS官方下载地址:https://vault.centos.org/ 2、阿里云开源镜像站下载:centos安装包…...
leetcode hot 100 -划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 示例 1&am…...
CSS 元素的显示模式(块元素,行内元素,行内块元素)
一. 块元素(block) 又称:块级元素 特点: 1. 在页面中独占一行,不会与任何元素共用一行,是从上到下排列的。 2. 默认宽度:撑满父元素。 3. 默认高度:由内容撑开。 4. 可以通过 CSS 设…...
鸿蒙UI开发——键盘弹出避让模式设置
1、概 述 我们在鸿蒙开发时,不免会遇到用户输入场景,当用户准备输入时,会涉及到输入法的弹出,我们的界面针对输入法的弹出有两种避让模式:上抬模式、压缩模式。 下面针对输入法的两种避让模式的设置做简单介绍。 2、…...
Multi-Agent如何设计
文章小结 研究背景和目的 在单一大语言模型长期主导人工智能领域的背景下,多智能体系统在对话任务解决中逐渐崭露头角。 虽然先前的研究已经展示了多智能体系统在推理任务和创造性工作中的潜力,但对于其在对话范式方面的局限性以及单个智能体的影响&am…...
git操作(bitbucket仓库)
在代码远程版本控制和提交过程中需要经常使用git命令,熟练使用git是一个软件工程师必备的技能之一。 将主版本代码fork到自己的 bitbucket 子仓库中 克隆到本地 利用ssh链接进行克隆,将 fork 的子仓库克隆到本地。 git clone ssh://{$你fork的子bitbu…...
【MySQL | 三、 表的约束介绍】
举例表结构 字段名称字段类型是否NULL键值默认值附加信息FieldTypeNullKeyDefaultExtraidintNoUNI(唯一键)Nullauto_incrementnameverchar(10)NoPRI(主键)NullgenderenumNomanagetinyintYesNulltelphoneintYesNullhome_idintyesMUL(外键)Null 目录 举例表结构1. 空…...
音频DSP的发展历史
音频数字信号处理(DSP)的发展历史是电子技术、计算机科学和音频工程共同进步的结果。这个领域的进展不仅改变了音乐制作、音频后期制作和通信的方式,也影响了音频设备的设计和功能。以下是对音频DSP发展历史的概述: 早期概念和理论…...
学习笔记-Kotlin
准备工作 下载安装kotlin编译器,记录此笔记时的版本是v1.2.10,目前最新发布版本是v2.1.10解压下载的安装包,配置环境变量指向bin目录(官方指导). 如果不想在本地安装环境,也可以使用在线编辑器 尝试编写第一个helloWorld 新建一个名为hello.kt的文件,内容如下: f…...
linux解压命令(可整理到CSDN)
1. tar -xvf ffmpeg-7.0.2.tar.xz x:表示解压文件。 v:表示在解压过程中显示文件(verbose模式)。这个选项是可选的,加上它可以让你看到正在解压的文件列表,但如果不加也不会影响解压过程。 f:…...
Boost Asio TCP异步服务端和客户端
服务端 消息分两次发送,第一次发送head,第二次发送body。接收也是先接收head,然后通过head结构中的body长度字段再接收body。 TcpServer.h #pragma once #include <atomic> #include <vector> #include <unordered_set> #…...