【软考|软件设计师】编辑距离算法

news2024/9/23 3:33:11

目录

 编辑距离算法:

步骤:

实例:

题:

完整代码如下:

调试:

代码解析:

具体过程参考: 

 编辑距离算法:

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

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

步骤:

假设我们要将字符串s1转换成另一个字符串s2 。

编辑距离算法通过计算以下三种操作的数量来确定所需的最小变换步骤数:

插入(Insertion)操作:在字符串s1中插入一个字符,以使其与s2一致。

删除(Deletion)操作:从字符串s1中删除一个字符,以使其与s2一致。

替换(Substitution)操作:将字符串s1中的一个字符替换为另一个字符,以使其与s2一致。

实例:

字符串s1:  "CTGA"

字符串s2:   "ACGCTA"

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

题:

    生物学上通常采用编辑距离来定义两个物种DNA序列的相似性,从而刻画物种之间的进化关系。具体来说,编辑距离是指将一个字符串变换为另一个字符串所需要的最小操作次数。操作有三种,分别为:插入一个字符、删除一个字符以及将一个字符修改为另一个字符。用字符数组str1和str2分别表示长度分别为len1和len2的字符串,定义二维数组d记录求解编辑距离的子问题最优解,则该二维数组可以递归定义为:
 

【C代码】
下面是算法的C语言实现。
(1)常量和变量说明
  A,B:两个字符数组
  d:二维数组
  i,j:循环变量
  temp:临时变量
(2)C程序

#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;
int diff;
int temp;
for(i=0; i<=len1; i++){
d[i][0]=i;
}
for(j=0; j<=len2; j++){
(1) ;
}
for(i=1;i<=len1;i++){
for(j=1; j<=len2; j++){
if( (2) ){
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, (3) );
 }
 }
 }
return (4) ;
}

【问题1】
根据说明和C代码,填充C代码中的空(1)~(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;
}

调试:

代码解析:

#include <stdio.h>

#define N 100

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

这两行代码分别定义了两个长度为N的字符数组A和B,并初始化为字符串"CTGA"和"ACGCTA
int d[N][N];

这一行代码定义了一个N*N的二维数组d,用于保存计算过程中生成的编辑距离矩阵。

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

这一段代码定义了一个min的函数,用于计算两个整数的最小值

int editdistance(char *str1, int len1, char *str2, int len2){

这行代码定义了一个名为editdistance的函数,

一个指向字符的指针str1,表示第一个字符串的起始位置

一个整数值len1,表示第一个字符串的长度

一个指向字符的指针str2,表示第二个字符串的起始位置

一个整数值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]) {

判断字符串str1中的第i个字符(因为数组的指针从0开始,所以i-1表示第i个字符)与

字符串str2中的第j个字符是否相同,如果相同就执行下列语句块。

递归计算矩阵中每个格子的值
                d[i][j] = d[i - 1][j - 1];

具体过程参考:

 https://mp.csdn.net/mp_blog/creation/editor/130600188
         

  } 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;
}


【问题2】
根据说明和C代码,算法采用了(动态规划法)设计策略,时间复杂度为(m*n)(用O符号表示,两个字符串的长度分别用m和n表示)。
【问题3】
已知两个字符串A="CTGA"和B="ACGCTA",根据说明和C代码,可得出这两个字符串的编辑距离为(4)。

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

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

相关文章

现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群

最近遇到的疑难现场问题层出不穷&#xff0c;本次遭遇的挑战是在4台windows Server 服务器上部署Kafka集群。这是一种比较少见的操作&#xff0c;原因是有些依赖的驱动对虚拟化支持不好&#xff0c;只能运行在实体win机上。 原有的上层业务是由B团队开发运维&#xff0c;现在B…

今年的博客数量上两百了

今年的博客数量上两百了 不知不觉在 C S D N CSDN CSDN中写了那么多篇文章。与 C S D N CSDN CSDN相伴的生活中&#xff0c;我过得很充实。

并发编程10:Java对象内存布局和对象头

文章目录 10.1 面试题10.2 Object object new Object()谈谈你对这句话的理解&#xff1f;10.3 对象在堆内存中布局10.3.1 权威定义----周志明老师JVM10.3.2 对象在堆内存中的存储布局 10.4 再说对象头的MarkWord10.5 聊聊Object obj new Object()10.5.1 运行结果展示10.5.2 压…

C++入门(命名空间、缺省参数、函数重载、引用、内联函数)

全文目录 引言C输入与输出命名空间概念使用使用域作用限定符::使用某个成员使用using namespace 引入整个命名空间域使用using引入某个成员 缺省参数概念分类 函数重载定义与调用原理 引用定义需要注意 使用引用作为返回型参数引用作为返回值 引用与指针的区别 内联函数总结 引…

华为OD机试真题 Java 实现【猜字谜】【2023Q2】

一、题目描述 小王设计了一人简单的清字谈游戏&#xff0c;游戏的迷面是一人错误的单词&#xff0c;比如nesw&#xff0c;玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序以后一样的&…

np保存数据为txt或者csv格式

