kris
Зарегистрирован: 12.01.2006 Сообщения: 371
|
Добавлено: Вт Ноя 29, 2011 4:49 pm Заголовок сообщения: Сравнение двух строк |
|
|
Давно мучился необходимостью аналога DIFFERENCE в вбскрипте (например, для поиска двойников-корреспондентов). Вот нашел минутку и таки написал. Программа являет собой тривиальную реализацию алгоритма Левенштейна. Если кому надо - пользуйтесь.
Код: | Dim D()
Dim str1
Dim str2
Dim mas1()
Dim mas2()
Dim i, j
Dim d1
Dim d2
Dim d3
str1 = "Иванов Василий Иванович"
str2 = "ИвановВасилийИванович"
ReDim mas1(Len(str1))
For i=1 To Len(str1)
mas1(i) = Mid(str1, i, 1)
Next
ReDim mas2(Len(str2))
For i=1 To Len(str2)
mas2(i) = Mid(str2, i, 1)
Next
ReDim d(Len(str1), Len(str2))
For i=1 To Len(str1)
For j=1 To Len(str2)
If i=0 And j=0 Then
D(i,j) = 0
ElseIf i=0 And j>0 Then
D(i,j) = j
ElseIf j=0 And i>0 Then
D(i,j) = i
Else
d1 = D(i,j-1)+1
d2 = D(i-1,j)+1
d3 = D(i-1,j-1) + IIF(mas1(i)=mas2(j), 0, 1)
If d1<d2 And d1<d3 Then
D(i,j) = d1
ElseIf d2<=d1 And d2<=d3 Then
D(i,j) = d2
ElseIf d3<=d1 And d3<=d2 Then
D(i,j) = d3
Else
MsgBox "oops"
End If
End If
Next
Next
MsgBox D(Len(str1), Len(str2)), , "Количество переходов"
MsgBox 1-D(Len(str1), Len(str2))/Len(str1), , "Степень подобия" |
Сам алгоритм можно найти где угодно, например, в википедии: http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0 |
|