Advertisement
m4ly

Levenshtein

Aug 18th, 2014
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.80 KB | None | 0 0
  1. /* Dawid Mocek */
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. #define COST_NOT 0.0
  8. #define COST_ADD 1.0
  9. #define COST_DEL 1.0
  10. #define COST_CHG 1.5
  11.  
  12.  
  13. struct FromTo {
  14.     char *from;
  15.     int from_len;
  16.     char *to;
  17.     int to_len;
  18.     double cost;
  19. };
  20.  
  21. void free_ft(struct FromTo ****ft, int x, int y) {
  22.     int i, j;
  23.     for (i = 0; i < x; i++) {
  24.         for (j = 0; j < y; j++) {
  25.             free((*ft[i][j])->from);
  26.             free((*ft[i][j])->to);
  27.             (*ft[i][j])->from = NULL;
  28.             (*ft[i][j])->to = NULL;
  29.             free(*ft[i][j]);
  30.             (*ft[i][j]) = NULL;
  31.         }
  32.         free((*ft[i]));
  33.     }
  34. }
  35. double minimum(double x1, double x2, double x3)
  36. {
  37.     if (x1 >= x2)
  38.     if (x2 >= x3)
  39.         return x3;
  40.     else
  41.         return x2;
  42.     else
  43.     if (x3 >= x1)
  44.         return x1;
  45.  
  46.     return x3;
  47. }
  48.  
  49. double Levenshtein(char *s, int s_len, char *t, int t_len)
  50. {
  51.     int i, j, m, n, l;
  52.         double cost, res;
  53.     double **d = (double **)calloc(s_len + 1, sizeof(double*));
  54.     for (i = 0; i <= t_len; i++)
  55.         d[i] = (double *)calloc(t_len + 1, sizeof(double));
  56.  
  57.     m = s_len;
  58.     n = t_len;
  59.  
  60.     for (i = 0; i <= m; i++)
  61.         d[i][0] = (double)i;
  62.     for (j = 0; j <= n; j++)
  63.         d[0][j] = (double)j;
  64.  
  65.     for (i = 1; i <= m; i++)
  66.     {
  67.         for (j = 1; j <= n; j++)
  68.         {
  69.             if (s[i - 1] == t[j - 1])
  70.                 cost = COST_NOT;
  71.             else
  72.                 cost = COST_ADD;
  73.  
  74.             d[i][j] = minimum(  d[i - 1][j] + 1,       /* remove */
  75.                                 d[i][j - 1] + 1,       /* insert */
  76.                                 d[i - 1][j - 1] + COST_CHG /* change */
  77.                             );
  78.         }
  79.     }
  80.  
  81.    
  82.     res = d[m][n];
  83.    
  84.     return res;
  85. }
  86.  
  87. struct FromTo ***generuj(char *src, int src_len, char *dst, int dst_len) {
  88.     if (src == NULL || dst == NULL)
  89.         return NULL;
  90.  
  91.     int i, j, k, l;
  92.     double leven;
  93.     char *src_tmp = NULL, *dst_tmp = NULL;
  94.     struct FromTo* ft_record = NULL;
  95.    
  96.     struct FromTo ***ft = (struct FromTo ***)malloc(sizeof(struct FromTo **) * src_len);
  97.     for (i = 0; i < src_len; i++)      
  98.         ft[i] = (struct FromTo **)malloc(sizeof(struct FromTo*) * dst_len);
  99.  
  100.     k = 1;
  101.     j = 0;
  102.     for (i = 0; i < src_len; i++, k++) {
  103.         src_tmp = (char *)malloc(((sizeof(char)) * k) + sizeof(char));
  104.         memset(src_tmp, 0, k + 1);
  105.         memcpy(src_tmp, src, sizeof(char) * k);
  106.        
  107.         l = 1;
  108.         for (j = 0; j < dst_len; j++, l++) {   
  109.             dst_tmp = (char *)malloc(((sizeof(char)) * l) + sizeof(char));
  110.             memset(dst_tmp, 0, l + 1);
  111.             memcpy(dst_tmp, dst, sizeof(char)* l);
  112.            
  113.             ft_record = (struct FromTo *)malloc(sizeof(struct FromTo));
  114.             ft_record->from = src_tmp;
  115.             ft_record->from_len = strlen(src_tmp);
  116.             ft_record->to = dst_tmp;
  117.             ft_record->to_len = strlen(dst_tmp);
  118.             leven = Levenshtein(src_tmp, ft_record->from_len, ft_record->to, ft_record->to_len);
  119.             ft[i][j] = ft_record;      
  120.         }
  121.     }
  122.  
  123.     return ft;
  124. }
  125.  
  126.  
  127. int main(void) {
  128.    
  129.     char *string = "POLITECH";
  130.     char *str = "OLABOGA";
  131.     struct FromTo ***ft  = generuj(string, strlen(string), str, strlen(str));
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement