Edit distance problem 动态规划和递归解法之比较

动态规划 求解 Minimum Edit Distance 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit Distance, 也称Levenshtein distance。受到一篇Edit Distance介绍文章的启发,本文用动态规划求取了两个字符串之间的minimal Edit Distance. 动态规划方程将在下文进行讲解。 1. what is minimal edit distance?简单地说,就是仅通过 阅读详情

问题:


给定字符串firstStr,secondStr,长度分别为m,n。通过delete, insert, replace 操作把firstStr转化为secondStr,而这三种操作的每次执行成本分别为delCost, insCost, repCost。求完成这种转换的最小成本。



解决方案:


1. 递归(recursive)

base condition:用于终止递归, 当m == 0 || n == 0;

Mincost( firstStr, secondStr, m, n, delCost, insCost, repCost ) = 

      min{ Mincost( firstStr, secondStr, m - 1, n, delCost, insCost, repCost ) + delCost,                                                                                                                                                          Mincost( firstStr, secondStr, m, n-1, delCost, insCost, repCost )+ insCost,

                 Mincost( firstStr, secondStr, m - 1, n-1, delCost, insCost, repCost)+ repCost };

2.动态规划(dynamic programming)

引入成本数组cost[m][n]:代表把长度m的字符串转成长度为n的字符串的成本;

建立递推关系:cost[m][n] = min{ cost[m-1][n] + delCost, cost[m][n-1] + insCost, cost[m-1][n-1] + repCost };


两种方法的比较的区别很明显:

1.递归计算整个搜索过程最终会形成一棵树,这颗树不同树枝之间会有很多重复的计算,最终导致了性能很差;

  2.动态规划会把许多计算结果缓存到cost数组里,虽然有个空间的开销,但是算过的不用再计算,直接查表即可,

       所以动态规划算法有很好的性能表现


代码如下:

#ifndef _EDIT_DISTANCE_H_
#define _EDIT_DISTANCE_H_

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

/*
*helper function
*
*/
int minVal( int a, int b )
{
	return ( a < b ) ? a : b;
}

/*
*helper function
*
*/
inline int minnum( int a, int b, int c )
{
	return minVal( minVal(a, b), c );
}


/*
*implementation of recursive for edit distance problem
*
*/
int EditDistanceRecur( const char* firstStr, const char* secondStr, int firstPos, int secondPos, int delCost, int insCost, int rapCost )
{
	if( 0 == firstPos && 0 == secondPos )
		return 0;

	if( 0 == firstPos )
		return secondPos;

	if( 0 == secondPos )
		return firstPos;

	int del = EditDistanceRecur( firstStr, secondStr, firstPos - 1, secondPos, delCost, insCost, rapCost ) + delCost;
	int insert = EditDistanceRecur( firstStr, secondStr, firstPos, secondPos - 1, delCost, insCost, rapCost  ) + insCost;
	int replace = EditDistanceRecur( firstStr, secondStr, firstPos - 1, secondPos - 1, delCost, insCost, rapCost  );
	if( firstStr[firstPos - 1] != secondStr[secondPos - 1] )
		replace += rapCost;

	return minnum( del, insert, replace );
}


/*
* interface function 
*
*/
int FindEditDistance( const char* strfirst, const char* strsecond, int delCost, int insCost, int rapCost )
{
	return EditDistanceRecur( strfirst, strsecond, strlen( strfirst ), strlen( strsecond ), delCost, insCost, rapCost );
}


