Алгоритм сравнения строк

Алгоритмы, связанные с реализацией поиска информации.
Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Алгоритм сравнения строк

Сообщение Williams » 24.08.2009 (Пн) 23:03

Опишу что примерно надо:

Есть две строки. Надо определить (желательно в процентном отношении) насколько они схожи.

Например, сколько символов подряд совпадают.

Если таковой имеется, хотелось бы знать название.


Похоже нашел:
http://ru.wikipedia.org/wiki/%D0%A0%D0% ... 0%BD%D0%B0
И вы думаете, что вас оставят в живых после прочтения этого поста?

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Алгоритм сравнения строк

Сообщение Proxy » 25.08.2009 (Вт) 17:49

Тебе к методам оценки релевантности. Они разные бывают, обобщёные алгоритмы найти возможно: их много в сети.
Follow the white rabbit.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Алгоритм сравнения строк

Сообщение Antonariy » 07.09.2009 (Пн) 10:53

viewtopic.php?f=1&t=34276

Код: Выделить всё
Private b1() As Byte
Private b2() As Byte

Public Function Simil(String1 As String, String2 As String) As Double
Dim l1 As Long
Dim l2 As Long
    If UCase(String1) = UCase(String2) Then
        Simil = 1
    Else
        l1 = Len(String1)
        l2 = Len(String2)
        If l1 <> 0 And l2 <> 0 Then
            b1 = StrConv(UCase$(String1), vbFromUnicode)
            b2 = StrConv(UCase$(String2), vbFromUnicode)
            Simil = SubSim(1, l1, 1, l2) / (l1 + l2) * 2
        End If
    End If
    Erase b1
    Erase b2
End Function

Private Function SubSim(st1 As Long, end1 As Long, st2 As Long, end2 As Long) As Long
Dim c1 As Long
Dim c2 As Long
Dim ns1 As Long
Dim ns2 As Long
Dim i As Long
Dim max As Long
    If st1 > end1 Or st2 > end2 Or st1 <= 0 Or st2 <= 0 Then Exit Function
    For c1 = st1 To end1
        For c2 = st2 To end2
            i = 0
            Do Until b1(c1 + i - 1) <> b2(c2 + i - 1)
                i = i + 1
                If i > max Then
                    ns1 = c1
                    ns2 = c2
                    max = i
                End If
                If c1 + i > end1 Or c2 + i > end2 Then Exit Do
            Loop
        Next
    Next
    max = max + SubSim(ns1 + max, end1, ns2 + max, end2)
    max = max + SubSim(st1, ns1 - 1, st2, ns2 - 1)
    SubSim = max
End Function
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Поиск

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList