码迷,mamicode.com
首页 > 编程语言 > 详细

算法第三章实践报告

时间:2018-11-11 15:59:33      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:++   复杂   第三章   文件的   输出   通过   问题   收获   插入   

算法第三章 实践报告

1.实践题目

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

设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)

输入样例:

在这里给出一组输入。例如:

fxpimu

xwrs

输出样例:

在这里给出相应的输出。例如:

5

 

  

2.问题描述

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

 

3.算法描述

运用动态规划的思想,用数组d[i][j]记录从a到b的编辑距离。

当i=0时,表示数组a中有0个元素,则d[0][j]=j,

当j=0时,表示数组b中有0个元素,则d[i][0]=i.

递归方程为 d[i][j] = d[i-1][j-1]  (当a[i-1]=b[j-1]时),

D[i][j] = min{ d[i-1][j-1]+1,d[i][j-1]+1,d[i-1][j]+1} 

(当a[i-1]!=b[j-1]时)

min中的三项依此对应修改、插入和删除三种操作。

部分代码:

     int lena = strlen(a);

     int lenb = strlen(b);

     for(int i=0;i<=lena;i++){

          d[i][0] = i;

     }

     for(int i=0;i<=lenb;i++){

          d[0][i] = i;

     }

     for(int j=1;j<lenb+1;j++){

          for(int i=1;i<lena+1;i++){

               if(a[i-1]==b[j-1]) {

                   d[i][j] = d[i-1][j-1];

              }

               else {

                   d[i][j] = min(d[i-1][j-1]+1,d[i][j-1]+1,d[i-1][j]+1);

              }

          }

     }

     cout<<d[lena][lenb];

4.算法时间及空间复杂度分析(要有分析过程)

因为有两重循环,所以算法的时间复杂度为O(lena*lenb)

开设了一个二维数组,所以算法的空间复杂度为O(lena*lenb)

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

在本次实践中,再次运用了动态规划的思想,最后发现这道题的算法和求解最长公共子序列的算法有相似之处。只不过最长公共子序列是从两字符串的后面开始比较,而这道题从两字符串的开头开始比较,比较有利于填写d[i][j]。同时在编写程序的过程中,一开始没有注意数组下标这方面的细节所以导致了运行出错,后来通过具体的例子,画出对应的编辑距离的二维数组,这样才把下标使用对了。

算法第三章实践报告

标签:++   复杂   第三章   文件的   输出   通过   问题   收获   插入   

原文地址:https://www.cnblogs.com/lindsey-17/p/9942160.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!