以下利用字符串 “abcde" 和 ”ace” 为例,计算最长公共子序列。
令 s1=“abcde”, s2=“ace”
一、动态数组定义
根据 s1
的长度为5, s2
的长度为3。
初始化一个 3 行 5 列的二维数组 dp
,赋初值全为 0。用来存储动态规划过程中记录的值。
KaTeX parse error: Undefined control sequence: \[ at position 3: dp\̲[̲i\]\[j\] 代表位置 ( i , j ) (i, j) (i,j) 最长公共子序列的值!
二、初始化
针对动态规划一般的初始化方法,一定是边界的初始化。
这里是二维数组,咱们这里要初始化的地方是第 0 行和第 0 列。
① 针对 0 行
s1=“abcde”, s2=“ace”,s2[0] 与 s1 的每一个字符进行比较,只有第 0 位置字符是相同的,第 0 位置为 1。由于公共子序列的规则,那第 0 行初始化全为 1。
① 针对 0 列
s1=“abcde”, s2=“ace”,s1[0] 与 s2 的每一个字符进行比较,同样只有第 0 位置字符是相同的,第 0 位置为 1。依然是由于公共子序列的规则那第 0 列初始化全为 1。
根据初始化的情况,下面用代码描述:
if text1[0] == text2[0]:
dp[0][0] = 1
for i in range(1, size1):
dp[0][i] = 1 if dp[0][i-1] == 1 else int(text1[i] == text2[0])
for j in range(1, size2):
dp[j][0] = 1 if dp[j-1][0] == 1 else int(text2[j] == text1[0])
三、状态转移方程
很明显可以分为两种情况:
-
当前位置的字符相同
-
当前位置的字符不相同
① 当 text1[i] == text2[j] 的时候,说明当前字符相同,只要将上一个字符对应的 dp 的值加 1 就可以了。即 dp[i][j] = dp[i-1][j-1] + 1。
注意,这里一定是 dp[i-1][j-1],因为此处的字符相同。那么,要想计算此处 dp[i][j] 的值,一定是与位置 i-1 与 j-1 的位置相关的。
② 当 text1[i] != text2[j] 的时候,此时当前字符不相同,那么此处 dp[i][j] 的数值一定沿用上一个 dp 的数值。所以,取得一定是其中的最大值 max(dp[i-1][j], dp[i][j-1])。
综上所述,可以得到该问题的状态转移方程:
$$
dp[i][j]= \begin{cases}
dp[i-1][j-1] + 1, & text1[i] = text2[j] \[2ex]
max(dp[i-1][j], dp[i][j-1]), & text1[i] \neq text2[j]
\end{cases}
$$
从位置 (1, 1) 位置开始计算,判断两个字符串在当前字符串是否相等:
-
如果相等,则取dp[i-1][j-1]+1
-
如果不相等,则取max(dp[i][j-1], dp[i-1][j])
根据上述的状态转移方程,以及s1=“abcde”, s2=“ace”,下面把二维数组填满,得到最后的答案!
① 位置(1,1):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲1\] \\neq s2\[1…
② 位置(1,2):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲2\] == s2\[1\] …
③ 位置(1,3):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲3\] \\neq s2\[1…
④ 位置(1,4):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲4\] \\neq s2\[1…
⑤ 位置(2,1):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲1\] \\neq s2\[2…
⑥ 位置(2,2):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲2\] != s2\[2\] …
⑦ 位置(2,3):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲3\] != s2\[2\] …
⑧ 位置(2,4):KaTeX parse error: Undefined control sequence: \[ at position 3: s1\̲[̲4\] == s2\[2\] …
这个就是二维数据中,每一格的填充方式。
根据上述的一个清晰的思路,状态转移填充二位数组的代码描述:
for i in range(1, size2):
for j in range(1, size1):
if text2[i] == text1[j]:
注意这里是dp[i-1][j-1]+1
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
return dp[-1][-1]
好了,这个是一个全面的答案:
def longestCommonSubsequence(self, text1, text2):
size1 = len(text1)
size2 = len(text2)
1 先定义 dp 数组
dp = [[0 for _ in range(size1)] for _ in range(size2)]
2 初始化 dp 数组的第 0 行和第 0 列
if text1[0] == text2[0]:
dp[0][0] = 1
for i in range(1, size1):
dp[0][i] = 1 if dp[0][i-1] == 1 else int(text1[i] == text2[0])
for j in range(1, size2):
dp[j][0] = 1 if dp[j-1][0] == 1 else int(text2[j] == text1[0])
3 动态方程进行求解
for i in range(1, size2):
for j in range(1, size1):
if text2[i] == text1[j]:
注意这里是dp[i-1][j-1]+1
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
[外链图片转存中…(img-fS1p0ZIC-1711994936049)]
[外链图片转存中…(img-YJaRYwZ6-1711994936049)]