算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录

  • 前言
  • 一、背包问题溯源(动态规划)
    • 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背包问题、完全背包问题、多重背包问题等。以下是几种主要的背包问题及其衍生:

  1. 0-1 背包问题
    这是最基本的形式,每个物品只有一个,并且对于每个物品你只能选择要么放入背包(1),要么不放(0)。目标是在不超过背包容量的前提下,使所选物品的总价值最大。
  • 解决方法:动态规划是一种常用的解决方法,通过构建一个二维数组来记录在不同容量和不同物品数量下能达到的最大价值。
  1. 完全背包问题
    在这种变体中,每种类型的物品都有无限个,即可以选取同一种物品多次。目标同样是在不超过背包容量的情况下最大化背包内物品的总价值。
  • 解决方法:与0-1背包类似,但需要对每种物品进行多次尝试,考虑其重复添加的可能性。
  1. 多重背包问题
    多重背包问题是0-1背包的一个扩展,其中每个物品的数量有限。也就是说,对于每种物品,你可以选择放入背包一定次数(可能是0次、1次或更多,但不是无限次)。
  • 解决方法:可以通过将多重背包转换为0-1背包问题处理,即将每种物品根据其可选次数拆分成多个独立的物品;或者使用更高级的动态规划技巧直接解决。
  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
输出解释最大价值最大价值最大价值
实际应用投资决策、资源分配生产计划、库存管理库存管理、采购决策

解释:

  • 👉物品选择次数:指每种物品在背包中能被选择的次数。
  • 👉状态转移方程:描述了如何根据之前的状态计算当前状态的最大价值。
  • 👉空间优化:展示了如何减少算法所需的空间复杂度。
  • 👉遍历顺序:说明了在动态规划过程中如何遍历物品和背包容量以达到正确的结果。
  • 👉适用场景示例:提供了几种典型的应用场景,帮助理解不同类型背包问题的实际用途。
  • 👉算法实现复杂度:列出了时间复杂度和空间复杂度,这对于评估算法效率至关重要。
  • 👉解决方法:简要介绍了每种背包问题的基本解决策略。
  • 👉特殊技巧:列举了一些特定于该类型背包问题的技巧或注意事项。
  • 👉示例输入:提供了一个具体的例子作为参考。
  • 👉输出解释:解释了算法最终输出的结果代表的意义。
  • 👉实际应用:进一步拓展了理论知识到现实世界中的应用场景。

在这里插入图片描述


献给读者


💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。

🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。


亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库原理及应用mysql版陈业斌实验一

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验一&#xff1a;数据库与数据表的定义和数据操作 1.实验数据如下 …

腾讯云创建DeepSeek AI应用及使用教程

文章目录 腾讯云大模型知识引擎创建 DeepSeek 应用文档一、前期准备二、创建应用1. 进入应用管理界面2. 应用配置3. 发布应用 三、管理应用四、测试应用五、API接入应用API接入文档详细链接HTTP 对话端接口文档WebSocket对话端接口文档 六、常见问题七、注意事项 腾讯云大模型知…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