/*
* implementation of dynamic programming for edit distance problem
*
*/
int EditDistanceDP( const char* firstStr, const char* secondStr, int delCost, int insCost, int rapCost )
{
	size_t firstLen = strlen( firstStr );
	size_t secondLen = strlen( secondStr );

	int** table = new int*[ firstLen + 1];
	for( int i = 0; i <= firstLen; i++ )
	{
		table[i] = new int[ secondLen + 1];
		memset( table[i], 0x00, sizeof(int)*( secondLen + 1 ) );
	}

	//base condition
	for( int i = 0; i <= secondLen; i++ )
	{
		table[0][i] = i * insCost;
	}

	for( int i = 0; i <= firstLen; i++ )
	{
		table[i][0] = i * delCost;
	}

	for( int i = 1; i <= firstLen; i++ )
	{
		for( int j = 1; j <= secondLen; j++ )
		{
			int deleteCost = table[i][j-1];
			deleteCost += delCost;

			int insertCost = table[i-1][j];
			insertCost += insCost;

			int replaceCost = table[i-1][j-1];
			if( firstStr[i] != secondStr[j] )
				replaceCost += rapCost;


			table[i][j] = minnum( deleteCost, insertCost, replaceCost );
		}
	}

	int res = table[firstLen][secondLen];

	for( int i = 0; i <= firstLen; i++ )
	{
		delete [] table[i];
	}

	if( table )
	{
		delete [] table;
	}

	return res;
}

/*
* test method
*
*/
void TestEditDistance()
{
	const char* first = "adddfooiedfafa";
	const char* second = "adafsadoiddf";

	
	int delCost = 1;
	int insCost = 2;
	int rapCost = 3;

	printf("Minimum cost  %d by dynamic programming \n",
		    EditDistanceDP( first, second, delCost, insCost, rapCost ) );
	printf("Minimum cost  %d by recursive \n",
			first, second, FindEditDistance( first, second, delCost, insCost, rapCost ) );

	getchar();


}


#endif 


                                 


Edit-Distance-Problem:给定两个字符串str1和str2以及以下可以在str1上执行的操作。 查找将'str1'转换为'str2'所需的最少编辑(操作)次数。 编辑距离问题 给定两个字符串str1和str2以及以下可以在str1上执行的操作。 查找将'str1'转换为'str2'所需的最少编辑(操作)次数。 插 去掉 代替 我找到了最少数量的编辑操作需求,并且也打印了一些操作。 立即下载

相关推荐

编辑距离算法,比较字符串相似度

编辑距离算法,比较字符串相似度 pb11.5版本

编辑距离问题(Edit Distance Problem)

问题描述 设A和B是两个字符串,要用最少的字符操作将字符串A转换成字符串B。这里所说的字符操作包括 1)删除一个字符; 2)插入一个字符; 3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数成为字符串A到B的编辑距离,记为d(A,B)。对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。 问题分析 这是一道DP问题,DP问题的核心是“全局...

weixin_30682127的博客 844

【无线通信】射频杂散(RF Spurious Emissions)

射频杂散(RF Spurious Emissions)是指在无线通信系统中,除了在指定频率范围内的预期信号之外,任何不需要的或非预期的射频信号。这些杂散信号可能会干扰其他通信系统,降低系统性能,并违反无线电通信法规。射频杂散通常包括谐波、次谐波、互调产物和其他非线性失真所产生的信号。

qq_38801607的博客 5427

编辑距离(Edit Distance)的原理,利用递归以及动态规划的实现。

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34336292的博客 751

Matlab子图排版终极指南:从tight_subplot到tiledlayout的实战对比

本文深入对比Matlab中两大子图排版工具:社区经典函数tight_subplot与官方现代布局管理器tiledlayout。针对默认subplot产生的子图间距与边缘距离问题,详细解析两者的设计哲学、参数控制与实战应用,帮助用户根据版本与需求选择最佳方案,实现高效、精确且美观的多子图排版。

weixin_29048309的博客 360

AHB不对称半桥反激电路设计(三)主要器件参数规格计算

本文介绍了AHB拓扑变压器的设计步骤与核心参数计算,包括主控芯片选择、工作原理分析及参数计算。作者选择DK87XXD集成MOS方案,详细阐述了输入电压范围、反射电压限定、匝比计算、工作频率设定、原副边电流值、电感量计算、磁芯选择、匝数计算、谐振电容设计等关键步骤。通过公式推导与实例计算,展示了150W电源的变压器设计过程,最终确定匝比5.5、原边22匝、副边4匝、电感量200uH等参数。文章还讨论了谐振电容与漏感的关系,为后续调试提供理论基础。该设计方法结合理论分析与工程实践,适用于AHB拓扑电源开发。

【Simon】的博客 3338

动态规划之编辑距离(Edit Distance)

原文地址:Dynamic Programming | Set 5 (Edit Distance) 已知两个字符串str1与str2,str1可以用下面的操作。得到最小的编辑数使得str1转变为str2。 a)insert b)remove c)replace 以上所有的操作成本是一样的。例子:Input: str1 = "geek", str2 = "gesek" Output: 1

K.Sun 2110

28、解耦控制与晶圆表面缺陷模式识别

本文介绍了两种不同领域的技术方法:基于端口受控哈密顿(PCH)的三水箱液位系统解耦控制方法,以及基于无监督学习的晶圆表面缺陷模式识别方法。前者通过能量整形实现系统解耦与稳定控制,具有良好的抗干扰性和鲁棒性;后者采用无监督预训练与分类微调两阶段策略,利用WaUSM采样方法提升特征提取能力,在WM-811K数据集上实现了先进的分类性能。文章对比了两种方法的核心技术与优势,并探讨了其在工业控制与半导体制造中的应用前景及未来发展方向,为相关领域的研究与实践提供了有价值的参考。

git9versioner的博客 75

从入门到精通动态规划:4个模板吃透LintCode 40+道DP经典题

LintCode 是经典算法训练平台,而本仓库 **LintCode**(C++11 题解集)收录了 LintCode 全部 289 道题的完整解法。动态规划(Dynamic Programming,简称 DP)是面试和竞赛中的"重灾区",本文用 **4 个模板** 带你一次吃透仓库中 **40+ 道 DP 经典题**,从爬楼梯到戳气球,一篇搞定。🚀 ## 30秒看懂动态规划:为什么它能"化繁

gitblog_00409的博客 355

Allegro 中复制一部分PCB到另一个PCB中去

引言:自从学了allegro后,我每天快乐地再拉线,一开心肯定出事情。不料今天一高兴,把本来在5层的铜皮直接在4层画起来了。不过,幸好我知道换层,才省了又要画铜皮的时间。好了,开干,如果要将其他层的铜皮换到想要换到的层上,就需要这个命令。

tianpu2320959696的博客 970

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

Jedis测试完全指南:单元测试、连接Mock与集成测试最佳实践

Jedis 是 Redis 的官方 Java 客户端,本指南带你快速掌握 Jedis 的三层测试体系:无需服务器的单元测试、用 Mockito 拦截命令的连接 Mock 测试,以及基于 Docker 一键启动的一键集成测试,并给出可直接上手的命名规范与最佳实践。 [![Jedis Redis Java 客户端单元测试与集成测试完全指南](https://raw.gitcode.com/gh_mi

gitblog_01054的博客 261

Microsoft AI SDK 与 SAP ABAP:让企业级 AI 能力触手可及的深度整合指南

借助 Microsoft AI SDK,ABAP 开发者无需跳出熟悉的事务码与数据字典,就能把 GPT‑4 的强大语言理解与生成能力深度植入采购、销售、财务等核心业务流程。只要掌握“初始化 SDK → 构造 Prompt → 解析输出”这一范式,未来无论 Azure OpenAI、OpenAI 还是本地化 LLM,都能在同一套代码骨架内快速切换,实现真正的“AI 即服务”。现在,就让我们在下一行 ABAP 里拥抱智能未来。参考链接均于 2025‑07‑22 提取,推荐读者结合实际版本进一步验证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 433

动态规划(DP)从入门到精通:450-DSA-Questions 解题思路与代码示例

动态规划(Dynamic Programming,简称DP)是解决复杂问题的高效算法思想,通过将问题分解为重叠子问题并存储中间结果,避免重复计算。450-DSA-Questions项目提供了丰富的DP实战题目,本文将带你从基础概念到高级应用,掌握动态规划的核心解题技巧。 ## 一、动态规划的核心原理与适用场景 动态规划的本质是**用空间换时间**,其核心步骤包括: 1. **定义状态**:将问

gitblog_00547的博客 450

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 885

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

DP之编辑距离

动态规划 编辑距离问题(Edit Distance Problem) 网址链接:https://algorithms.tutorialhorizon.com/dynamic-programming-edit-distance-problem/ 目标: 给定两个字符串s1, s2,写出一个算法来找出从s1转化到s2所需要的最小操作步骤数(编辑距离)。 所允许的操作: Insert(插入)——插入一个新的字符 delete(删除)——删除一个字符 replace(替换) ——替换为另一个字符 例子:

不管风雨有多少丶的博客 268

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

两个字符串的编辑距离-动态规划方法

概念 字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括: 删除一个字符     a) Insert a character 插入一个字符     b) Delete a character 修改一个

ac540101928的专栏 3万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Edit Distance

动态规划、找到将word1转化为word2的最小操作数。

不积跬步无以至千里 638

行编辑距离Edit Distance——动态规划

题目描述: 给定一个源串和目标串,能够对源串进行如下操作:  1. 在给定位置上插入一个字符  2. 替换任意字符  3. 删除任意字符 写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。 思路: 设状态dp[i][j] 表示从源串s[0...i] 和 目标串t[0...j] 的最短编辑距离 边界为:dp[i][0] =

TommyZht的专栏 985

编辑距离(Edit Distance)的动态规划算法

编辑距离是衡量两个字符串S和T相似程度的一种度量方法。 编辑距离定义:将字符串S通过插入、删除、替换三种编辑操作,转变为字符串T,所需最少的编辑次数。 计算编辑距离的问题,符合动态规划的几个特征: 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。无后

==.== 1万+

Edit Distance(动态规划)

Edit Distance 题目 Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2. You have the following 3 operations permitted on a word: Insert a character ...

Vilin的博客 1750

72. Edit Distance

https://leetcode.com/problems/edit-distance/description/ 求两个单词的编辑距离 可以替换、删除和插入 思路:dp。主要想法就是已知word1[0…i-2]转换到word2[0…j-2]的距离,在此基础上求word1[0…i-1]转换到word2[0…j-1]的距离。 分几种情况讨论,word1[i-1]与word2[j-1]相等,或者...

caisense的专栏 274

Edit Distance(动态规划,难)

Given two wordsword1andword2, find the minimum number of steps required to convertword1toword2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: ...

weixin_34377065的博客 151

编辑距离Edit distance

http://blog.youkuaiyun.com/pipisorry/article/details/46383947编辑距离Edit distance-序列之间的距离我们知道,汉明距离可以度量两个长度相同的字符串之间的相似度,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离(Edit distance, Levenshtein dist

皮皮blog 6643

LeetCode - 72. Edit Distance(编辑距离问题)(三个依赖的滚动优化)

LeetCode-72. Edit Distance(编辑距离问题)(三个依赖的滚动优化) 记忆化 二维dp 一维dpO(M) 一维dpO(min(N,M)) 加强问题(ic,dc,rc) 题目链接 记忆化 使用递归的解法: 从两个字符串的最后的位置开始考虑: 如果最后两个字符(i,j)相等,最后两个字符就不要配对,所以等于minDistance(s1[0..i-1]...

zxzxin的博客~ 2009
上一篇: C实现的内存chunk管理器
下一篇: 格子取数问题的动态规划和递归解法之比较
manthink2005
博客等级 码龄18年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值