Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
LINUX & OPEN SOURCE
23 janvier 2009

Levenshtein distance

La Levenshtein distance est un classique de la programmation. Elle est utile pour comparer la similarité de deux chaines de caractères.  Son défaut majeur est le temps de calcul (deux boucles imbriquées).

Le code source:  levenshtein_distance

/*------------- functions ------------*/
void errmalloc(char *msg) {
  printf("\nError memory allocation - %s\n",msg);
  exit(EXIT_FAILURE);

int minimum(int a,int b,int c) {
/*Gets the minimum of three values*/
  int min=a;
  if(b<min) min=b;
  if(c<min) min=c;
  return min;
}

int levenshtein_distance(char *s,char *t) {
/*Compute levenshtein distance between s and t*/
  int k,i,j,n,m,cost,*d,distance;
  n=strlen(s);
  m=strlen(t);
  if ((n!=0) && (m!=0))
  {
    if ((d=malloc((sizeof(int))*(m+1)*(n+1))) == NULL) errmalloc("levenshtein");
    m++;
    n++;
    for(k=0;k<n;k++) d[k]=k;
    for(k=0;k<m;k++) d[k*n]=k;
    for(i=1;i<n;i++)
      for(j=1;j<m;j++) {
        if(s[i-1]==t[j-1]) cost=0;
        else cost=1;
        d[j*n+i]=minimum(d[(j-1)*n+i]+1,d[j*n+i-1]+1,d[(j-1)*n+i-1]+cost);
      }
    distance=d[n*m-1];
    free(d);
    return distance;
  }
  else return -1; //string empty.
}

/* Compute the Levenshtein distance between 2 strings
Usage:  distance=levenshtein_distance(string1,string2);
*/

Publicité
Publicité
Commentaires
LINUX & OPEN SOURCE
Publicité
Archives
Publicité