算法第三章作业
编辑距离问题
1.1 递归方程:
$$
f[i][j]=
\left\{
\begin{aligned}
&min(f[i][j-1]+1,f[i-1][j]+1,f[i-1][j-1]+(a[i]!=a[j]))&if(i>=1,j>=1) \\\
&i &if(j==0) \\\
&j &if(i==0) \\\
\end{aligned}
\right.
$$
字符串AB都是从下标1开始读入。
方程分析:
$f[i][j]$表示A中前i个字母转化为B中前j个字母所需最少操作次数。
讨论对A中第i个字符操作后,A中前i个字符串与B中前j个字符串相同。
1.在$a[i]$后增加一个字母,增加后两字符串相同,则增加的字母必然为$b[j]$。则增加前A的前i个字母与B的前j-1个字母相同。此时$f[i][j]=f[i][j-1]+1$
2.把$a[i]$删除。删除后两字符串相同,则删除前A的前i-1个字母与B的前j个字母相同。此时$f[i][j]=f[i-1][j]+1$
3.把$a[i]$修改为$b[j]$。修改后两字符串相同。则修改前A的前i-1个字母与B的j-1个字母相同。若$a[i]==b[j]$则不需要操作次数。若$a[i]!=b[j]$则需要修改,操作次数加一。
最后把三种情况取个min即可。
考虑边界情况。$i==0$时则j是多少就要在A中增加多少个字符。$j==0$时,则i是多少就要在A中删除多少个字符。
1.2给出填表法中表的维度、填表范围和填表顺序
维度是二维。每个状态只与前面的状态有关。两重循环i和j分别从1~lenA,1~lenB
1.3分析算法时间复杂度,空间复杂度
A的长度为n,B的长度为m
状态数为n*m,转移为O(1)
时间复杂度为O(n*m)。
空间复杂度为O(n*m)。
2. 你对动态规划算法的理解
设计dp方程。找到某个时候与他前一个时候的关系。来推出递归方程
3. 说明结对编程情况
还不错,比较顺利。题目交流后基本都能做出来