数据结构与算法:动态规划dp:背包问题:理论基础(状态压缩/滚动数组)和相关力扣题(416. 分割等和子集、1049.最后一块石头的重量Ⅱ、494.目标和)
背包问题
01背包理论基础
对于01背包问题,物品下标为0到i
,对应的重量为weight[0]到weight[i]
,价值为value[0]到value[i]
,每个物品只可以取或不取,背包最大容量为j
的场景。
常见的状态转移方程如下:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
其中,dp[i][j]
的含义是:对于下标0到i
的物品,任意取放,满足背包剩余最大容量为j
的情况下能获得的最大价值。
那么dp[i][j]
可以划分为两种情况
- 取了下标为
i
的物品,其获得的最大价值为dp[i-1][j-weight[i]]+value[i]
- 没有取下标为
i
的物品,其获得的最大价值为dp[i-1][j]
对于该数组的初始化,需要初始化i或j分别为0
的边界情况:
i=0
的情况:如果j >= weight[0]
,则我们可以取物品0
,此时dp[0][j] = value[0]
。否则,我们无法放入物品0,此时dp[0][j] = 0
。j=0
的情况:都为0,因为背包容量为0时,无法装入任何物品。
而对于i和j
都非零时的情况,我们可以初始化成一个随意的值,因为根据状态转移方程来看,它的数组与它本身没有关系,所以在dp
数组赋值时都会被覆盖掉。
接着我们思考它的遍历顺序。
对于这种dp
数组为二维数组的情况,两层for
循环是可以颠倒位置的。因为无论是先遍历背包,还是先遍历物品,都能保障遍历dp[i][j]
时,已经给dp[i-1][j]以及dp[i-1][j-weight[i]
赋值了正确的数值了。
注意,对于所有01背包问题,都可以使用回溯算法来解决,对于每个物品取或不取,一共n个物品,那么算法的复杂度就是2的n次方。所以一般回溯会超时。
状态压缩(滚动数组)
而关于刚刚的场景,实际上我们还可以用一维数组来做,也就是常说的状态压缩,或者说滚动数组。
此时状态转移方程为dp[j]=max(dp[j],dp[j-weight[i]]+value[i])
。
其中,dp[j]
的含义是:任意取放物品,满足背包 剩余最大容量为j
的情况下能获得的最大价值。
和二维的情况一样,dp[j]
可以划分为两种情况
- 取了下标为
i
的物品,其获得的最大价值为dp[j-weight[i]]+value[i]
- 没有取下标为
i
的物品,其获得的最大价值为dp[j]
首先我们思考一个问题,为什么可以状态压缩?
这是因为从二维数组的状态转移方程,我们可以知道,dp[i]
的数据只依赖dp[i-1]
层的数据,譬如在计算dp[3]
的时候,我们就不再需要存储dp[1]
的数据了。这种只依赖于有限的数据的情况,我们都可以状态压缩。在这我们压缩成两行数据,一行是dp[i-1]
,一行是dp[i]
。
接着我们思考这个dp
数组的初始化。
j为0
,代表对于下标0到i
的物品,任意取放,背包最大容量为0
时能获得的最大价值,毫无疑问,肯定都初始化为0
。j非零
,此时因为状态转移方程中我们给dp[j]
赋值时,会比较其自身。所以应该初始化为一个负值。
然后就是遍历顺序。
虽然数组只有1层了,但是因为状态转移方程里还是有i
存在的,所以遍历赋值还是有两层for
循环的,外层是遍历物品,内层是遍历背包容量。而且必须先遍历物品,再遍历背包容量,且背包容量需要倒序遍历。
为什么背包容量需要倒序遍历呢?
如果正序遍历,dp[j - weight[i]]
可能在同一轮更新后再次被使用,导致相当于选择了同一个物品多次,这就变成了完全背包问题。倒序遍历可以确保每个物品只被使用一次。
416. 分割等和子集
在这道题虽然没有明说物品的价值,但实际上物品的价值就是等于它本身的重量。这样题目就转化为了,遍历下标从0到i
的物品,任意拿取(物品只能拿取1次),满足重量为ans
的情况?
为此我们想到了01背包,dp[j]
表示遍历下标从0到i
的物品,任意拿取,满足重量为j
。当dp[j]==ans
,也就是存在满足重量为ans
的情况,那么返回True
代码1:最套板子的一集
class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)ans = 0for i in range(n):ans += nums[i]if ans%2:return Falseans=int(ans/2)dp = [0] * (ans+1) for i in range(n):for j in range(ans, nums[i]-1, -1):dp[j] = max(dp[j-nums[i]]+nums[i], dp[j])if dp[ans]==ans:return Trueelse:return False
最原始的一版,纯套板子。效率:2370ms,击败13.38%
代码2:优化外层for循环
根据上面的代码我们可以看到,其实我们不需要循环下标i
,我们只需要拿到数本身就好了,所以直接用for num in nums
class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)ans = 0for i in range(n):ans += nums[i]if ans%2:return Falseans=int(ans/2)dp = [0] * (ans+1) for num in nums:for j in range(ans, num-1, -1):dp[j] = max(dp[j-num]+num, dp[j])if dp[ans]==ans:return Trueelse:return False
效率:2253ms,击败18.18%。
代码3:优化其他条件减少代码量
class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)ans = sum(nums) # 优化点1:用sum函数减少for循环if ans%2:return Falseans=ans//2 # 优化点2,用//替代int转化dp = [0] * (ans+1) for num in nums:for j in range(ans, num-1, -1):dp[j] = max(dp[j-num]+num, dp[j])if dp[ans]==ans:return Truereturn False
效率:2547ms,击败8.48%
可以看到其实效率没有说提升,但是代码量会少,看起来更简洁。
代码4:优化初始化条件(效率最高)
对于代码3,我们还可以再优化。因为我们其实并不关心dp[ans]
的值具体是多少,也就是说我们并不在意最终能满足题意的方案数是多少,我们只关心能不能满足,那么初始化dp
数组时就可以不用数值,而是用布尔值。注意这里,根据dp数组的含义,那么dp[0]的初始化就一定是True
class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)ans = sum(nums)if ans%2:return Falseans=ans//2dp = [False] * (ans+1) dp[0] = Truefor num in nums:for j in range(ans, num-1, -1):if dp[j - num]:dp[j] = Truereturn dp[ans]
效率:563ms,击败75.46%
1049.最后一块石头的重量Ⅱ
这道题转化一下思路,就可以变成和416. 分割等和子集
一样的问题。
因为我们知道,如果两堆石头的重量越相近,那么相撞后可以留下的重量就越小。
也是求 任取其中的石块,看背包能装下的这堆石块的最大重量 是否能越靠近目标数(整体重量的一半)。
class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:n = len(stones)all_sum = sum(stones)ans = all_sum//2dp = [0] * (ans+1)for stone in stones:for j in range(ans, stone-1, -1):dp[j] = max(dp[j], dp[j-stone]+stone)return abs((all_sum - dp[ans])-dp[ans])
效率:19ms,击败74.61%
494.目标和
这道题最难想的可能是不知道它和动态规划有什么关系。第一时间想的估计都是回溯去遍历每个元素取或不取。
但实际上,这道题可以将所有元素分为两类,一类是前面加+
的,一类是前面加-
的。那么就和1049.最后一块石头的重量Ⅱ
非常类似。我们设正数集合的总和为pos
,负数集合的总和为neg
,那么存在以下逻辑:
pos+neg = sum
pos-neg = target
为此,推出pos = (target+sum)//2
也就是说,相当于我们要遍历所有物品,任意取放,找到满足背包容量为(target+sum)/2
的情况数是多少。
所以,dp[j]
的含义为,遍历前i
个物品,任意取放,满足背包容量为j
的情况数。
那么首先关于边界条件的判断,就有两种:
- pos不是整数。因为数组都是整数,所以
pos
也一定是整数。 - pos小于0,根据
pos
的定义,应该是正数集合的总和,那么不可能小于0。
代码如下:
n = len(nums)
all_sum = sum(nums)if (target+all_sum)%2: # pos不是整数return 0pos= (target+all_sum)//2if pos< 0:# pos小于0return 0
其次,关于状态转移方程,dp[j]=dp[0]+dp[1]+dp[2]+...dp[j-1]
,也就是:
或者说dp[j]=dpj]+dp[j-nums[i]]
或者说dp[j]+=dp[j-num]
为什么是累加?
因为每个物品都可以选择取或不取,所以对于每个j,它的值是由所有可能的前一个状态转移而来的。具体来说,dp[j]的值是由dp[j-1]、dp[j-2]、…、dp[0]这些状态转移而来的,因为这些状态都可能在加入当前物品后达到j。
最后关于初始化,在这我们要求的dp
是情况数,那么dp[0]
应该是多少呢?
实际上,dp[0]
应该是1
。举个例子:
nums = [0],target = 0
那么pos应该为1,因为给0前面加上一个+是一种情况。
最后的代码如下:
class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:n = len(nums)all_sum = sum(nums)if (target+all_sum)%2:return 0pos = (target+all_sum)//2if pos < 0:return 0dp = [0] * (pos+1)dp[0] = 1for num in nums:for j in range(pos, num-1, -1):dp[j] += dp[j-num]return dp[pos]
效率:18ms,击败87.50%
总结
对于416. 分割等和子集
,题目实际上为:给定一个重量为target
的背包,是否能装满这个背包,转移方程为
dp[0] = True
for num in nums:for j in range(target, num-1, -1):if dp[j - num]:dp[j] = True
对于1049.最后一块石头的重量Ⅱ
,题目实际上为:给定一个重量为target
的背包,该背包能装的最大价值(价值就是重量)是多少? 转移方程为:
dp = [0] * (target+1)
for stone in stones:for j in range(target, stone-1, -1):dp[j] = max(dp[j], dp[j-stone]+stone)
对于494.目标和
,题目实际上为:给定一个重量为target
的背包,求装满这个背包的方案数是多少? 转移方程为:
dp = [0] * (target+1)
dp[0] = 1
for num in nums:for j in range(target, num-1, -1):dp[j] += dp[j-num]
相关文章:
数据结构与算法:动态规划dp:背包问题:理论基础(状态压缩/滚动数组)和相关力扣题(416. 分割等和子集、1049.最后一块石头的重量Ⅱ、494.目标和)
背包问题 01背包理论基础 对于01背包问题,物品下标为0到i,对应的重量为weight[0]到weight[i],价值为value[0]到value[i],每个物品只可以取或不取,背包最大容量为j的场景。 常见的状态转移方程如下: dp[i…...
【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例
ℹ️大家好,我是练小杰,今天周二,明天就是元宵节了呀!!😆 俗话说“众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。” 本文主要对数据库备份与还原的知识点例题学习~~ 前情回顾&…...
【Git】完美解决git push报错403
remote: Permission to xx.git denied to xx. fatal: unable to access https://github.com/xx/xx.git/: The requested URL returned error: 403出现这个就是因为你的(personal access tokens )PAT过期了 删掉旧的token 生成一个新的 mac系统 在mac的…...
2021 年 9 月青少年软编等考 C 语言五级真题解析
目录 T1. 问题求解思路分析T2. 抓牛思路分析T3. 交易市场思路分析T4. 泳池思路分析T1. 问题求解 给定一个正整数 N N N,求最小的 M M M 满足比 N N N 大且 M M M 与 N N N 的二进制表示中有相同数目的 1 1 1。 举个例子,假如给定 N N N 为 78 78 78,二进制表示为 …...
玩转适配器模式
文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…...
Batch Normalization (BN) 和 Synchronized Batch Normalization (SyncBN) 的区别
Batch Normalization 和 Synchronized Batch Normalization 的区别 Batch Normalization (BN) 和 Synchronized Batch Normalization (SyncBN) 的区别1. BN(Batch Normalization)2. SyncBN(Synchronized Batch Normalization)3. 选…...
MySQL主从同步
目录 一、MySQL主从同步 1、基于binlog的主从同步 2、基于gtid的主从同步配置 二、MySQL 主从读写分离实现方案 2.1 ProxySQL实现mysql8主从同步读写分离 1、ProxySQL基本介绍 2、ProxySQL结构 2、实验环境 3、实现数据库主从复制 4、安装ProxySQL 5、配置ProxySQL …...
CCFCSP认证考试 ——202403-1 词频统计
题目: 在学习了文本处理后,小 P 对英语书中的 n 篇文章进行了初步整理。 具体来说,小 P 将所有的英文单词都转化为了整数编号。假设这 n 篇文章中共出现了 m 个不同的单词,则把它们从 1 到 m 进行编号。 这样,每篇文章…...
关于“i18n“在vue中的使用
关于"i18n"在vue中的使用 <!-- vue2中 --> <template><div>{{ $t("This campaign has expired.") }}}}</div> </template> <script> export default {created() {this.onLoading();},methods: {onLoading () {this.$…...
MATLAB中count函数用法
目录 语法 说明 示例 对出现次数计数 使用模式对数字和字母进行计数 多个子字符串的所有出现次数 忽略大小写 对字符向量中的子字符串进行计数 count函数的功能是计算字符串中模式的出现次数。 语法 A count(str,pat) A count(str,pat,IgnoreCase,true) 说明 A c…...
Spring中的@Component和@Bean有什么区别?
在Spring框架中,Component和Bean都用于定义Bean,但它们的使用场景和方式有所不同。 ### 1. Component - **作用范围**:Component是一个类级别的注解,通常用于标记一个类为Spring的组件。Spring会自动扫描并注册这些类为Bean。 -…...
泛化、选择、分化
泛化是指记忆联系的“发散”,泛化兴奋的基础是模糊兴奋。记忆联系的“发散”有以下几种种情况: 1、联络区的一原始记忆柱群(A1)具有直接或间接与其它任意联络区的任意原始记忆柱群建立记忆联系的潜力。也就是说任何两个对象&…...
剖析 C++ 模拟算法:数据结构、随机数生成与模型验证
模拟算法 (Simulation Algorithms) 是一种通过计算机程序来模拟现实世界或系统行为的算法。它不依赖于特定的数学公式或优化技术,而是直接按照系统的规则和逻辑进行步骤一步地模拟。 模拟算法的复杂度和效率取决于模拟系统的复杂程度和模拟的精度要求。 在 C 中&…...
51单片机俄罗斯方块整行消除函数
/************************************************************************************************************** * 名称:flash * 功能:行清除动画 * 参数:NULL * 返回:NULL * 备注: * 采用非阻塞延时࿰…...
IDEA升级出现问题Failed to prepare an update Temp directory inside installation
IDEA升级出现问题"Failed to prepare an update Temp directory inside installation…" 问题来源: 之前修改了IDEA的默认配置文件路径,然后升级新版本时就无法升级,提示"Failed to prepare an update Temp directory insid…...
Windows系统下设置Vivado默认版本:让工程文件按需打开
在FPGA开发过程中,我们常常需要在一台电脑上安装多个不同版本的Vivado软件,以满足不同项目的需求。然而,当双击打开一个Vivado工程文件(.xpr)时,系统默认会调用一个固定的版本,这可能并不是我们…...
CSS3+动画
浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…...
Kotlin 2.1.0 入门教程(十一)for、while、return、break、continue
for 循环 for 循环会遍历任何提供迭代器的对象。 for (item in collection) print(item)for (int: Int in ints) {println(int) }for 循环会遍历任何提供迭代器的对象,这意味着该对象必须满足以下条件: 具有一个成员函数或扩展函数 iterator()…...
深度探索DeepSeek:成本效益之辩与市场展望
摘要 DeepMind的CEO对DeepSeek的成本效益提出质疑,认为其成本被过度炒作。他指出,DeepSeek所使用的技术大多源自谷歌和DeepMind。然而,分析机构SemiAnalysis强调,DeepSeek的优势在于其成本与能力的卓越组合。尽管目前DeepSeek的成…...
DeepSeek投喂数据(训练AI)
1、拉取nomic-embed-text 打开命令行,运行:ollama pull nomic-embed-text 这里需要先安装ollama ,不过大家应该在本地部署模型时已经安装了 拉取成功就行了,后续在配置AnythingLLM时用到 2、下载 AnythingLLM 地址:…...
Docker 安装与配置 Nginx
摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时,探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外,文章还涵…...
常用电路(过压保护、电流/电压采集)
过压保护电路 输入电压使用电源(36V)或者typec(20V),需要过压保护电路处理输入再连接到CH224K,保证输入不高于最大获取电压20V MOS管导通条件为栅源极有压差,一般为5-10V 三极管导通条件为基极…...
12.Python模块:模块中的__all__、模块制作、打包模块、模块安装与使用
在 Python 中,模块是一个包含 Python 代码的文件。模块可以包含函数、类和变量,也可以包括可执行的代码。Python提供了一套强大的模块系统,支持模块的制作、打包、安装和使用。接下来,我们将详细介绍 __all__、模块制作、打包模块…...
Socket通信端口绑定的逻辑实现
在实现网络通信时,一个 Socket 需要维护输入端与输出端的 IP 地址和端口号,同时也需要输入与输出字节缓冲区: 输入端与输出端的 IP 地址和端口号 作用 标识通信端点:IP 地址用于标识网络中的设备,端口号用于标识设备…...
在freertos中,中断优先级和任务优先级之间的关系和使用方法
中断优先级和任务优先级如何匹配?任务优先级不同任务之间该用多高的优先级?中断优先级不同中断中该用多高的优先级?中断优先级和任务优先级设置时,怎样设置可以让任务在调度时屏蔽中断?怎样设置可以让任务在调度时&…...
解锁摄影潜能:全面解析相机镜头的选择与使用逻辑
目录 一、镜头分类:从焦距到用途的底层逻辑 (一)按焦距和视角分类(一级分类) (二)按特殊用途分类(一级分类) 二、参数解码:超越 “光圈越大越好” 的思维定…...
java项目之直销模式下家具工厂自建网站源码(ssm+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的直销模式下家具工厂自建网站源码。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 直销模式下家具…...
CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测
代码地址:CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…...
grid网格布局中实现父盒子比较大,子元素顶部对齐
css布局中使用grid布局,父盒子的高度是1000px,每个子元素高度是100px,现在有三个子元素,如何实现每行显示两个,并且子元素都顶部对齐?如图所示的效果。 grid布局文档:grid - CSS:层…...
P4814 [CCO 2014] 国王格鲁夫
题目描述 本题译自 CCO 2014 Day1 T2「King Gruff」 狼国王格鲁夫统治着一个居住着可爱的狐狸的繁荣、快乐的领地。对狐狸们来说,不幸的是,他根本不是一个好国王,而且还想让他们的生活过得很惨。 他的国家有 N 个城市,由 M 条路连接,第 i 条路可以让你从城市 Xi 走到…...
[QMT量化交易小白入门]-二十二、deepseek+cline+vscode,让小白使用miniQMT量化交易成为可能
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通&a…...
吃瓜教程Day1笔记
主要内容: 1. 什么是机器学习以及 2. 机器学习的相关数学符号,为后续内容作铺垫,并未涉及复杂的算法理论, 因此阅读本章时只需耐心梳理清楚所有概念和数学符号即可。 3. “模型评估与选择” 是在模型产出以后进行的下游工作&…...
在 C# 中,处理 Excel 和 PDF 文件的库有很多。以下是一些比较常用的选择
读取 Excel 文件的库 NPOI 用途:可以读取和写入 .xls 和 .xlsx 文件。特点:无需安装 Microsoft Office,支持简单的 Excel 操作,如格式化、公式、图表等。 EPPlus 用途:主要用于 .xlsx 格式(Excel 2007 及以…...
IntelliJ IDEA 安装与使用完全教程:从入门到精通
一、引言 在当今竞争激烈的软件开发领域,拥有一款强大且高效的集成开发环境(IDE)是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE,凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…...
SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中,我们通过进程监控和日志分析来发现系统问题&…...
1. 构建grafana(版本V11.5.1)
一、grafana官网 https://grafana.com/ 二、grafana下载位置 进入官网后点击downloads(根据自己的需求下载) 三、grafana安装(点击下载后其实官网都写了怎么安装) 注:我用的Centos,就简略的写下我的操作步…...
STM32-知识
一、Cortex-M系列双指针 Cortex-M系列的MSP与PSP有一些重要的区别,双指针是为了保证OS的安全性和稳健性。本质上,区别于用户程序使用PSP,操作系统和异常事件单独使用一个MSP指针的目的,是为了保证栈数据不会被用户程序意外访问或…...
SearchBar组件的功能与用法
文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"Material3中的IconButton"相关的内容,本章回中将介绍SearchBar组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…...
解决VsCode的 Vetur 插件has no default export Vetur问题
文章目录 前言1.问题2. 原因3. 解决其他 前言 提示: 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…...
游戏引擎学习第96天
讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…...
【项目总结】易到家家政服务平台 —— 派单调度(7)
派单调度需求分析 在抢单业务中,用户下单成功由服务人员或机构进行抢单,抢单成功服务人员上门服务,除了抢单业务系统还设计了派单业务,由系统根据用户订单的特点自动派给合适的服务人员。 流程如下: 首先获取待分配…...
0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 0基础…...
Flink-DataStream API
一、什么样的数据可以用于流式传输 Flink的DataStream API 允许流式传输他们可以序列化的任何内容。Flink自己的序列化程序用于 基本类型:即字符串、长、整数、布尔值、数组复合类型:元组、POJO和Scala样例类 基本类型我们已经很熟悉了,下…...
chromium-mojo
https://chromium.googlesource.com/chromium/src//refs/heads/main/mojo/README.md 相关类:https://zhuanlan.zhihu.com/p/426069459 Core:https://source.chromium.org/chromium/chromium/src//main:mojo/core/README.md;bpv1;bpt0 embedder:https://source.chr…...
Sourcetree 安装教程(附下载链接)
一、介绍 Sourcetree是一款免费的Git桌面工具,可以简化我们与Git之间敲代码的过程,使得我们可以更快的管理代码版本。 虽然现在各大IDE都内置Git功能,但在一些没有内置Git的IDE情况下,使用Sourcetree进行Git下的代码管理是一件非…...
NIO 和 AIO 的区别?
目录 设计理念 工作模式 适用场景 性能特点 NIO(Non - blocking I/O,非阻塞 I/O)和 AIO(Asynchronous I/O,异步 I/O)都是 Java 中用于实现高效 I/O 操作的机制,它们在设计理念、工作模式、适用场景等方面存在明显区别,以下为你详细介绍: 设计理念 NIO:NIO 基于事…...
Python中10个常用的接口自动化装饰器
更多Python学习内容:ipengtao.com 装饰器(Decorators)是Python中一种强大的编程工具,它们用于修改或增强函数或方法的行为。在接口自动化测试中,装饰器可以起到简化代码、提高代码可维护性和可重用性的作用。本文将介…...
Odoo17 0.1常见的QWeb 模板语言指令的详细总结
Odoo QWeb 模板语言提供了许多指令 (directives) 来增强 HTML 模板的功能,使其能够动态地展示数据、进行条件判断、循环遍历、以及实现更复杂的逻辑。 这些指令都以 t- 开头作为属性添加到 HTML 标签上。 以下是一些常见的 Odoo QWeb 模板语言指令的详细总结&#…...
螺旋矩阵 II
螺旋矩阵 II 一、题目描述 给定一个正整数 n,请你生成一个包含 1 到 n^2 所有元素的 n x n 正方形矩阵,元素顺序按顺时针的方式进行螺旋排列。 示例 1:输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:…...
Object:所有类的超类
定义:所有类的超(父)类。 Object有下面几个常用的方法: equals():比较内存地址是否指向相同getclass():获取类的信息--反射领域hashcode 散列码--根据地址生成wait -- 线程进入等待状态,让出CPU和锁notify -- 唤醒等待…...