算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)
文章目录
- 前言
- 一、背包问题溯源(动态规划)
- 1.1 动态规划的概念
- 1.2 动态规划的基本步骤
- 1.3 动态规划的实际应用
- 二、背包问题
- 2.1 背包问题衍生
- 2.2 0-1背包
- 2.2.1 0-1背包描述
- 2.2.2 0-1背包图解
- 2.2.3 0-1背包代码刨析
- 2.3 完全背包
- 2.3.1 完全背包描述
- 2.3.2 完全背包图解
- 2.3.3 完全背包代码刨析
- 2.4 0-1背包&完全背包
- 2.4.1 0-1背包&完全背包表格PK
- 2.4.2 0-1背包&完全背包使用场景
- 三、背包问题总结
- 献给读者
福利福利💌💌💌免费的JAVA学习资料网盘地址: 👉👉👉 点我!
前言
背包问题:优化之旅的起点
在计算机科学和运筹学领域,有一个问题如同璀璨的明珠般闪耀,它就是背包问题(Knapsack Problem)。无论你是初入算法世界的探索者,还是经验丰富的技术专家,背包问题都以其独特的魅力和广泛的应用场景,成为了一个不可忽视的研究主题。从资源分配到投资决策,再到货物装载方案设计,背包问题无处不在,它是解决实际问题的一个缩影。
本博客系列将深入探讨背包问题的各种变体,包括但不限于0-1背包、完全背包以及多重背包问题。我们将从基础理论出发,逐步揭开这些问题背后的数学原理,探究其复杂性,并展示如何运用动态规划、贪心算法等经典策略来寻找有效的解决方案。此外,我们还将通过具体的编程实例,使用如Java、Python等语言,帮助你更直观地理解这些算法的工作机制。
在这个过程中,我们不仅会讨论如何解决问题,还会分析不同方法之间的优缺点,以及它们在实际应用中的表现。希望这个系列能够为你提供宝贵的见解,并激发你在自己的项目中创造性地应用所学知识。
让我们一起踏上这段充满挑战与发现的优化之旅,解锁背包问题背后隐藏的无限可能吧!
一、背包问题溯源(动态规划)
背包问题的起源于动态规划,关于动态规划大家都已经不陌生了,利用动态方程状态转移的思想处理问题。下面会从多个方面介绍动态规划,达到’无孔不入’的境界。
1.1 动态规划的概念
动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。它在解决优化问题方面非常有效,尤其是在问题具有重叠子问题和最优子结构性质时。以下是动态规划的一些关键概念:
- 重叠子问题:子问题重复出现多次。为了提高效率,我们可以将每个子问题的答案存储起来,这样每次遇到同样的子问题时可以直接使用之前计算的结果,而不是重新计算。
- 最优子结构:一个问题的最优解可以从其子问题的最优解构建而来。这意味着我们可以通过解决小规模的问题来构建大规模问题的解决方案。
- 无后效性:一旦某个子问题的解确定了,就不会受到后续决策的影响。也就是说,某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响。
1.2 动态规划的基本步骤
- 定义状态:明确问题中的变量以及这些变量之间的关系。
- 建立状态转移方程:找出状态之间是如何转换的,即如何从一个或多个已知状态推导出未知状态。
- 设定初始条件和边界条件:考虑最小可能输入的情况,并设置相应的初始值。
- 选择计算顺序:决定是使用自底向上还是自顶向下的方法进行计算。自底向上通常涉及到填表,而自顶向下则通常是递归加上记忆化搜索。
1.3 动态规划的实际应用
应用实例
动态规划广泛应用于许多领域,如计算机科学、数学、经济学、生物信息学等。常见的应用包括但不限于:
- 最短路径算法(例如Floyd-Warshall算法)
- 背包问题
- 字符串匹配问题
- 矩阵链乘法
💡贴士:动态规划的关键在于识别出可以被分解成更小问题的模式,并有效地利用已经解决的子问题答案来构造最终解。通过这种方式,即使面对原本看起来很复杂的任务,也能找到高效的解决方案。
二、背包问题
2.1 背包问题衍生
背包问题(Knapsack Problem
)是组合优化中的一个经典问题,它涉及到在一定的约束条件下选择物品以达到某种最优化目标。这个问题有多种变体,但最常见的形式是如何在限制重量的前提下最大化背包中物品的总价值。
背包问题(Knapsack Problem)是动态规划领域中一个非常经典的问题,它描述了在有限的资源限制下如何最大化收益的情形。根据具体条件的不同,背包问题可以分为多种类型,包括0-1背包问题、完全背包问题、多重背包问题等。以下是几种主要的背包问题及其衍生:
- 0-1 背包问题
这是最基本的形式,每个物品只有一个,并且对于每个物品你只能选择要么放入背包(1),要么不放(0)。目标是在不超过背包容量的前提下,使所选物品的总价值最大。
- 解决方法:动态规划是一种常用的解决方法,通过构建一个二维数组来记录在不同容量和不同物品数量下能达到的最大价值。
- 完全背包问题
在这种变体中,每种类型的物品都有无限个,即可以选取同一种物品多次。目标同样是在不超过背包容量的情况下最大化背包内物品的总价值。
- 解决方法:与0-1背包类似,但需要对每种物品进行多次尝试,考虑其重复添加的可能性。
- 多重背包问题
多重背包问题是0-1背包的一个扩展,其中每个物品的数量有限。也就是说,对于每种物品,你可以选择放入背包一定次数(可能是0次、1次或更多,但不是无限次)。
- 解决方法:可以通过将多重背包转换为0-1背包问题处理,即将每种物品根据其可选次数拆分成多个独立的物品;或者使用更高级的动态规划技巧直接解决。
- 分数背包问题
在分数背包问题中,物品是可以被分割的,这意味着你可以取某个物品的一部分放入背包。这通常使得问题变得相对简单,因为可以通过贪心算法有效地解决——优先选择单位重量价值最高的物品。
- 解决方法:首先计算每个物品的单位重量价值,然后按照这个值从高到低排序,尽可能多地放入单位重量价值最高的物品直到背包满为止。
💡贴士:这些背包问题及其衍生问题广泛应用于资源分配、投资决策等领域,它们展示了如何在有限资源的情况下做出最优决策。理解和掌握这些问题的解法有助于解决实际生活中的许多优化问题。
2.2 0-1背包
2.2.1 0-1背包描述
💡贴士:因为公式在文章中不好展示,直接文档截图分析。
2.2.2 0-1背包图解
图解法可以帮助我们更直观地理解0-1背包问题解决过程。
0-1 背包问题
假设我们有3个物品,其重量分别为2, 3, 4,价值分别为3, 4, 5,背包的最大承重为5。我们可以用一个二维表格来表示不同容量下,考虑前i个物品时可以获得的最大价值。
在这个表中,行代表考虑前i个物品,列代表当前背包的容量。例如,dp[2][3] = 4意味着考虑前2个物品且背包容量为3时,最大可以得到的价值是4。
当考虑是否放入第i个物品时,如果该物品的重量大于当前容量,则不能放入,此时最大价值等于不放入该物品时的最大价值(即dp[i-1][j])。
如果可以放入,则需要比较放入与不放入两种情况下的最大价值,并选择较大的那个。
💡贴士:通过二维表,每一格表示在特定背包容量下考虑一定数量的物品所能达到的最大价值。关键在于决定是否将当前物品加入背包,这取决于加入后的总价值是否超过不加入的情况。
2.2.3 0-1背包代码刨析
public class ZeroOneKnapsack {// 主函数,计算给定物品重量、价值以及背包容量下的最大价值public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length; // 获取物品数量// 创建二维数组dp,其中dp[i][j]表示前i个物品在容量为j时的最大价值int[][] dp = new int[n + 1][capacity + 1];// 遍历每一个物品for (int i = 1; i <= n; i++) {// 对于每一个可能的背包容量for (int w = 1; w <= capacity; w++) {// 如果当前物品可以放入背包(即当前物品重量小于等于当前背包容量)if (weights[i - 1] <= w) {// 计算是否放入该物品的价值,并取两者中的较大值dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1]);} else {// 如果当前物品无法放入,则不改变最大价值dp[i][w] = dp[i - 1][w];}}}// 返回考虑所有物品且背包容量为capacity时的最大价值return dp[n][capacity];}public static void main(String[] args) {// 物品的重量数组int[] weights = {2, 3, 4, 5};// 物品的价值数组int[] values = {3, 4, 5, 6};// 背包的最大承重能力int capacity = 5;System.out.println("Maximum value in Knapsack = " + knapsack(weights, values, capacity));}
}
2.3 完全背包
2.3.1 完全背包描述
💡贴士:因为公式在文章中不好展示,直接文档截图分析。
2.3.2 完全背包图解
对于完全背包问题,我们依然使用上述的例子,但这次每种物品可以选择多次。同样,我们可以用一个表格来展示这个过程,但由于每个物品可以选择多次,因此状态转移方式有所不同。
在完全背包问题中,当我们考虑某个物品时,我们需要从小到大遍历背包容量,这样就可以确保同一个物品被多次考虑。例如,在处理第一个物品时,当背包容量为4时,我们可以选择放入两个重量为2的物品,从而获得价值为6的结果。
💡贴士:完全背包问题:虽然也可以用类似的表格表示,但处理方式上有所区别,主要是因为允许重复选择物品。遍历时从当前物品的重量开始,逐步增加背包容量,以便能够多次选择同一个物品。
2.3.3 完全背包代码刨析
public class CompleteKnapsack {// 主函数,计算给定物品重量、价值以及背包容量下的最大价值(允许重复选择物品)public static int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length; // 获取物品数量// 使用一维数组来保存状态,优化空间复杂度int[] dp = new int[capacity + 1];// 遍历每一个物品for (int i = 0; i < n; i++) {// 对于每一个可能的背包容量(从当前物品重量开始遍历)for (int w = weights[i]; w <= capacity; w++) {// 更新当前容量下能获得的最大价值dp[w] = Math.max(dp[w], dp[w - weights[i]] + values[i]);}}// 返回背包容量为capacity时的最大价值return dp[capacity];}public static void main(String[] args) {// 物品的重量数组int[] weights = {2, 3, 4, 5};// 物品的价值数组int[] values = {3, 4, 5, 6};// 背包的最大承重能力int capacity = 5;System.out.println("Maximum value in Knapsack = " + knapsack(weights, values, capacity));}
}
2.4 0-1背包&完全背包
2.4.1 0-1背包&完全背包表格PK
特性/维度 | 0-1 背包问题 | 完全背包问题 |
---|---|---|
物品选择次数 | 每种物品最多只能选择一次(拿或不拿) | 每种物品可以选择无限次(只要不超过背包容量) |
状态转移方程 | dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) 对于所有 j >= w[i] | dp[j] = max(dp[j], dp[j-w[i]] + v[i]) 需要从小到大遍历背包容量 |
空间优化 | 可以使用二维数组,也可以通过滚动数组优化为一维数组 | 通常直接采用一维数组进行优化,简化空间复杂度 |
遍历顺序 | 对于每个物品,从后向前遍历背包容量,避免覆盖尚未使用的旧值 | 对于每个物品,从前向后遍历背包容量,确保可以多次选择同一个物品 |
适用场景示例 | 如有限数量的资源分配、投资组合优化等 | 如生产计划安排、资源无限供应下的最佳分配方案等 |
算法实现复杂度 | 时间复杂度:O(nW),空间复杂度:可优化至O(W) | 时间复杂度:O(nW),空间复杂度:同样可优化至O(W) |
2.4.2 0-1背包&完全背包使用场景
0-1背包问题和完全背包问题都是经典的背包问题变种,它们的主要区别在于每种物品可以被选择的次数以及如何处理这种选择。以下是这两种问题的具体区别:
0-1背包问题
定义:
在0-1背包问题中,对于每个物品,你只能选择要么拿(1),要么不拿(0)。换句话说,每种物品你只能选择一次或完全不选择。
解决思路:
使用动态规划的方法来解决问题。
创建一个二维数组dp[i][j],其中i表示考虑前i个物品,j表示当前背包的承重能力。
状态转移方程为:如果第i个物品不放入背包,则dp[i][j] = dp[i-1][j];如果放入,则dp[i][j] = dp[i-1][j-w[i]] + v[i](前提是j >= w[i])。
最终答案是dp[n][W],其中n是物品总数,W是背包的最大承重能力。
特点:
每个物品最多只能选择一次。
需要仔细考虑是否将某个特定物品放入背包以达到最优解。
完全背包问题
定义:
在完全背包问题中,与0-1背包不同的是,这里的每种物品都有无限件可用。也就是说,同一个物品可以选择多次放入背包。
解决思路:
同样使用动态规划方法,但状态转移的方式略有不同。
对于每个物品,不是简单地决定放还是不放,而是需要考虑放多少个该物品能带来最大的价值。
可以通过调整遍历顺序(从小到大遍历背包容量)来实现对同一物品的重复选择。
状态转移方程简化为一维数组形式:dp[j] = max(dp[j], dp[j-w[i]] + v[i]),这里遍历背包容量j时应从小到大遍历,以确保每种物品可以被多次选择。
特点:
每个物品可以选择任意次(只要不超过背包的承重限制)。
由于物品可以重复选择,因此算法需要特别注意如何有效地处理这种重复选择的可能性,通常通过改变遍历顺序来实现。
💡贴士:两者主要的区别在于物品的选择次数上:0-1背包问题限制每种物品只能选择一次,而完全背包问题允许每种物品选择无数次。此外,在具体实现上,0-1背包问题通常从后向前遍历容量以避免覆盖尚未使用的旧值,而完全背包问题则从前向后遍历,以便充分利用已更新的数据。
三、背包问题总结
特性/维度 | 0-1 背包问题 | 完全背包问题 | 多重背包问题 |
---|---|---|---|
物品选择次数 | 每种物品最多只能选择一次 | 每种物品可以选择无限次 | 每种物品可以选择有限次(给定具体数量) |
状态转移方程 | dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) | dp[j] = max(dp[j], dp[j-w[i]] + v[i]) 遍历顺序从前向后 | 使用二进制优化或直接扩展为多个相同物品处理 |
空间优化 | 可以使用二维数组,也可以通过滚动数组优化为一维数组 | 通常采用一维数组进行优化 | 同样可以采用一维数组进行优化 |
遍历顺序 | 对于每个物品,从后向前遍历背包容量 | 对于每个物品,从前向后遍历背包容量 | 依据具体实现,可能需要结合0-1背包或完全背包的遍历策略 |
适用场景示例 | 如有限数量的资源分配、投资组合优化等 | 如生产计划安排、资源无限供应下的最佳分配方案 | 当物品的数量有限且各不相同时的应用场景 |
算法实现复杂度 | 时间复杂度:O(nW),空间复杂度:可优化至O(W) | 时间复杂度:O(nW),空间复杂度:同样可优化至O(W) | 时间复杂度取决于具体实现,最坏情况下为O(nWm),其中m是物品的最大重复数 |
解决方法 | 动态规划 | 动态规划 | 动态规划,但需要额外处理物品数量限制 |
特殊技巧 | - | 利用遍历顺序从小到大来允许同一物品被多次选择 | 使用二进制拆分法将物品数量转化为多个0-1背包问题 |
示例输入 | 物品数量n=3, 重量=[2, 3, 4], 价值=[3, 4, 5], 背包容量W=5 | 同上 | 物品数量n=3, 重量=[2, 3, 4], 价值=[3, 4, 5], 数量=[1, 2, 1], 背包容量W=5 |
输出解释 | 最大价值 | 最大价值 | 最大价值 |
实际应用 | 投资决策、资源分配 | 生产计划、库存管理 | 库存管理、采购决策 |
解释:
- 👉物品选择次数:指每种物品在背包中能被选择的次数。
- 👉状态转移方程:描述了如何根据之前的状态计算当前状态的最大价值。
- 👉空间优化:展示了如何减少算法所需的空间复杂度。
- 👉遍历顺序:说明了在动态规划过程中如何遍历物品和背包容量以达到正确的结果。
- 👉适用场景示例:提供了几种典型的应用场景,帮助理解不同类型背包问题的实际用途。
- 👉算法实现复杂度:列出了时间复杂度和空间复杂度,这对于评估算法效率至关重要。
- 👉解决方法:简要介绍了每种背包问题的基本解决策略。
- 👉特殊技巧:列举了一些特定于该类型背包问题的技巧或注意事项。
- 👉示例输入:提供了一个具体的例子作为参考。
- 👉输出解释:解释了算法最终输出的结果代表的意义。
- 👉实际应用:进一步拓展了理论知识到现实世界中的应用场景。
献给读者
💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。
🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。
亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌
相关文章:
算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)
文章目录 前言一、背包问题溯源(动态规划)1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…...
蓝桥杯—迷宫(bfs)
一.题目 分析:最短路径问题,给定一个迷宫,从左上角走到右下角,要求路径最短,并且要求字典序最小,也就是按照D,L,R,U,的搜索顺序去搜索,否则路径不是唯一的&am…...
【Android】安卓 Java下载ZIP文件并解压(笔记)
写在前面的话 在这篇文章中,我们将详细讲解如何在 Android 中通过 Java 下载 ZIP 文件并解压,同时处理下载进度、错误处理以及优化方案。 以下正文 1.权限配置 在 AndroidManifest.xml 中,我们需要添加相应的权限来确保应用能够访问网络和设…...
清晰易懂的 PHP 安装与配置教程
初学者也能看懂的 PHP 安装与配置教程 本教程将手把手教你如何在 Windows 系统上安装 PHP,并配置 Composer(PHP 的依赖管理工具)的缓存位置,即使你是零基础小白,也能轻松完成! 一、准备工作 操作系统&…...
Ceph集群2025(Squid版)快速对接K8S cephFS文件存储
ceph的块存储太简单了。所以不做演示 查看集群 创建一个 CephFS 文件系统 # ceph fs volume create cephfs01 需要创建一个子卷# ceph fs subvolume create cephfs01 my-subvol -----------------#以下全部自动创建好 # ceph fs ls name: cephfs01, metadata pool: c…...
Linux进程控制(四)之进程程序替换
文章目录 进程程序替换单进程版程序替换替换原理多进程版程序替换替换函数函数解释小知识 命名理解 进程程序替换 如果要让子进程执行与父进程完全不同的代码,就要进行进程程序替换。 单进程版程序替换 执行一个可执行文件 makefile mycommand:mycommand.cgcc -…...
python-selenium 爬虫 由易到难
本质 python第三方库 selenium 空值 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题) 驱动下载网址:链接: link 1、实战1 (1)安装 selenium 库 pip install selenium&#…...
希尔排序
希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 d(增量)。随着算法的进行,d 逐渐减小,最终减为 1,此时整个序列就被排序好了。…...
Pydantic Mixin:构建可组合的验证系统体系
title: Pydantic Mixin:构建可组合的验证系统体系 date: 2025/3/22 updated: 2025/3/22 author: cmdragon excerpt: Pydantic的Mixin模式通过继承组合实现校验逻辑复用,遵循以Mixin后缀命名、不定义初始化方法等设计原则。支持基础校验模块化封装与多策略组合,如电话号码…...
策略模式 vs. 工厂模式:对比与分析
相同点 解耦思想 两者都通过接口/抽象类将实现与调用方解耦,降低模块间的直接依赖。 符合开闭原则 新增策略或产品时,只需扩展新类,无需修改已有代码。 封装变化 策略模式封装算法的变化,工厂模式封装对象创建的变化。 不同…...
RK3568 I2C底层驱动详解
前提须知:I2C协议不懂的话就去看之前的内容吧,这个文章需要读者一定的基础。 RK3568 I2C 简介 RK3568 支持 6 个独立 I2C: I2C0、I2C1、I2C2、I2C3、I2C4、I2C5。I2C 控制器支持以下特性: ① 兼容 i2c 总线 ② AMBA APB 从接口 ③ 支持 I2C 总线主模式…...
【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证
背景: vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现: rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…...
hadoop-HDFS操作
1. 使用的是hadoop的用户登录到系统,那么 cd ~ 是跳转到/home/hadoop下。 2. 在操作hdfs时,需要在hadoop用户下的/usr/local/hadoop,此时是在根目录下。 cd /usr/local/hadoop或者cd / cd usr/local/hadoop 3. 回到Linux的操作目录 我们把…...
Mysql 安装教程和Workbench的安装教程以及workbench的菜单栏汉化
Mysql 安装教程和Workbench的安装教程 详细请参考我的文件 Mysql 安装教程和Workbench的安装教程 或者下载我的资源Mysql 安装教程和Workbench的安装教程 汉化菜单 英文版菜单文件:下载链接 汉化版菜单文件:下载链接 默认情况下,安…...
失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)
校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …...
一条不太简单的TEX学习之路
目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释: 总结: 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释: 图案解释: xetex pdelatex etc index 报…...
如何为AI开发选择合适的服务器?
选择适合的服务器可以为您的AI项目带来更高的效率,确保最佳性能、可扩展性和可靠性,从而实现无缝的开发与部署。 选择适合的AI开发服务器可能并不容易。您需要一台能够处理大量计算和大型数据集的服务器,同时它还需要符合您的预算并易于管理…...
doris:审计日志
Doris 提供了对于数据库操作的审计能力,可以记录用户对数据库的登陆、查询、修改操作。在 Doris 中,可以直接通过内置系统表查询审计日志,也可以直接查看 Doris 的审计日志文件。 开启审计日志 通过全局变量 enable_audit_plugin 可以随时…...
CSS中的transition与渐变
目录 一、CSS transition 1. 核心属性 简写语法 2. 子属性详解 2.1 transition-property 2.2 transition-duration 2.3 transition-timing-function 2.4 transition-delay 3. 使用场景示例 3.1 悬停效果(Hover) 3.2 展开/收起动画 3.3 动态移…...
AI + 医疗 Qwq大模型离线本地应用
通义千问Qwq-32b-FP16可用于社区医院、乡镇卫生院、诊所等小型医疗机构,替代专业合理用药系统,作为药品知识库,实现以下功能: 药品信息智能查询:检索药品的详细说明书、适应症、禁忌症、不良反应及药物相互作用等关键信…...
大数据环境搭建
目录 一:虚拟机:VirtualBox 二:Shell工具:MobaXterm 三:安装脚本 四:JDK和Hadoop 4.1:安装 4.2:启动 4.3:Hadoop可视化访问 4.4:关机 一:虚拟机:VirtualBox Virt…...
七天免登录 为什么不能用seesion,客户端的http请求自动携带cookei的机制(比较重要)涉及HTTP规范
如果是七天免登录,和session肯定没关系,因为session不能持久化,主要是客户端一旦关闭,seesion就失效了/// 所以必须是能持久化的,这就清晰了,要莫在的服务器保存,要摸在客户端设置 cook机制 1. 使用Cookie实现七天免登录 前端(登…...
从PGC到AIGC:海螺AI多模态内容生成系统的技术革命
一、内容生产的范式迁移:从PGC到AIGC的进化之路 在数字内容生产的历史长河中,人类经历了三次重大范式转变:专业生成内容(PGC)的工业化生产、用户生成内容(UGC)的全民创作浪潮,以及当…...
常考计算机操作系统面试习题(三上)
目录 1. 为何要引入与设备的无关性?如何实现设备的独立性? 2. 页面置换先进先出算法 3. 页面置换先进先出算法,4个页框 4. 进程优先级调度算法 5. 短作业优先调度策略 6. 平均内存访问时间计算 7. 页式存储和段式存储的物理地址计算 …...
数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码
数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码 #include <stdio.h> #include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next, *prev; }Node;//初化链表…...
一键部署 GPU Kind 集群,体验 vLLM 极速推理
随着 Kubernetes 在大模型训练和推理领域的广泛应用,越来越多的开发者需要在本地环境中搭建支持 GPU 的 Kubernetes 集群,以便进行测试和开发。大家都知道,本地搭建 Kubernetes 集群通常可以使用 Kind(Kubernetes IN Docker&#…...
C/C++蓝桥杯算法真题打卡(Day6)
一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一:算法代码(字符串分割法) #include<bits/stdc.h> // 包含标准库中的所有头文件,方便编程 using namespace std; // 使用标准命名空间,避免每次调用…...
【C++】入门
1.命名空间 1.1 namespace的价值 在C/C中,变量,函数和后面要学到的类都是大量存在的,这些变量,函数和类的名称将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,…...
CUDA 学习(2)——CUDA 介绍
GeForce 256 是英伟达 1999 年开发的第一个 GPU,最初用作显示器上渲染高端图形,只用于像素计算。 在早期,OpenGL 和 DirectX 等图形 API 是与 GPU 唯一的交互方式。后来,人们意识到 GPU 除了用于渲染图形图像外,还可以…...
构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据
构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据 概述 本文将指导开发者构建一个MCP(Model Control Protocol)天气服务器,通过暴露get-alerts和get-forecast工具,为Claude for Desktop等客户端提供实时天气数据支持。该方案解决了传统LLM无法直接获取天气…...
[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝
目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接:2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其…...
搜广推校招面经五十六
字节推荐算法 一、Attention的复杂度是多少? 见【搜广推校招面经三十八】 二、如何对普适性强的物品(如新华字典)设计指标进行降权 2.1. 问题背景 普适性强的物品(如新华字典)在推荐系统或搜索排序中可能频繁出现…...
ZYNQ的cache原理与一致性操作
在Xilinx Zynq SoC中,Cache管理是确保处理器与外部设备(如FPGA逻辑、DMA控制器)之间数据一致性的关键。Zynq的ARM Cortex-A9处理器包含L1 Cache(指令/数据)和L2 Cache,其刷新(Flush/Invalidate&…...
安装React开发者工具
我们在说组件之前,需要先安装一下React官方推出的开发者工具,首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器),在输入框内搜索react,安装如下插件: 注意安装提供方为Facebook的插件,这…...
多层感知机
多层感知机(Multilayer Perceptron,简称 MLP)是一种基于前馈神经网络(Feedforward Neural Network)的深度学习模型,由多个神经元层组成,每一层与前一层全连接。它包括至少一个隐藏层(…...
2025年渗透测试面试题总结- PingCAP安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 PingCAP安全工程师 一、SQL注入判断数据库类型技术分析 1. 常规判断方法 2. 盲注场景下的判断 3. 补…...
CAD模型导入Geant4
CADMesh是一个开源项目,专门用于将STL格式的CAD模型导入Geant4。以下是使用CADMesh操作STL模型的步骤: 准备工作 下载CADMesh开源代码:可以从GitHub或Gitee下载CADMesh的开源代码。 将CAD模型转换为STL格式:在CAD软件中创建几何…...
DeepSORT 目标追踪算法详解
DeepSORT(Deep Simple Online and Realtime Tracking)是 多目标追踪(MOT) 领域的经典算法,通过结合目标检测、运动预测和外观特征匹配,实现了高效、稳定的实时追踪。其核心思想是通过 检测驱动追踪…...
mne溯源后的数据初步处理方法
文章目录 导入库 Yeo2011_7Networks_N1000绘制一些圆球来代表区域大小和强度 单网络绘制和扩展的方式AI补充一下背景知识📚 **背景与研究来源**🧠 **7 个功能网络的定义**📂 **标签数据获取**🔍 **标签文件内容解析**🛠…...
基于STM32进行FFT滤波并计算插值DA输出
文章目录 一、前言背景二、项目构思1. 确定FFT点数、采样率、采样点数2. 双缓存设计 三、代码实现1. STM32CubeMX配置和HAL库初始化2. 核心代码 四、效果展示和后话五、项目联想与扩展1. 倍频2. 降频3. 插值3.1 线性插值3.2 样条插值 一、前言背景 STM32 对 AD 采样信号进行快…...
【用 Trace读源码】PlanAgent 执行流程
前提条件 在 Trae 中打开 OpenManus 工程,使用 build 模式,模型选择 claude-sonnet-3.7 提示词 分析 agent/planning.py 中 main 方法及相关类的执行流程,以流程图的方式展示PlanningAgent 执行流程图 以下流程图展示了 PlanningAgent 类…...
AI代码编辑器:Cursor和Trae
Cursor 定义:Cursor 是一款基于AI的代码编辑器,它继承了VS Code的核心功能,并在此基础上增加了深度AI支持。它支持代码生成、优化、重构以及调试等功能,提供直观的Diff视图和自动补全功能,是一款功能强大的编程工具。…...
LSM-Tree(Log-Structured Merge-Tree)详解
1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...
介绍一个测试boostrap表格插件的好网站!
最近在开发一个物业管理系统。用到bootstrap的表格插件bootstrap table,官方地址: https://bootstrap-table.com/ 因为是英文界面,对国人不是很友好。后来发现了IT小书童网站 IT小书童 - 为程序员提供优质教程和文档 网站: IT…...
虚拟路由与单页应用(SPA):详解
在单页应用(SPA,Single Page Application)中,虚拟路由(也称为前端路由)是一种关键的技术,用于管理页面导航和状态变化,而无需重新加载整个页面。为了帮助你更好地理解这一概念&#…...
基于树莓派3B+的人脸识别实践:Python与C联合开发
基于树莓派3B的人脸识别实践:Python与C联合开发 引言 树莓派因其小巧的体积和丰富的扩展性,成为嵌入式开发的理想平台。本文将分享如何通过Python与C语言联合开发,在树莓派3B上实现从硬件控制、摄像头拍照到百度API人脸比对的完整流程。项目…...
尝试使用Tauri2+Django+React项目(2)
前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做,搞了半天 笔者看到官网,原来可以使用二进制文件,好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...
Qt桌面客户端跨平台开发实例
在Windows平台上,桌面客户端软件通常使用C/C语言和Qt跨平台开发框架进行开发。因此,大部分代码可以运行于不同平台环境,但是程序运行依赖的三方库以及代码中一些平台相关的头文件和接口需要进行平台兼容。本文以windows桌面端应用迁移到Linux…...
c++进阶之------红黑树
一、概念 红黑树(Red-Black Tree)是一种自平衡二叉查找树,它在计算机科学的许多领域中都有广泛应用,比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性(红色或黑色&am…...
政安晨【超级AI工作流】—— 使用Dify通过工作流对接ComfyUI实现多工作流协同
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 一、准备工作 Dify跑起来 ollama局域网化配置 Dify配置并验证 启动ComfyUI 二、…...