目录 1、基础参数 2、参数详解 2.1、fmt 2.2、delimiter 2.3、newline 2.4、header 1、基础参数 numpy.savetxt(fname,arrry,fmt%.18e,delimiter ,newline\n,header,footer,comments# ,encodingNone,) 2、参数详解 fname:要存入的文件、文件名、或生成器。arrry:要存储…

xxl-Job分布式任务调度 入门

1.概述 1.1 什么是任务调度 我们可以先思考一下业务场景的解决方案&#xff1a; 某电商系统需要在每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的…

C高级第二天

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,const char *argv[]) { int n 0, m 0, MAX 0; int arr[n][m]; printf("请输入矩阵行数、列数>>>"); scanf("%d%d", &n…

【动态规划】线性DP

目录 一&#xff1a;思考方式 二&#xff1a;例题 例题1&#xff1a;数字三角形 例题二&#xff1a;最长上升子序列​​​​​​​ 例题三&#xff1a;最长公共子序列 一&#xff1a;思考方式 线性dp就是一条线上的动态规划 二&#xff1a;例题 例题1&#xff1a;数字三…

Python基础(三)

目录 1、Python的输入函数input() 1、input函数介绍 1.1作用&#xff1a; 1.2返回值类型&#xff1a; 1.3值得存储&#xff1a; 2、input函数的基本使用 2、Python中的运算符 2.1算术运算符 2.1.1标准算术运算符 2.1.2取余运算符(%) 2.1.3幂运算符(**) 2.1.4特殊运…

分布式锁的多种实现方式

1、不使用分布式锁 synchronized (this){int stock Integer.parseInt(Objects.requireNonNull(stringRedisTemplate.opsForValue().get("stock")));if (stock > 0) {int realStock stock - 1;// 更新库存stringRedisTemplate.opsForValue().set("stock&qu…

vi编辑器的三种模式及其对应模式下常用指令

vi是Linux系统的第一个全屏幕交互式编辑工具&#xff0c;在嵌入式的 学习中是一个不可或缺的强大的文本编辑工具。 一、三种模式 命令模式 如何进入命令模式&#xff1a;按esc键 复制&#xff1a;yy nyy(n&#xff1a;行数) 删除(剪切): dd ndd 粘贴&#xff1a;p 撤销&…

【Java】java | 将可运行jar打包成exe可执行文件

一、说明 1、javafx桌面程序&#xff0c;但又不想安装jre环境 2、需要将可执行jar打包成exe 3、使用工具exe4j 二、操作步骤 1、下载exe4j https://exe4j.apponic.com/ 2、安装 说明1&#xff1a; 在d盘建个exe4j的文件夹 说明2&#xff1a; 建个output文件jar&#xff0c;存放…

计算机组成原理——计算机系统的组成

一台完整的计算机包括硬件和软件两部分&#xff0c;另外还有一部分固话的软件成为固件(Frimware)&#xff0c;固件兼具软件和硬件的特性&#xff0c;常见的如个人计算机中的BIOS&#xff0c;BIOS&#xff08;Basic Input/Output System&#xff09;是个人计算机上的一个基本输入…

React 路由

React 的路由跳转需要引用第三方的 React Router npm i react-router-dom5.2.0 React Router 分为 BrowserRouter 和 HashRouter 如果我们的应用有服务器响应 web 的请求&#xff0c;建议使用<BrowserRouter>组件; 如果使用静态文件服务器&#xff0c;建议使用<Hash…

[golang gin框架] 29.Gin 商城项目-用户登录,注册操作

一.用户登录,注册界面展示说明 先看登录,注册界面以及相关流程,再根据流程写代码,一般网站的登录,注册功能都会在一个页面进行操作,还有的是在几个页面进行操作,这里讲解在几个页面进行注册的操作,步骤如下: 登录: 1.点击 登录按钮,进入登录界面 2.在登录界面输入手机号,密码,图…

Linux内核中与“文件系统”相关的数据结构

文件系统相关的数据结构 4.1 file结构体 文件结构体代表一个打开的文件&#xff0c;系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建&#xff0c;并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后&#xff0c;内核释放这…

【Flink】DataStream API使用之源算子(Source)

源算子 创建环境之后&#xff0c;就可以构建数据的业务处理逻辑了&#xff0c;Flink可以从各种来源获取数据&#xff0c;然后构建DataStream进项转换。一般将数据的输入来源称为数据源&#xff08;data source&#xff09;&#xff0c;而读取数据的算子就叫做源算子&#xff08…

【vue3】06-vue的组件化开发-脚手架创建项目

文章目录 Vue的组件化组件化开发注册组件的方式vue全局组件vue局部组件 Vue的开发模式Vue CLI脚手架安装Vue CLI使用Vue CLI Vue的组件化 Vue是一款前端框架&#xff0c;在这个框架中&#xff0c;组件化开发是非常重要的。Vue的组件化就是将一个页面划分为多个独立的、可复用的…

LeetCode5. 最长回文子串

写在前面&#xff1a; 题目链接&#xff1a;LeetCode5. 最长回文子串 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例…