El algoritmo en la publicación no calcula la distancia Damerau-Levenshtein. En un wikipedia article este algoritmo se define como la distancia óptima de alineación de cadenas.
Una implementación de java del algoritmo de distancia DL se puede encontrar en otro SO post.
para obtener los valores correctos de distancia OSA favor cambian las líneas marcadas con -
a continuación con las líneas marcadas con +
int editdist(string s,string t,int n,int m)
{
int d1,d2,d3,cost;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
- if(s[i+1]==t[j+1])
+ if(s[i+1]==t[j+1])
cost=0;
else
cost=1;
d1=d[i][j+1]+1;
d2=d[i+1][j]+1;
d3=d[i][j]+cost;
d[i+1][j+1]=minimum(d1,d2,d3);
- if(i>0 && j>0 && s[i+1]==t[j] && s[i]==t[j+1]) //transposition
+ if(i>0 && j>0 && s[i]==t[j-1] && s[i-1]==t[j]) //transposition
{
d[i+1][j+1]=min(d[i+1][j+1],d[i-1][j-1]+cost);
}
}
}
return d[n+1][m+1];
}
Parece como si el código fue copiado de un programa escrito en un lenguaje de programación, donde los índices de matriz comienzan en 1 por defecto. Por lo tanto, todas las referencias a los elementos de la matriz de distancia d
se incrementaron. Sin embargo, las referencias a los caracteres dentro de las cadenas son referencias a matrices basadas en 0, por lo tanto, no deberían actualizarse.
para calcular la distancia de la matriz de distancia tiene que ser inicializado correctamente:
for(i = 0; i < n + 1; i++)
d[i][0] = i;
for(j = 1; j < m + 1; j++)
d[0][j] = j;
Dado que usted tiene la respuesta 5, es probable que la matriz de distancia ya se ha inicializado correctamente.
Dado que el algoritmo anterior no calcular la distancia DL, aquí es un esquema de una implementación de C del algoritmo DL (derivado del SO poste con un impl java. Derivado de una impl ActionScript. En el artículo de Wikipedia).
#define d(i,j) dd[(i) * (m+2) + (j) ]
#define min(x,y) ((x) < (y) ? (x) : (y))
#define min3(a,b,c) ((a)< (b) ? min((a),(c)) : min((b),(c)))
#define min4(a,b,c,d) ((a)< (b) ? min3((a),(c),(d)) : min3((b),(c),(d)))
int dprint(int* dd, int n,int m){
int i,j;
for (i=0; i < n+2;i++){
for (j=0;j < m+2; j++){
printf("%02d ",d(i,j));
}
printf("\n");
}
printf("\n");
return 0;
}
int dldist2(char *s, char* t, int n, int m) {
int *dd;
int i, j, cost, i1,j1,DB;
int INFINITY = n + m;
int DA[256 * sizeof(int)];
memset(DA, 0, sizeof(DA));
if (!(dd = (int*) malloc((n+2)*(m+2)*sizeof(int)))) {
return -1;
}
d(0,0) = INFINITY;
for(i = 0; i < n+1; i++) {
d(i+1,1) = i ;
d(i+1,0) = INFINITY;
}
for(j = 0; j<m+1; j++) {
d(1,j+1) = j ;
d(0,j+1) = INFINITY;
}
dprint(dd,n,m);
for(i = 1; i< n+1; i++) {
DB = 0;
for(j = 1; j< m+1; j++) {
i1 = DA[t[j-1]];
j1 = DB;
cost = ((s[i-1]==t[j-1])?0:1);
if(cost==0) DB = j;
d(i+1,j+1) =
min4(d(i,j)+cost,
d(i+1,j) + 1,
d(i,j+1)+1,
d(i1,j1) + (i-i1-1) + 1 + (j-j1-1));
}
DA[s[i-1]] = i;
dprint(dd,n,m);
}
cost = d(n+1,m+1);
free(dd);
return cost;
}
no es la distancia levensthein calculada sobre los árboles? ¿dónde está tu tipo de datos de árbol? – lurscher