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

news2024/9/23 23:33:12

目录

编辑距离:

举例:

代码如下

调试:

核心代码:

画图演示上述代码:


编辑距离:

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

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

举例:

现有两个字符串

字符串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;
}

调试:

通过运行,可知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

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]

即选出图上三个数的最小的那个数,并且加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

 4.重复上面的操作

 

 

d[ len1 ] [len2 ]的值为两个字符串的编辑距离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度神经网络模型部署——Docker学习

容器技术中有三个核心概念&#xff1a;容器&#xff08;Container&#xff09;、镜像&#xff08;Image&#xff09;&#xff0c;以及镜像仓库&#xff08;Registry&#xff09; 从本质上来说&#xff0c;容器属于虚拟化技术的一种&#xff0c;和虚拟机&#xff08;Virtual Mac…

CentOS7安装vsftpd

CentOS7安装vsftpd 最近又用到ftp了&#xff0c;摸索了一下终于安装成功&#xff0c;记录下安装过程&#xff0c;本次使用的操作系统为 CentOS7&#xff0c;ftp使用vsftpd。 安装vsftpd yum install -y vsftpd配置vsftpd vsftpd的配置文件路径为&#xff1a;/etc/vsftpd/vs…

软件测试基础面试题大全(上)

1. 软件生命周期是什么&#xff1f; 软件生命周期&#xff1a;需求调研&#xff08;可行性研究&#xff09;、需求分析&#xff08;需求规格说明书&#xff09;、设计&#xff08;系统架构、模块设计、表结构设计、接口设计等&#xff0c;产出概要设计文档和详细设计文档&…

表达式求值问题-双栈模板化实现

好久不见&#xff0c;真的很久都没有更新博客了&#xff0c;最近很多事情&#xff0c;所以比较忙碌&#xff0c;没有时间每天都学算法&#xff0c;但是我会挤时间尽量做到&#xff0c;每两三天就更新博客&#xff0c;我会努力的&#xff0c;加油~ 前言&#xff1a;计算器都见过…

加码本地生活、成为“万能入口”,抖音完成了百度曾经的梦想

文|螳螂观察 作者| 小别 前有美团点评&#xff0c;后有阿里巴巴&#xff0c;本地生活服务从来就不平静。 并没有在最好的时间出发的抖音&#xff0c;还是顺着短视频的内容优势&#xff0c;从团购、本地游、外卖再到近期推出商城频道&#xff0c;逐步完善了本地生活服务的布局…

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache Tomca…

linux命令文本命令之~~~ sort ~~ tr ~~cut ~~ uniq

目录 一. sort命令二. uniq 命令三. tr命令四. cut命令 一. sort命令 以行为单位对文件内容进行排序&#xff0c;也将他根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码进行比较&#xff0c;最后按照升序输出排序 语法格式&#xff1a; sort 【选…

Web自动化测试:selenium的使用以及关于driver=webdriver.Firefox()无驱动报错问题

Selenium 1.什么是Selenium&#xff1f; Selenium是一个用于Web应用程序测试的工具。 主流的自动化测试工具有&#xff1a; web自动化测试&#xff1a;selenium、robot frameworkApp端自动化测试&#xff1a;Appium、Monkeyrunner、UIautomationPC客户端&#xff08;win32&…

打印机错误0x00000bc4,Win11系统找不到打印机怎么办

近期&#xff0c;又有不少小伙伴更新了Win11系统后&#xff0c;出现了打印机提示错误代码0x00000bc4&#xff0c;出现错误后&#xff0c;可能导致打印机无法正常工作&#xff0c;打印任务无法完成&#xff0c;或者打印机无法连接到电脑等问题。驱动人生就为大家带来打印机错误0…

使用docker部署wiki.js

安装docker这些就不讲了&#xff0c;教程一堆&#xff0c;相关的安装教程可以去官网看&#xff0c;只是没那么详细&#xff0c;尤其是有关数据库的配置&#xff1a;Docker 部署 Wiki.js pull wiki镜像&#xff1a; docker pull ghcr.io/requarks/wiki 如果是arm的机器&#xf…

Oracle存储过程~封神之作

简介 Oracle 存储过程是 Oracle 数据库中的一种数据处理对象&#xff0c;它可以在数据库中定义一组预定义的 SQL 语句&#xff0c;用于完成特定的数据库操作。存储过程可以被授权的用户调用&#xff0c;并且可以执行多个语句&#xff0c;这些语句可以被视为一个单独的操作&…

【逗老师的无线电】快速记录一下MMDVM串口屏相关

最近在研究MMDVM的串口屏&#xff0c;设计知识点比较多&#xff0c;本文先随手记一下&#xff0c;同时随时更新&#xff0c;最后形成完整的文档 一、Nextion和国内串口屏设计 MMDVM默认对接的是Nextion屏幕。但是有人跟我说&#xff0c;NXT的屏幕和国内陶晶驰的屏幕就是一个…

每周一算法:差分算法

差分算法 差分是一种常见的算法&#xff0c;用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组&#xff0c;然后修改区间时&#xff0c;只需要修改两个位置的值&#xff0c;即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区…

kafka安装及配置

1. 下载 下载地址&#xff1a;Apache Kafka 我这里下载的是 3.2.1 版本。 2. 上传并解压 上传到 linux 下的 /home/software/ 目录下&#xff0c;然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/ cd /home/software tar -zxvf kafka_2.13-3.2.1.tgz -C /usr/local # -C 选…

【机器学习】信息量、香农熵、信息增益(增加例子,方便理解)

这节可以搭配 【机器学习】Logistic回归&#xff08;重新整理&#xff09;信息量&#xff08;信息&#xff09;信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归&#xff08;重新整理&#xff09; B站视频&#xff1a;“交叉熵”如何做损失函数&#xff1f;打包…

医学影像系统源码,三维后处理和重建 PACS源码

医学影像系统源码&#xff0c;三维后处理和重建 PACS源码 医学影像系统由PACS系统、RIS系统组成&#xff0c;提供与HIS的接口&#xff08;HL7或其他类型&#xff09;。 主要功能介绍 信息预约登记 支持对患者、检查项目、申请医生、申请单据、设备等信息进行管理。且支持检查…

Apache网站部署SSL证书开启https访问,强制http跳转https

centos服务器博客网站安装教程可见&#xff1a;Centos 7.X WordPress博客网站详细教程 FTP/PHP/mysql/Apache环境构建_autotian的博客-CSDN博客本文详细的介绍了centos7.x系统下&#xff0c;如何构建FTP、mysql、PHP、Apache环境&#xff0c;并成功安装WordPress博客网站。http…

Java—JDK8新特性—函数式接口【内含思维导图】

目录 3.函数式接口 思维导图 3.1 什么是函数式接口 3.2 functionalinterface注解 源码分析 3.3 Lambda表达式和函数式接口关系 3.4 使用函数式接口 3.5 内置函数式接口 四大核的函数式接口区别 3.5.1 Supplier 函数式接口源码分析 3.5.2 Supplier 函数式接口使用 3.…

基于AT89C51单片机的篮球计时记分设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87771065 源码获取 主要内容: 基于51单片机设计篮球计时计分器,结合单片机串行接口原理,用AT89C51设计一个篮球比赛计分计时器,能够通过数码管显示分数和比赛时间(并设有…

linux驱动-gpio

最近处理es8336声卡问题&#xff0c;最后排查是spk_ctl_gpio和hp_det_gpio这两个gpio导致的&#xff0c;所以恶补了一下gpio相关的知识&#xff0c;现在总结一下。 源代码使用的是飞腾的gitee上开源的内核&#xff1a;https://gitee.com/phytium_embedded/phytium-linux-kernel…