【问题标题】:construct edit matrix for Levenshtein distance为 Levenshtein 距离构建编辑矩阵
【发布时间】:2021-08-04 07:01:07
【问题描述】:

为了计算 Levenshtein 距离,我们总是选择使用动态规划。为此,我们将创建一个编辑距离矩阵,如下所示:

enter image description here

代码如下:

while True:
    try:
        a = input()
        b = input()
         
        board = [[0 for j in range(len(b)+1)] for i in range(len(a)+1)]
         
        for i in range(len(a)+1):
            board[i][0] = i
        for j in range(len(b)+1):
            board[0][j] = j
             
        for i in range(1, len(a)+1):
            for j in range(1, len(b)+1):
                 
                if a[i-1] == b[j-1]:
                    d = 0
                else:
                    d = 1
                 
                board[i][j] = min(board[i-1][j]+1,
                                  board[i][j-1]+1,
                                  board[i-1][j-1]+d)
         
        print(board[-1][-1])
         
    except:
        break

所以我的问题是,当我们构造矩阵时,为什么我们需要在 len(a) 和 len(b) 上加 1。因为如前图所示,只有红色部分是矩阵中的有效部分。所以我修改了我的代码:

while True:
    try:
        a = input()
        b = input()

        board = [[0 for j in range(len(b))] for i in range(len(a))]

        for i in range(len(a)):
            board[i][0] = i

        for j in range(len(b)):
            board[0][j] = j

        for i in range(1, len(a)):
            for j in range(1, len(b)):
                if a[i] == b[j]:
                    d = 0
                else:
                    d = 1

                board[i][j] = min(board[i-1][j]+1,
                                  board[i][j-1]+1,
                                  board[i-1][j-1]+d)
        print(board[-1][-1])

    except:
        break 

我测试了这个修改后的代码,它在大多数测试中仍然给出了正确的答案。但是当两个字符串都很长时,结果会少1。我对此感到非常困惑。也许这个问题很愚蠢,但我还是希望得到回答,谢谢。 ????

【问题讨论】:

    标签: python algorithm dynamic levenshtein-distance


    【解决方案1】:

    您的解决方案的问题是您跳过了a[0]b[0] 案例,您必须先处理该案例。原始解决方案在 i = 1j = 1 时使用 a[i-1] == b[j-1] 处理它,但您没有

    【讨论】: