Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最小编辑距离动态规划法的正确性证明_Algorithm_Language Agnostic_Dynamic Programming - Fatal编程技术网

Algorithm 最小编辑距离动态规划法的正确性证明

Algorithm 最小编辑距离动态规划法的正确性证明,algorithm,language-agnostic,dynamic-programming,Algorithm,Language Agnostic,Dynamic Programming,为了计算最小编辑距离(将一个单词转换为另一个单词所需的最小插入、删除和替换量),动态规划解决方案基于递归关系,其中检查两个字符串的最后一个字符。详情见附件 当涉及到编辑距离时,该算法的描述在互联网上随处可见,但所有这些算法都只是在没有证据的情况下断言其正确性。通过编辑距离的定义,你可以插入、删除或替换中间的字符,而不仅仅是在结尾。那么,如何证明这种递归关系实际上成立呢?使用归纳法来证明递归算法是正确的 首先,正如我在评论中所说,您可以将动态编程视为加速递归的一种方法,而证明递归算法正确性的最简单

为了计算最小编辑距离(将一个单词转换为另一个单词所需的最小插入、删除和替换量),动态规划解决方案基于递归关系,其中检查两个字符串的最后一个字符。详情见附件

当涉及到编辑距离时,该算法的描述在互联网上随处可见,但所有这些算法都只是在没有证据的情况下断言其正确性。通过编辑距离的定义,你可以插入、删除或替换中间的字符,而不仅仅是在结尾。那么,如何证明这种递归关系实际上成立呢?

使用归纳法来证明递归算法是正确的 首先,正如我在评论中所说,您可以将动态编程视为加速递归的一种方法,而证明递归算法正确性的最简单方法几乎总是:证明它在一些小的基本情况下是正确的,然后证明,假设它对大小为n的问题是正确的,那么它对大小为n+1的问题也是正确的。这样,证明与递归结构非常相似

对于所有0=2或j-j'>=2,此问题通常的递归将“查找将字符串A编辑成字符串B的最小成本”问题分解为(|A |+1)(|B |+1)子问题“查找将字符串A的前i个字符编辑成字符串B的前j个字符的最小成本”
基本上,如果我们沿着这棵树走一步,两个“子问题坐标”(i或j)中至少有一个会减少,但不会超过1。这意味着,如果我们继续沿着树往下走,那么不管我们在往下走的过程中选择了哪一个“子”子问题,我们最终必须找到一个坐标为(至少)0的子问题,也就是说,对于某些坐标为0的子问题,我找不到任何令人满意的证明,所以我做了一个。我读过的所有证据实际上并不能证明这些案例都是详尽无遗的

(A)始终存在至少一个最佳编辑序列,并将其称为Eo

这是微不足道的

(B)在Eo中,有些字符永远不会被插入或更改。最后一个这样的字符称为pivot

如果没有,我们可以使用字符串的开头作为轴。在Eo中,这个公共子序列从头到尾都不会改变。我们不是假定它是最长的公共子序列或任何东西

e、 (g)#小猫#坐着→ 枢轴:'#ITTN'[-1]='N'

这个轴心有一些特性,使问题变得更容易

  • 枢轴的左侧和右侧相互独立。在一侧发生的任何编辑都不会影响另一侧
  • 根据定义(B),目标字符串轴右侧的所有字符都应通过替换或添加来更正
  • 由于(1)我们只需要考虑原始字符串和目标字符串的支点的右侧。让我们假设左侧是最优的(贪婪的),编辑的数量将添加到总数中。
    e、 g)
    #weofanbmcdepmqu->eopasbctdewni
    只考虑PMQU→ wni
    使用(2)这个子问题可以如下解决。
    len(原始)>len(目标):asdfgh→qwer
    删除len(原始)-len(目标)次以适应长度,替换len(目标)次以适应字符。这可以按任何顺序进行,因为它们在距离上都是相等的。在最后一次编辑时删除最后一个字符是这样的解决方案之一,它等于dp(原始[:-1]→目标)+1
    len(原件)这是我的证明:

    为了从字符串A到B,我们从左到右执行一组最佳操作。有4个操作:EQ(保留字符)、SWAP(更改字符)、INS(插入字符)、DEL(删除字符)。这是编辑距离的定义,其代价为EQ==0

    将A的长度定义为A,将B的长度定义为B

    将d[a,b]定义为a的前a个字符和b的前b个字符之间的编辑距离,这意味着在a上进行的操作数(除EQ外)可以到达b

    如果我们看一系列最佳操作(必须有一个),最后一个操作有4个选项。我们不知道最后一个操作,所以我们检查了所有4个选项,并选择了最佳选项(最佳表示最小编辑距离)

    如果最后一个操作是EQ,这意味着A[A]==B[B],编辑距离等于d[A-1,B-1],因为EQ不被视为“编辑距离”成本

    如果最后一次操作是交换,则意味着A[A]=并且编辑距离等于d[a-1,B-1]+1

    如果操作为INS,则表示编辑距离为d[a,b-1]+INS(至b) 如果操作为DEL,则表示编辑距离为d[a-1,b]+DEL(从a开始)

    我们只需从最后一个操作到第一个操作的所有组合,直到找到最佳路径。实际上,每一步有3个操作,因为我们可以根据当前字符是否相等来决定是检查EQ还是交换。(如果它们相等,则无需检查交换操作,反之亦然)


    由于我们尝试了所有可能的操作,递归公式必须为真。

    您可以将DP视为加速递归的一种方法,证明递归算法正确性的最简单方法几乎总是通过归纳法:在一些小的基本情况下证明它是正确的,然后证明,假设它对大小为n的问题是正确的,这对于大小为n+1的问题也是正确的。这样,证明紧密地反映了递归结构