Linux上位机开发实战(camera视频读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于linux camera&#xff0c;一般都是认为是mipi camera&#xff0c;或者是usb camera。当然不管是哪一种&#xff0c;底层的逻辑都是v4l2&#x…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比

Elasticsearch零基础入门:从安装到入门

目录 一、Elasticsearch简介 二、环境快速搭建 1. 单节点本地部署&#xff08;Docker版&#xff09; 2. 验证安装 三、核心概念图解 与传统数据库对比 架构概念说明 四、REST API基础操作 1. 索引管理 2. 文档CRUD操作 五、基础搜索实战 1. 全文搜索 2. 精确匹配 …

数据清理工具——OpenRefine的进阶操作

第二章主要讲OpenRefine的进阶操作&#xff0c;希望能帮助你们&#xff01; 1.OpenRefine工具的数据排序功能 数据排序是一种常见的数据清理操作&#xff0c;它主要是按照指定方式排列数据&#xff0c;这样不仅可以对数据进行检查和纠错&#xff0c;还可以通过浏览排序后的数…

表格标题竖直

使用文本方式使表格怎么竖列 思路&#xff1a;表格竖直书写&#xff0c;里面的内容水平书写 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;书写方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;竖直<style>table {writing-mode: vertical…

可视化图解算法:链表相加( 两数相加)

1. 题目 描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 数据范围&#xff1a;0≤n,m≤10000000 &#xff0c;链表任意值 0≤val≤9 要求&#xff1a;空间…

YOLOv5

使用Yolov5 什么是PyTorch&#xff1f; PyTorch 是一个基于 Python 的开源机器学习库(深度学习框架)&#xff0c;它主要用于深度学习任务&#xff0c;为构建和训练神经网络提供了灵活且高效的平台&#xff0c;它们提供了完整的生态系统&#xff0c;包括模型定义、训练、验证…

【access开发】导入excel 并生成表

hi&#xff0c;大家好呀&#xff01; 最近天气越来越暖了&#xff0c;在这个春暖花开的季节了&#xff0c;每天心情应该都是美美的&#xff0c;正所谓一年之计在于春&#xff0c;在这个美好的季节&#xff0c;大家一起努力学习学习吧&#xff01;那我们来看看今天学点啥呢&…

查看GPU型号、大小;CPU型号、个数、核数、内存

GPU型号、大小 nvidia-smiCPU型号 cat /proc/cpuinfo | grep model name | uniqCPU个数 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU内存 cat /proc/meminfo | grep MemTotal参考…

如何使用AIOps明确Devps的问题归责

引言 拿出一个确凿的证据往往是解决背锅问题的重要办法。只有这样&#xff0c;才能够在没有互相指责、逃避责任或为自己及团队开脱等不良闹剧的情况下达成共识。DevOps 团队可以借助 AIOps 数据支持的可信度&#xff0c;让问题更清晰、背景更明确&#xff0c;从而一致做出更好…

Yolo系列之Yolo v3的概述、网络结构以及与v1,v2对比

Yolo v3的概述、模型理解以及与v1,v2对比 目录 Yolo v3的概述、模型理解以及与v1,v2对比1 YOLOv3概述1.1 概念1.2 主要特点1.3 优缺点 2 网络结构理解2.1 核心网络框架2.2 先验框2.3 特征图2.4 Softmax层替换 3 Yolo v3与v1,v2对比3.1 网络结构3.2 多尺度预测3.3 分类器与损失函…

AIGC工具平台-百叶窗卡点视频

本模块通过智能算法自动分析音频节奏&#xff0c;精准识别高潮卡点&#xff0c;并生成与音乐高度同步的动态视频。同时支持 百叶窗样式的个性化设置&#xff0c;增强视觉冲击力&#xff0c;助力用户打造节奏感强、富有创意的视频作品。 此外用户可灵活管理图片素材&#xff0c…

【原创】通过S3接口将海量文件索引导入elasticsearch

在医院海量影像文件通过s3传到蓝光存储时&#xff0c;要找一个文件需要全部文件遍历一遍&#xff0c;效率非常非常低。 S3 是对象存储服务&#xff0c;本身不是专门为快速文件查找设计的&#xff0c;而 Elasticsearch 是搜索引擎&#xff0c;在查找特定文件或数据方面具有明显…

MyBatis注解方式:从CRUD到数据映射的全面解析

目录 1. MyBatis是什么&#xff1f;2.准备工作2.1创建工程2.2 数据准备2.3 持久层代码2.4 单元测试 3.Mybatis的增删改查操作&#xff08;使用注解方式&#xff09;3.1 增&#xff08;insert&#xff09;3.2 删&#xff08;delete&#xff09;3.3 改&#xff08;update&#xf…

Java 大视界 -- 基于 Java 的大数据机器学习模型的多模态融合技术与应用(143)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

进程管理笔记1-进程线程基础知识

5.1 进程线程基础知识 进程 进程的基本定义&#xff1a; 进行的程序。代码经过编译&#xff0c;变成二进制可执行文件&#xff0c;运行这个可执行文件后&#xff0c;装载到内存中&#xff0c;然后CPU执行其中指令。 并行和并发&#xff1a; 并行指两个任务并列前行&#x…