Levenshtein distance最小編輯距離演算法實現
阿新 • • 發佈:2019-02-12
Levenshtein distance,中文名為最小編輯距離,其目的是找出兩個字串之間需要改動多少個字元後變成一致。該演算法使用了動態規劃的演算法策略,該問題具備最優子結構,最小編輯距離包含子最小編輯距離,有下列的公式。
其中d[i-1,j]+1代表字串s2插入一個字母,d[i,j-1]+1代表字串s1刪除一個字母,然後當xi=yj時,不需要代價,所以和上一步d[i-1,j-1]代價相同,否則+1,接著d[i,j]是以上三者中最小的一項。
演算法實現(Python):
假設兩個字串分別為s1,s2,其長度分別為m,n,首先申請一個(m+1)*(n+1)大小的矩陣,然後將第一行和第一列初始化,d[i,0]=i,d[0,j]=j,接著就按照公式求出矩陣中其他元素,結束後,兩個字串之間的編輯距離就是d[n,m]的值,程式碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'xanxus' s1, s2 = raw_input('String 1:'), raw_input('String 2:') m, n = len(s1), len(s2) colsize, matrix = m + 1, [] for i in range((m + 1) * (n + 1)): matrix.append(0) for i in range(colsize): matrix[i] = i for i in range(n + 1): matrix[i * colsize] = i for i in range(n + 1)[1:n + 1]: for j in range(m + 1)[1:m + 1]: cost = 0 if s1[j - 1] == s2[i - 1]: cost = 0 else: cost = 1 minValue = matrix[(i - 1) * colsize + j] + 1 if minValue > matrix[i * colsize + j - 1] + 1: minValue = matrix[i * colsize + j - 1] + 1 if minValue > matrix[(i - 1) * colsize + j - 1] + cost: minValue = matrix[(i - 1) * colsize + j - 1] + cost matrix[i * colsize + j] = minValue print matrix[n * colsize + m]