代码改变世界

算法第三章上机实践报告

2018-11-10 13:56  linzexuan  阅读(262)  评论(0编辑  收藏  举报

第三章上机实践报告

 

1.     实践题目

7-3 编辑距离问题 (30 分)

 

2.     问题描述

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。

输入格式:

第一行是字符串A,文件的第二行是字符串B。

提示:字符串长度不超过2000个字符。

输出格式:

输出编辑距离d(A,B)

 

3.     算法描述

递归方程

m = a.length();

n = b.length();

d [ i ] [ j ]  = d [ i – 1] [ j – 1] ,   (A [ a – 1 ] = B [ b – 1 ] )

d [ i ] [ j ] = min ( d [ i ] [ j – 1] + 1 , d [ i – 1 ] [ j ] + 1 , d [ i – 1 ] [ j – 1] + 1) ,  ( A [ a – 1] != B [ b – 1] )

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[2000],b[2000];
int d[2000][2000];
int main()
{
    cin>>a;
    cin>>b;
    int m=strlen(a);
    int n=strlen(b);
    for(int i=1;i<=m;i++)    d[i][0]=i;
    for(int j=1;j<=n;j++)    d[0][j]=j;
    for(int i=1;i<=m;i++)
      for(int j=1;j<=n;j++)
          if(a[i-1]==b[j-1])    d[i][j]=d[i-1][j-1];
          else d[i][j]=min(min(d[i-1][j-1],d[i-1][j]),d[i][j-1])+1;
    cout<<d[m][n];
    return 0;
        
} 

 

4.     算法时间及空间复杂度分析

时间复杂度:T(n) = a + b + a * b

所以时间复杂度 O( a * b );

空间复杂度:整个算法在计算过程中新定义了一个存储编辑距离的数组d[a][b]

                     所以空间复杂度为 O(a * b)

 

5.     心得体会(对本次实践收获及疑惑进行总结)

在7-3这道题中,起初的想法是先求出字符串A和字符串B的公共最长子序列长度m ,最短编辑距离 = B.length() – m。在与结对同伴的讨论之后,这种方法存在问题,如:当字符串A 为abcdef 字符串B 为 ascdef 时,d(A, B) = 1, 而按照上述想法的结果 d(A, B) = 2。

本章的动态规划,对问题分析和解决问题的方法对个人来说是一个很大的难点。

动态规划的基本方法:

1) 找出最优解的性质,并刻画其结构的特征

2) 递归定义最优值,写出递归方程

3) 思考表的维数,范围和根据递归方程按照什么顺序填

4) 根据计算最优值时得到的信息,构造最优解