【算法】动态规划算法求(编辑距离)

这篇具有很好参考价值的文章主要介绍了【算法】动态规划算法求(编辑距离)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

编辑距离:

举例:

代码如下

调试:

核心代码:

画图演示上述代码:


编辑距离:

   是一种计算两个自符串之间差异程度的方法,它通过比较两个字符串之间的插入,删除和

替换操作的数量,来确定他们之间的距离。

举例:

现有两个字符串

字符串s1:”CTGA"

字符串s2:  "ACGCTA"

求s1和s2的编辑距离

字符串s1得到字符串s2 可以通过如下操作

1.  在字符串s1的C前插入A    ----------"ACTGA"

2.  在"ACTGA"字符串中,将T删除 ----------"ACGA"

3.  在"ACGA"字符G和A中插入C ----------"ACGCA"

4.  在"ACGCA"字符C和A中插入T----------"ACGCTA"

综上:字符串s1得到字符串s2至少花了4个步骤,因此字符串是s1与字符串s2之间的

编辑距离为4

代码如下

#include <stdio.h>

#define N 100

char A[N] = "CTGA";
char B[N] = "ACGCTA";
int d[N][N];

int min(int a, int b){
    return a < b ? a : b;
}

int editdistance(char *str1, int len1, char *str2, int len2){
    int i, j, temp;

    for (i = 0; i <= len1; i++) {
        d[i][0] = i;
    }
    for (j = 0; j <= len2; j++) {
        d[0][j] = j;
    }
    for (i = 1; i <= len1; i++) {
        for (j = 1; j <= len2; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                d[i][j] = d[i - 1][j - 1];
            } else {
                temp = min(d[i - 1][j] + 1, d[i][j - 1] + 1);
                d[i][j] = min(temp, d[i - 1][j - 1] + 1);
            }
        }
    }
    return d[len1][len2];
}

int main() {
    int len1 = 4, len2 = 6;
    printf("Edit distance between %s and %s is %d\n", A, B, editdistance(A, len1, B, len2));
	system("pause");
    return 0;
}

调试:

求编辑距离,算法,算法,数据结构,c语言

通过运行,可知s1,s2的编辑距离4

核心代码:

 for (i = 1; i <= len1; i++) {
        for (j = 1; j <= len2; j++) {
            if (str1[i - 1] == str2[j - 1]) {
                d[i][j] = d[i - 1][j - 1];
            } else {
                temp = min(d[i - 1][j] + 1, d[i][j - 1] + 1);
                d[i][j] = min(temp, d[i - 1][j - 1] + 1);
            }
        }
    }

此段代码为该算法最核心部分

画图演示上述代码:

1.将d[0][0]更新为0,d[ i ][ 0 ]=i,  d[ 0 ][ j ] =j

求编辑距离,算法,算法,数据结构,c语言

2.字符串s1的第一个字符是C,字符串s2的第1个字符是A,两者不相等

所以执行如下代码

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

}

 i=1,j=1时

我们要在d[0][1]  ,d[1][0],d[0][0],选出最小的值,并加1赋予d[i][j]

求编辑距离,算法,算法,数据结构,c语言

即选出图上三个数的最小的那个数,并且加1

得到

3.接下来看s1的第一个字符C,s2的第二个字符C,两者相等

此时数组的下标为d[1][2]

执行如下代码

    if (str1[i - 1] == str2[j - 1]) {
                d[i][j] = d[i - 1][j - 1];

}

将d[0][1]的值赋给d[1][2]    即d[1][2]的值为1

求编辑距离,算法,算法,数据结构,c语言

 4.重复上面的操作

 

 求编辑距离,算法,算法,数据结构,c语言

d[ len1 ] [len2 ]的值为两个字符串的编辑距离文章来源地址https://www.toymoban.com/news/detail-525109.html

到了这里,关于【算法】动态规划算法求(编辑距离)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法 | 动态规划算法(Dynamic Programming)

    上一篇文末已经提到了记忆化搜索是动态规划(Dynamic Programming)的一种形式,是一种自顶向下(Top-Down)的思考方式,通常采用递归的编码形式;既然动态规划有自顶向下(Top-Down)的递归形式,自然想到对应的另外一种思考方式 自底向上( Bottom-Up ) ,也就是本篇要写的内

    2024年02月05日
    浏览(46)
  • Java数据结构与算法----动态规划(背包篇)

    1.1.算法思路 0/1背包是动态规划、背包问题中最经典的问题啦!它主要的问题是: 给定n种物品、这n种物品的重量分别是,价值分别是 ,而你有一个容量为C的背包,请问如何求出所能拿的最大价值呢? 对于动态规划,我们先需要找到一条推导公式,然后确定边界: 我们设

    2024年02月07日
    浏览(50)
  • 数据结构与算法:动态规划(Dynamic Programming)详解

    动态规划(Dynamic Programming,简称DP) 是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划经常被用于求解优化问题。 动态规划的核心思想是将复杂问题分解为更小的子问

    2024年04月25日
    浏览(48)
  • python数据结构与算法-动态规划(最长公共子序列)

    一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如:\\\"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y,求X和Y长度最大的公共子字列。 例:X=\\\"ABBCBDE”Y=\\\"DBBCDB”LCS(XY)=\\\"BBCD\\\" 应用场景:字符串相似度比对 (1)问题思考 思考: 暴

    2024年02月08日
    浏览(53)
  • 【夜深人静学数据结构与算法 | 第十篇】动态规划

    目录 前言: 动态规划: 常见应用: 解题步骤:  动态规划的简化步骤: 案例: 509. 斐波那契数 - 力扣(LeetCode) 70. 爬楼梯 - 力扣(LeetCode) 62. 不同路径 - 力扣(LeetCode) 总结:         本文我们将为大家讲解一下动态规划的理论知识,并且会讲解几道力扣的经典例题。

    2024年02月11日
    浏览(53)
  • ​Python—数据结构与算法​---动态规划—DP算法(Dynamic Programing)

    目录 我们一路奋战, 不是为了改变世界, 而是为了不让世界改变我们。 动态规划——DP算法(Dynamic Programing) 一、🏔斐波那契数列(递归VS动态规划) 1、🐒斐波那契数列——递归实现(python语言)——自顶向下 2、🐒斐波那契数列——动态规划实现(python语言)——自底

    2024年02月10日
    浏览(40)
  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    Kadane\\\'s 算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。 算法的核心思想是通过迭代数组的每个元素,维护两个变量来跟踪局部最优解和全局最优解。 以下是Kadane’s算

    2024年03月22日
    浏览(102)
  • 【零基础】学python数据结构与算法笔记14-动态规划

    学习python数据结构与算法,学习常用的算法, b站学习链接 动态规划在基因测序、基因比对、hmm 有应用场景。 从斐波那契数列看动态规划 练习: 使用递归和非递归的方法来求解斐波那契数列。 这种非递归求斐波那契数,可以看成是一个动态规划思想,每次都会把重复子问

    2023年04月09日
    浏览(45)
  • 算法与数据结构(二十三)动态规划设计:最长递增子序列

    注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有; 也许有读者看了前文 动态规划详解,学会了动态规划的套路:找到了问题的「状态」,明确了 dp 数组/函数的含义,定义了 base case;但是不知道如何确定「选择」,也就是找不到状态转移

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包