一段时间以来,我一直在尝试理解此代码,但我不知道如何计算距离。我知道算法应该如何工作(它提供了两个字符串之间的字符编辑距离,我可以在纸上做到这一点),但是我不知道这行代码的方式(例如)
d(i,j)= d(i-1,j-1)
以整数形式返回。 min1,min2相同。我们已经定义了
d(i,0)
和
d(0,j)
,但是当
时如何获取值d(i,j)
两个参数之一不是0吗?
代码:
Option Explicit
Public Function Levenshtein(s1 As String, s2 As String)
Dim i As Integer
Dim j As Integer
Dim l1 As Integer
Dim l2 As Integer
Dim d() As Integer
Dim min1 As Integer
Dim min2 As Integer
l1 = Len(s1)
l2 = Len(s2)
ReDim d(l1, l2)
For i = 0 To l1
d(i, 0) = i
Next
For j = 0 To l2
d(0, j) = j
Next
For i = 1 To l1
For j = 1 To l2
If Mid(s1, i, 1) = Mid(s2, j, 1) Then
d(i, j) = d(i - 1, j - 1)
Else
min1 = d(i - 1, j) + 1
min2 = d(i, j - 1) + 1
If min2 < min1 Then
min1 = min2
End If
min2 = d(i - 1, j - 1) + 1
If min2 < min1 Then
min1 = min2
End If
d(i, j) = min1
End If
Next
Next
Levenshtein = d(l1, l2)
End Function
?Levenshtein("saturday","sunday")
3
答案 0 :(得分:1)
我对Levenshtein不太了解,但是我可以解释该数组中发生了什么,请查看代码中的注释:
l1 = Len(s1) 'this sets a variable with the length of the first string
l2 = Len(s2) 'this sets a variable with the length of the second string
ReDim d(l1, l2) 'redimension the array to this size, though this can be seen as ReDim d(0 to l1, 0 to l2)
For i = 0 To l1 'for i = 0 to length of first string
d(i, 0) = i 'allocate the value of i to each row in the array, at col 0
Next i
For j = 0 To l2 'for j = 0 to length of second string
d(0, j) = j 'allocate the value of j to each column in the array, at row 0
Next j
编辑:我添加了一些调试功能(将打印到ActiveSheet)。字母匹配处为蓝色,其他字母为红色...尽管颜色无关紧要。
据我所知,在每次循环迭代中,它会建立一个差异矩阵,从比较1:1的第一个字母到最后一个字母开始。基于循环位置并进行每次迭代,它将使用先前的位置值来计算当前位置的差。使用较短的字符串可能更容易理解。
浏览第二个单词中的每个字母,然后循环浏览第一个单词中的每个字母
在第一个外部循环(每行),第一个内部循环(每列)处,S
满足S
= 0。(d(i, j) = d(i - 1, j - 1)
的计算结果为{ {1}},即:d(i, j) = d(1 - 1, 1 - 1)
)
在第一个外部循环,第二个内部循环处,我们有0
符合S
= 1。
等,等等。
除此之外,逐步检查代码,看看变量是否基于if条件发生变化...不确定我是否可以更好地解释这一点。
U