算法第三章作业

                     编辑距离问题
1.问题描述:
  设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。
先考虑特殊情况,有三种:
1)s为空,t不为空;
2)t为空,s不为空;
3)s与t相等;
对于第一第二种情况,即在i等于0时,也就是说s为空,增加j个字符,使得s转化为t,在j等于0时,也就是说t为空,就是减少 i个字符,使得s转化为t。对于第三种情况,显然d(A,B)=0。
算法描述:
矩阵设为d[i][j],保存从S[0:i]变到t[0:j]的编辑距离。这里S[0:i]变到t[0:j]有三种情况,要求出这三种情况的最小值作为最小操作数。分别为:
(1)设可以在k1个操作内将s[0:i-1]转换为t[0:j],用k1+1次操作将s[0:i]转化为t[0:j],只需要先在“s[0:i]转化为t[0:j]”的操作开端做1次移除操作移除s[i]将s[0:i]转化为s[0:i-1],然后再做k1个操作就可以转换为t[0:j]。对应表格,既矩阵所求d[i][j]的左格。
(2)设可以在k2个操作内将s[0:i]转换为t[0:j-1],用k2+1次操作将s[0:i]转化为t[0:j],先用k2次操作将s[0:i]转化为t[0:j-1],然后再执行1次插入操作在“s[0:i]变成t[0:j-1]的操作”的末尾插入“增加t[j]”的一次操作,即可将s[0:i]转化为t[0:j]。对应表格,既矩阵所求d[i][j]的上格。
(3)设可以在k3个操作内将s[0:i-1]转化为t[0:j-1] ,若s[i]==t[j],S[0:i]变到t[0:j]就只要k3个操作,若s[i]!=t[j],则需1次换操作加在s[0:i-1]转化为t[0:j-1]的操作数基础上就可以将S[0:i]变到t[0:j],共k3+1次。对应所求d[i][j]的左上格。
递归式:
   d[j][i] =min(d[j-1][i-1]+1,min(d[j][i-1] + 1,d[j-1][i] + 1 ))  , (s[i-1]!=t[j-1])  1<=i<=m,1<=j<=n
   d[j][i] =min(d[j-1][i-1],min(d[j][i-1] + 1,d[j-1][i] + 1 ))   ,(s[i-1]==t[j-1])  1<=i<=m,1<=j<=n
先根据特殊情况初始化边界:

 


再按自上而下,自左而右的方式填表:

 根据填表过程可得:

时间复杂度:O(M*N)

空间复杂度:O(M*N)
2.对于动态规划的问题,解决问题前得思考好各种可能出现的情况,并且写好三步:
      子问题标识符的含义;
      子问题递归公式;
      原问题最优解;
3.结对编程过程中我们先分别编程,队员用了贪心的思想导致根源性错误,而我用了递归的思想所以被要求用填表的方式做,最后做了出来。动态规划难在确定dp数组的含义,可能为一二维,甚至三维(暂时没遇到),和其状态转移方程的填写。填表应先把边界填好再开始填复杂情况。
posted @ 2020-10-26 21:17  严东高  阅读(113)  评论(0编辑  收藏  举报