一、 实践题目
第三题:最小编辑距离
二、 问题描述
输入两个字符串,通过增,删,改的方式(每种操作使用一次算一次距离),现在计算两个字符串至少通过几个操作实现由其中一个字符串变为另一个字符串,这个数就是最小编辑距离。
三、 算法描述
1.关键部分算法描述:
for(int i=0;i<=len1;i++){
c[0][i] = i;
}
for(int i=0;i<=len2;i++){
c[i][0] = i;
}
int flag = 0;
for(int i=1;i<=len2+1;i++){
for(int j=1;j<=len1+1;j++){
if(b[i-1]==a[j-1])
{
c[i][j] = min(c[i-1][j]+1,min(c[i][j-1]+1,c[i-1][j-1]));
}
else
{
c[i][j] = min(c[i-1][j]+1,min(c[i][j-1]+1,c[i-1][j-1]+1));
}
}
}
- 以字符串a=”abcd”,b=”adf”,为例解释。
实际上使用到的核心算法是动态规划,通过建立一个表,得出结果;公式如下:
0 ; i=0,j=0
j ; i=0;j>0
F(a,b) i ; i>0;j=0
Min(c[i-1][j]+1,c[i][j-1]+1,c[i-1][j-1]+1) i>0,j>0,a[i]!=b[j]
Min(c[i-1][j]+1,c[i][j-1]+1,c[i-1][j-1]) i>0,j>0,a[i]==b[j]
|
# |
a |
b |
c |
d |
# |
0 |
1 |
2 |
3 |
4 |
a |
1 |
|
|
|
|
b |
2 |
|
|
|
|
f |
3 |
|
|
|
|
关键在于理解比较长两个的式子,这个表应该从左上角开始填,每个空格的数值取决于它的左右和左上角的格子,如果我们的字符串的该格子的字符相同就不需要进行修改,所以不用加一,所以通过比较三个方式得到的数值,取最小就好了。
四、 算法时间及空间复杂度分析(要有分析过程)
时间复杂度:O(h)=O(len(a)*len(b))
最深的那层嵌套就是了;
空间复杂度:0(n) = len(a)*len(b)
所填表格的大小。
五、 心得体会(对本次实践收获及疑惑进行总结)
1.更深一步理解了动态规划,动态规划可以有效地减少不必要的重复计算,从而快速得到最优解。
2.注意main函数中不能申请太大的数组,要把这些定义到外面。