Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <time.h>
  5. #include <string.h>
  6.  
  7. #define MAXNCHARS 16
  8.  
  9. int Levenshtein_distance(char *x, char *y);
  10. int Levenshtein_distance_v2(char *x, char *y);
  11. int minimum(int a, int b, int c);
  12.  
  13. int main(void) {
  14. printf("Inserisci v1/v2: ");
  15. char choice[2];
  16.  
  17. scanf ("%[^\n]%*c", choice);
  18. char str1[MAXNCHARS], str2[MAXNCHARS];
  19. printf("Inserisci due stringhe:\n");
  20. scanf ("%[^\n]%*c", str1);
  21. scanf ("%[^\n]%*c", str2);
  22. int d;
  23. if (strcmp(choice,"v1")) {
  24. d = Levenshtein_distance(str1,str2);
  25. } else if (strcmp(choice,"v2")) {
  26. d = Levenshtein_distance_v2(str1,str2);
  27. }
  28.  
  29. printf("La distanza di Levenshtein e': %d", d);
  30. return 0;
  31. }
  32.  
  33. int Levenshtein_distance(char *x, char *y) {
  34. int m = strlen(x);
  35. int n = strlen(y);
  36.  
  37. int i, j;
  38.  
  39. int distance;
  40.  
  41. int **d = (int**) malloc((m + 1) * sizeof(int*));
  42.  
  43. for(i = 0; i <= m; i++)
  44. d[i] = (int*) malloc((n + 1) * sizeof(int));
  45.  
  46. for(i = 0; i <= m; i++)
  47. d[i][0] = i;
  48.  
  49. for(j = 1; j <= n; j++)
  50. d[0][j] = j;
  51.  
  52. for(i = 1; i <= m; i++) {
  53. for(j = 1; j <= n; j++) {
  54. if(x[i - 1] != y[j - 1]) {
  55. int k = minimum(
  56. d[i][j - 1],
  57. d[i - 1][j],
  58. d[i - 1][j - 1]
  59. );
  60. d[i][j] = k + 1;
  61. } else {
  62. d[i][j] = d[i - 1][j - 1];
  63. }
  64. }
  65. }
  66.  
  67. distance = d[m][n];
  68.  
  69. for(i = 0; i <= m; i++)
  70. free(d[i]);
  71.  
  72. free(d);
  73. return distance;
  74. }
  75.  
  76.  
  77. int Levenshtein_distance_v2(char *x, char *y) {
  78. int m = strlen(x);
  79. int n = strlen(y);
  80. int i, j;
  81. int distance;
  82. int *prev = (int*) malloc((n + 1) * sizeof(int));
  83. int *curr = (int*) malloc((n + 1) * sizeof(int));
  84. int *tmp = 0;
  85. for(i = 0; i <= n; i++)
  86. prev[i] = i;
  87. for(i = 1; i <= m; i++) {
  88. curr[0] = i;
  89. for(j = 1; j <= n; j++) {
  90. if(x[i - 1] != y[j - 1]) {
  91. int k = minimum(curr[j - 1], prev[j - 1], prev[j]);
  92. curr[j] = k + 1;
  93. } else {
  94. curr[j] = prev[j - 1];
  95. }
  96. }
  97. tmp = prev;
  98. prev = curr;
  99. curr = tmp;
  100. memset((void*) curr, 0, sizeof(int) * (n + 1));
  101. }
  102. distance = prev[n];
  103. free(curr);
  104. free(prev);
  105. return distance;
  106. }
  107.  
  108. int minimum(int a, int b, int c) {
  109.  
  110. /* funzione che calcola il minimo di 3 valori */
  111.  
  112. int min = a;
  113.  
  114. if (b < min) min = b;
  115. if (c < min) min = c;
  116.  
  117. return min;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement