算法设计动态规划(编辑距离)
算法设计与分析中的动态规划问题研究

算法设计与分析中的动态规划问题研究动态规划是一种常用的算法设计与分析方法,它在解决许多问题时具有较高的效率和准确度。
本文将结合实例,深入研究动态规划在算法设计与分析中的应用。
动态规划是一种通过分解问题,将大问题转换为小问题并求解小问题的方法。
它与分治法类似,但动态规划所分解的小问题可能重叠,因此可以将解决过的小问题保存起来,避免重复计算,提高效率。
动态规划常用于求解最优化问题,如寻找最大值或最小值。
一个经典的动态规划问题是背包问题。
背包问题是指给定一个背包以及一系列物品,每个物品都有自己的价值和重量。
背包的容量是有限的,我们的目标是在保持背包总重量不超过容量的情况下,选择一些物品放入背包,使得背包中物品的总价值最大。
假设我们有n个物品,背包的容量为W,我们可以使用一个二维数组dp[i][j]来表示前i个物品恰好放入容量为j的背包的最大价值。
dp[i][j]的值可以通过以下的状态转移方程得到:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])其中,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。
根据状态转移方程,我们可以通过填表的方式,自底向上地计算dp[n][W],即前n个物品放入容量为W的背包的最大价值。
除了背包问题,动态规划还可以用于求解其他类型的优化问题。
比如,在图论中,最短路径和最小生成树问题也可以使用动态规划来求解。
例如,最短路径问题可以通过定义一个二维数组dp[i][j]来表示从顶点i到顶点j的最短路径的长度。
通过状态转移方程dp[i][j] =min(dp[i][j], dp[i][k] + dp[k][j]),我们可以逐步更新dp数组,最终得到从起点到终点的最短路径长度。
对于最小生成树问题,可以先计算任意两个顶点之间的最短路径,然后通过Prim算法或Kruskal算法来生成最小生成树。
除了上述问题,动态规划还可以用于解决其他一些经典问题,如编辑距离、最长公共子序列等。
C#实现Levenshteindistance最小编辑距离算法

C#实现Levenshteindistance最⼩编辑距离算法Levenshtein distance,中⽂名为最⼩编辑距离,其⽬的是找出两个字符串之间需要改动多少个字符后变成⼀致。
该使⽤了动态规划的算法策略,该问题具备最优⼦结构,最⼩编辑距离包含⼦最⼩编辑距离,有下列的公式。
其中d[i-1,j]+1代表字符串s2插⼊⼀个字母才与s1相同,d[i,j-1]+1代表字符串s1删除⼀个字母才与s2相同,然后当xi=yj时,不需要代价,所以和上⼀步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最⼩的⼀项。
算法实现(C#):假设两个字符串分别为source,target,其长度分别为columnSize,rowSize,⾸先申请⼀个(columnSize+1)*(rowSize+1)⼤⼩的矩阵,然后将第⼀⾏和第⼀列初始化,matrix[i,0]=i,matrix[0,j]=j,接着就按照公式求出矩阵中其他元素,结束后,两个字符串之间的编辑距离就是matrix[rowSize, columnSize]的值,代码如下:public class StringComparator{public static int LevenshteinDistance(string source, string target){int columnSize = source.Length;int rowSize = target.Length;if (columnSize == 0){return rowSize;}if (rowSize == 0){return columnSize;}int[,] matrix = new int[rowSize + 1, columnSize + 1];for (int i = 0; i <= columnSize; i++){matrix[0, i] = i;}for (int j = 1; j <= rowSize; j++){matrix[j, 0] = j;}for (int i = 0; i < rowSize; i++){for (int j = 0; j < columnSize; j++){int sign;if (source[j].Equals(target[i]))sign= 0;elsesign = 1;matrix[i + 1, j + 1] = Math.Min(Math.Min(matrix[i, j] + sign, matrix[i + 1, j] + 1), matrix[i, j + 1] + 1);}}return matrix[rowSize, columnSize];}public static float StringSimilarity(string source, string target){int distance = LevenshteinDistance(source, target);float maxLength = Math.Max(source.Length, target.Length);return (maxLength - distance) / maxLength;}}。
leetcode常见dp题状态转移方程

Leetcode常见DP题状态转移方程一、概述动态规划(Dynamic Programming, DP)是算法设计中的一种常用方法,它通常用于优化递归算法,解决重叠子问题。
Leetcode上有许多经典动态规划问题,而理解状态转移方程是解决这些问题的关键。
本文旨在总结Leetcode常见DP题的状态转移方程,帮助读者更好地理解和掌握动态规划算法的应用。
二、背包问题1. 0-1背包问题问题描述:给定一组物品,每种物品都有重量和价值,要求在限定的总重量下,如何使得所装载的物品总价值最高。
状态转移方程:```dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i]), 1 <= i <= n, 1 <= j <= C```其中,dp[i][j]表示前i个物品中最大重量不超过j时的最大价值,weight[i]表示第i个物品的重量,value[i]表示第i个物品的价值,C 表示背包的容量,n为物品的个数。
2. 完全背包问题问题描述:给定一组物品,每种物品都有重量和价值,每种物品不限数量,要求在限定的总重量下,如何使得所装载的物品总价值最高。
状态转移方程:```dp[i][j] = max(dp[i-1][j], dp[i][j-weight[i]] + value[i]), 1 <= i <= n, 1 <= j <= C```其中,dp[i][j]表示前i个物品中最大重量不超过j时的最大价值,weight[i]表示第i个物品的重量,value[i]表示第i个物品的价值,C 表示背包的容量,n为物品的个数。
3. 多重背包问题问题描述:给定一组物品,每种物品都有重量和价值,每种物品有限数量,要求在限定的总重量下,如何使得所装载的物品总价值最高。
状态转移方程:```dp[i][j] = max(dp[i-1][j], dp[i-1][j-k*weight[i]] + k*value[i]), 1 <= i <= n, 1 <= j <= C, 0 <= k <= num[i]```其中,dp[i][j]表示前i个物品中最大重量不超过j时的最大价值,weight[i]表示第i个物品的重量,value[i]表示第i个物品的价值,num[i]表示第i个物品的数量,C表示背包的容量,n为物品的个数。
编辑距离算法

编辑距离算法
编辑距离算法(Edit Distance Algorithm)是一种计算字符串之间的相似度的算法,也称为Levenshtein距离,是一种编辑模型,用于计算两个字符串之间的编辑距离,其中编辑距离是指将一个字符串转换成另一个字符串所需要的最少编辑次数。
编辑距离算法是一种动态规划算法,该算法假定字符串只包含少量的操作,如添加、删除、替换,且操作消耗相同。
编辑距离算法的基本思想是将字符串分割成许多子串,计算每一对子串之间的最小编辑距离,最后得到两个字符串的最小编辑距离。
为了计算两个字符串的编辑距离,编辑距离算法通常使用动态规划来求解,动态规划的核心思想是将复杂的问题分解成若干个子问题,通过求解子问题来求解原问题。
当使用动态规划算法计算两个字符串的编辑距离时,首先要建立一个二维表,行表示字符串A,列表示字符串B。
然后在表格中每个单元格中存储字符串A和字符串B的子串之间的编辑距离,从表格的左上角开始,每次只需要计算表格中的相邻单元格之间的编辑距离即可,最后,当表格中的最后一个单元格被计算出来时,这个单元格中存储的就是字符串A和字符串B的最小编辑距离。
编辑距离算法由于其简洁、高效,广泛用于文本检索、语音识别、自然语言处理等领域,其中文本检索中,常常用它来计算搜索引擎
的相关度,自然语言处理中,则常用它来计算文本相似度,从而实现文本聚类和文本分类等功能。
此外,编辑距离算法在生物序列的比较中也有着广泛的应用。
编辑距离的数学证明

编辑距离的数学证明1.引言1.1 概述编辑距离是一种常用的字符串相似度度量方法,用于衡量两个字符串之间的差异程度。
在自然语言处理、信息检索和生物信息学等领域都有广泛的应用。
编辑距离的概念最早由俄罗斯科学家Vladimir Levenshtein于1965年提出,因此也被称为Levenshtein距离。
它表示将一个字符串转换为另一个字符串所需的最小编辑操作次数,允许的编辑操作包括插入、删除和替换。
在实际应用中,编辑距离被广泛用于拼写纠错、基因序列比对和文本相似度计算等任务。
它能够量化衡量两个字符串之间的差异,进而用于判断它们的相似程度。
本文将首先对编辑距离的定义和应用进行介绍,包括详细解释编辑距离的计算方法。
然后,我们将呈现编辑距离的数学证明,以帮助读者更好地理解其原理和性质。
在本文的正文部分,我们将详细介绍编辑距离的定义和应用。
接着,我们将介绍编辑距离的计算方法,包括动态规划算法和其它相关算法。
最后,在结论部分,我们将呈现两个编辑距离的数学证明,以证明编辑距离的准确性和有效性。
希望通过本文的介绍和分析,读者能够对编辑距离有一个更全面的认识,并了解它在实际任务中的应用和作用。
同时,本文也将为进一步研究和应用编辑距离提供一定的参考依据。
1.2文章结构1.2 文章结构本文将分为三个主要部分,即引言、正文和结论。
每个部分的重点内容如下:引言部分将概述编辑距离的概念和应用,并介绍本文的结构和目的。
正文部分将着重探讨编辑距离的定义和应用。
首先,我们会对编辑距离进行准确定义,详细解释其含义和作用。
然后,我们将介绍多种常见的编辑距离计算方法,包括莱文斯坦距离、汉明距离等,以及它们的优缺点和适用场景。
通过对这些计算方法的深入了解,我们可以更好地理解编辑距离的数学基础和实际应用。
结论部分将对编辑距离的数学证明进行讨论。
除了介绍编辑距离的定义和计算方法外,我们还将探索编辑距离的数学证明。
具体地说,我们将提供两个编辑距离的数学证明,分别阐述其正确性和有效性。
文本编辑距离检索

文本编辑距离检索在信息检索领域,文本编辑距离是一种用于衡量两个文本之间差异程度的度量方法。
它可以用于文本相似度匹配、拼写纠错、语音识别等任务中。
本文将从基本概念、计算方法和应用实例三个方面介绍文本编辑距离检索。
一、基本概念文本编辑距离,又称为Levenshtein距离,是由俄罗斯科学家Vladimir Levenshtein在1965年提出的。
它定义为将一个字符串转换成另一个字符串所需的最少操作次数,包括插入、删除和替换字符。
这些操作可以用来衡量两个字符串之间的相似程度。
二、计算方法文本编辑距离的计算方法主要有两种:动态规划和递归。
动态规划是一种自底向上的计算方法,通过构建一个二维矩阵来存储中间结果,从而得到最终的距离值。
递归则是一种自顶向下的计算方法,通过将问题分解为子问题来逐步求解。
三、应用实例1. 文本相似度匹配:在搜索引擎中,我们经常需要根据用户的查询内容找到与之最相似的文本。
文本编辑距离可以作为一种衡量相似度的指标,通过计算查询内容与候选文本之间的距离,可以找到与之最相似的文本。
2. 拼写纠错:在拼写纠错任务中,我们需要根据用户输入的错误内容,找到与之最相似的正确内容。
文本编辑距离可以用来计算错误内容与候选内容之间的距离,从而找到最佳匹配。
3. 语音识别:在语音识别任务中,我们需要将语音转换为文本。
然而,由于语音识别的误差,识别结果可能存在错别字或不完整的情况。
文本编辑距离可以用来衡量识别结果与真实文本之间的差异,从而进行纠错或补全。
四、总结文本编辑距离是一种衡量文本差异程度的度量方法,可以用于文本相似度匹配、拼写纠错、语音识别等任务中。
它通过计算字符串之间的最少操作次数来衡量差异程度,计算方法有动态规划和递归两种。
在实际应用中,文本编辑距离可以帮助我们找到最相似的文本、纠正拼写错误和补全语音识别结果。
通过深入理解和应用文本编辑距离,我们可以提高信息检索的准确性和效率,为用户提供更好的服务。
编辑距离算法详解:LevenshteinDistance算法——动态规划问题
编辑距离算法详解:LevenshteinDistance算法——动态规划问题⽬录背景:我们在使⽤词典app时,有没有发现即使输错⼏个字母,app依然能给我们推荐出想要的单词,⾮常智能。
它是怎么找出我们想要的单词的呢?这⾥就需要BK树来解决这个问题了。
在使⽤BK树之前我们要先明⽩⼀个概念,叫编辑距离,也叫Levenshtein距离。
词典app是怎么判断哪些单词和我们输⼊的单词很相似的呢?我们需要知道两个单词有多像,换句话说就是两个单词相似度是多少。
1965年,俄国科学家Vladimir Levenshtein给字符串相似度做出了⼀个明确的定义叫做Levenshtein距离,我们通常叫它“编辑距离”。
字符串A到B的编辑距离是指,只⽤插⼊、删除和替换三种操作,最少需要多少步可以把A变成B。
例如,从aware到award需要⼀步(⼀次替换),从has到have则需要两步(替换s为v和再加上e)。
Levenshtein给出了编辑距离的⼀般求法,就是⼤家都⾮常熟悉的经典动态规划问题。
这⾥给出Levenshtein距离的性质。
设d(x,y)表⽰字符串x到y的Levenshtein距离,那么显然:1. d(x,y) = 0 当且仅当 x=y (Levenshtein距离为0 <==> 字符串相等)2. d(x,y) = d(y,x) (从x变到y的最少步数就是从y变到x的最少步数)3. d(x,y) + d(y,z) >= d(x,z) (从x变到z所需的步数不会超过x先变成y再变成z的步数)最后这⼀个性质叫做三⾓形不等式。
就好像⼀个三⾓形⼀样,两边之和必然⼤于第三边。
在⾃然语⾔处理中,这个概念⾮常重要,⽐如在词典app中:如果⽤户马虎输错了单词,则可以列出字典⾥与它的Levenshtein距离⼩于某个数n的单词,让⽤户选择正确的那⼀个。
n通常取到2或者3,或者更好地,取该单词长度的1/4等等。
编辑距离公式
编辑距离公式
编辑距离公式是一种用于比较两个字符串相似度的算法,也被称为Levenshtein距离。
其基本思想是通过计算将一个字符串转换成另一个字符串所需的最小操作次数来衡量两个字符串之间的相似程度。
这些操作可以包括插入、删除和替换字符。
具体来说,编辑距离公式的计算方法如下:
设字符串A和B的长度分别为m和n,定义矩阵D[m+1][n+1],其中D[i][j]表示A[1...i]和B[1...j]之间的编辑距离。
初始化D[0][0]=0,D[i][0]=i,D[0][j]=j,即空串与任意一个字符串之间的编辑距离为其长度。
对于i=1...m和j=1...n,根据当前字符是否相等,分别执行下列操作:
如果A[i]=B[j],则D[i][j]=D[i-1][j-1],表示当前位置的字符已经匹配上了,编辑距离不需要变化。
否则,可执行三种操作中的一种:
1. 插入:D[i][j]=D[i][j-1]+1,表示将B[j]插入到A[i]后面。
2. 删除:D[i][j]=D[i-1][j]+1,表示将A[i]删除。
3. 替换:D[i][j]=D[i-1][j-1]+1,表示用B[j]替换A[i]。
最终,编辑距离即为D[m][n]。
编辑距离公式可用于拼写检查、语音识别、文本相似度计算等应用场景。
在实际应用中,为了提高效率,可以通过动态规划等算法对其进行优化。
算法设计动态规划(编辑距离).doc
《算法设计与分析》课程报告课题名称:动态规划——编辑距离问题课题负责人名(学号):同组成员名单(角色):无指导教师:左劼评阅成绩:评阅意见:提交报告时间:2010年 6 月 23 日动态规划——编辑距离问题计算机科学与技术专业学生指导老师左劼[摘要]动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。
但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响,因为有些子问题可能要重复计算多次,所以利用动态规划使这些子问题只计算一次。
将字符串A变换为字符串所用的最少字符操作数称为字符串A到B的编辑距离。
关键词:动态规划矩阵字符串操作数编辑距离一、问题描述1、基本概念:设A和B是2个字符串。
要用最少的字符操作将字符串A转换为字符串B。
字符串操作包括:(1) 删除一个字符;(2) 插入一个字符;(3) 将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A 到B的编辑距离,记为d(A,B)。
2、算法设计:设计一个有效算法,对于给定的任意两个字符串A 和B,计算其编辑距离d(A,B)。
3、数据输入:输入数据由文件名为input.txt的文本文件提供。
文件的第1行为字符串A,第二行为字符串B。
4、结果输出:将编辑距离d(A,B)输出到文件ouput.txt的第一行。
输入文件示例输出文件示例input.txt output.txtfxpimu 5xwrs二、分析对于本问题,大体思路为:把求解编辑距离分为字符串A从0个字符逐渐增加到全部字符分别想要变为字符串B该如何变化以及变化的最短距离。
具体来说,首先选用数组a1存储字符串A(设长度为n),a2存储字符串B(设长度为m),d矩阵来进行具体的运算;这里有两个特殊情况比较简单可以单独考虑,即A的长度为0而B不为0还有A不为0B为0,这两种情况最后的编辑距离分别为m和n;讨论一般情况,d矩阵为d[n][m],假定我们从d[0][0]开始一直进行以下操作到了d[i][j]的位置,其中删除操作肯定是A比B长,同理,插入字符操作一定是A比B短,更改字符操作说明一样长,我们所要做的是对d[i][j-1]d[i-1][j] d[i-1][j-1]所存数进行比较,其中最小的即为当前长度和样式的字符串A变为B的编辑距离,依次这样计算到最后的d[n][m]中所存的数即为最终的编辑距离。
最短编辑距离算法(Minimum Edit Distance)
n = length (target) m = length (source) Create matrix d [n, m]; i=3 j=2 d[3,2] = min
d[2,2]+insert(t[3])=3 d[2,1]+substitute(s[2],t[3])=1 d[3,1]+delete(s[2])=3
=1
最小编辑距离计算示例
source : target : s o t s t o p
j
3 2 1 0 #
t o s # 0
2 1 0 s 1
1 2 1 t 2 2 o 3 p 4
i
n = length (target) m = length (source) Create matrix d [n, m]; i=3 j=1 d[3,1] = min
i
t o p (3. 插入p,1分,累计3分) t 编辑操作③ s ot stot sto stop 编辑操作④ (1. 插入t,1分,累计1分) (2. 删除t,1分,累计2分) (3. 插入p,1分,累计3分)
s o sto stop
t (1. 插入t,1分,累计1分) (3. 删除t,1分,累计3分)
d[1,2]+insert(t[2]) = 2 d[1,1]+substitute(s[2],t[2]) =2 d[2,1]+delete(s[2]) = 2
=2
最小编辑距离计算示例
source : target : s o t s t o p
j
3 2 1 0 #
t o s # 0
2 1 0 s 1
= 0 if target[i] = source[j] otherwise
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》课程报告
课题名称:动态规划——编辑距离问题
课题负责人名(学号):
同组成员名单(角色):无
指导教师:左劼
评阅成绩:
评阅意见:
提交报告时间:2010年 6 月 23 日
动态规划——编辑距离问题
计算机科学与技术专业
学生指导老师左劼
[摘要]动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。
但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响,因为有些子问题可能要重复计算多次,所以利用动态规划使这些子问题只计算一次。
将字符串A变换为字符串所用的最少字符操作数称为字符串A到B的编辑距离。
关键词:动态规划矩阵字符串操作数编辑距离
一、问题描述
1、基本概念:设A和B是2个字符串。
要用最少的字符操作将字符串A转换为字符串B。
字符串操作包括:
(1) 删除一个字符;
(2) 插入一个字符;
(3) 将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A 到B的编辑距离,记为d(A,B)。
2、算法设计:设计一个有效算法,对于给定的任意两个字符串A 和B,计算其编辑距离d(A,B)。
3、数据输入:输入数据由文件名为input.txt的文本文件提供。
文件的第1行为字符串A,第二行为字符串B。
4、结果输出:将编辑距离d(A,B)输出到文件ouput.txt的第一行。
输入文件示例输出文件示例
input.txt output.txt
fxpimu 5
xwrs
二、分析
对于本问题,大体思路为:把求解编辑距离分为字符串A从0个字符逐渐增加到全部字符分别想要变为字符串B该如何变化以及变化的最短距离。
具体来说,首先选用数组a1存储字符串A(设长度为n),a2存储字符串B(设长度为m),d矩阵来进行具体的运算;这里有两个特殊情况比较简单可以单独考虑,即A的长度为0而B不为0还有A不为0B为0,这两种情况最后的编辑距离分别为m和n;讨论一般情况,d矩阵为d[n][m],假定我们从d[0][0]开始一直进行以下操作到了d[i][j]的位置,其中删除操作肯定是A比B长,同理,插入字符操作一定是A比B短,更改字符操作说明一样长,我们所要做的是对d[i][j-1]
d[i-1][j] d[i-1][j-1]所存数进行比较,其中最小的即为当前长度和样式的字符串A变为B的编辑距离,依次这样计算到最后的d[n][m]中所存的数即为最终的编辑距离。
三、证明
1、理论前提:动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。
但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响。
该算法的有效性依赖于两个重要的性质:最优子结构性质和问题重叠性质。
最有子结构性:以自底向上的方法递归地从子问题的最优解逐步构造出整个问题的最优解。
重叠子问题性:每次产生的子问题并不总是新问题,利用动态规划对每一个子问题只解一次,并将其存入表格中,下次用到该子问题的解时,只要查找表格即可。
2、本题:本题首先符合最优子结构性,即让字符串A从1开始递增到最终长度n,也就是从只有一个字符开始计算,每增加一个字符计算一次,符合自底向上的方法递归地解决子问题;其次符合重叠子问题性,每增加一个字符计算的时候总要用到前一状态时的编辑距离,并且本题我采用了矩阵来存储旧子问题的数据,都只计算了一次,所以也符合。
3、总结:综上两点,可知本题采用了动态规划的思想来解决,并能得到正确的答案。
四、代码及解释(注释)
#include<iostream.h>
#include<fstream>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int MAX=1000;
int min(int a,int b)
{
if(a>=b)
return b;
else
return a;
}
int main()
{
int d[MAX][MAX];
int i,j;
char a1[MAX], a2[MAX];
FILE *fp;
fp=fopen("input.txt","r");
fscanf(fp,"%s",a1);
fscanf(fp,"%s",a2);
fclose(fp);
int n=strlen(a1)-1; //字符串末尾多1
int m=strlen(a2)-1;
for(i=0;i<=n;i++) //从i变到0字符串,i个需要i次(添加) d[i][0]=i;
for(i=0;i<=m;i++) //从0字符串变到j,j个需要j次(删除) d[0][i]=i;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a1[i]!=a2[j])
d[i][j]=min(min(d[i][j-1],d[i-1][j]),d[i-1][j-1])+1;
//加一个,减一个,变一个else
d[i][j]=d[i-1][j-1];
}
}
cout<<d[n][m];
fp=fopen("output.txt","w");
fprintf(fp,"%d",d[n][m]);
fclose(fp);
return 0;
}
/*
输入:fxpimu
xwrs
输出:5
*/
五、复杂度分析
以下为核心代码部分:
for(i=0;i<=n;i++) //从i变到0字符串,i个需要i次(添加) d[i][0]=i;
一重循环时间复杂度为T(n)
for(i=0;i<=m;i++) //从0字符串变到j,j个需要j次(删除) d[0][i]=i;
一重循环时间复杂度为T(m)
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a1[i]!=a2[j])
d[i][j]=min(min(d[i][j-1],d[i-1][j]),d[i-1][j-1])+1;
//加一个,减一个,变一个
else
d[i][j]=d[i-1][j-1];
}
}
二重循环:时间复杂度为T(n*m)
总的时间复杂度为T(n*m+n+m)=O(n*m)
最好时间复杂度为O(n);最坏时间复杂度为O(n2)
参考文献
[1] 王晓东.计算机算法设计与分析(第3版).电子工业出版社,2009.12(第
8次印刷)P48,P53-54,P89
[2] 科曼(Cormen T.H.)等著潘金贵等译.算法导论(第二版).机械工业出版社,2008.6(第9次印刷)P202-207。