Il codice che propongo è molto semplice nella sua interpretazione ed è alquanto interessante e, in alcuni casi, può essere più che utile. La funzione presente non è altro che una variante semplificata dell'algoritmo che calcola l'Edit Distance meglio conosciuta con il termine Levenshtein Distance. La distanza di Levenshtein è la "distanza" tra due stringhe, nell'esempio proposto le stringhe da elaborare sono indicate dalle variabili String1 e String2, dove per "distanza" è inteso il numero minimo di operazioni elementari (cancellazione, sostituzione o inserimento di un carattere) che occorrono per trasformare la stringa String1 nella stringa String2. In poche parole l'algoritmo di Levenshtein non fa altro che "misurare" il grado di similitudine tra due stringhe fornendo il numero di quante modifiche occorrono per trasformare una stringa in un'altra. Questo algoritmo è abbastanza conosciuto tra chi sviluppa software per l'archiviazione di dati provenienti da diverse tabelle e da diversi database, specialmente da quei db "vecchi" e "sporchi" dove, durante la loro importazione, è necessario procedere in automatico ad una "normalizzazione" dei termini contenuti in alcuni campi per "riallineare" i dati e dove, purtroppo, anche le solite query con l'operatore LIKE non riescono a risolvere il problema. Per chi vuole approfondire l'argomento sull'algoritmo che determina la distanza di Levenshtein consiglio di fare ricerche in internet e per cominciare su Wikipedia: Distanza di Levenshtein - Wikipedia (italiano) e Levenshtein distance - Wikipedia, the free encyclopedia (english).
B4X:
Sub edit_distance(String1, String2)
Dim distance
Dim truncateLength
Dim xString1
Dim xString2
distance = 0
If String1 <> String2 Then
distance = Abs(StrLength(String1) - StrLength(String2))
truncateLength = ((StrLength(String1) + StrLength(String2)) - distance) / 2
xString1 = SubString(String1, 0, truncateLength - 1)
xString2 = SubString(String2, 0, truncateLength - 1)
For i = 1 To truncateLength
If SubString(xString1, i - 1, 1) <> SubString(xString2, i - 1, 1) Then
distance = distance + 1
End If
Next
End If
Return distance
End Sub
Attachments
Last edited: