LD算法(Levenshtein Distance)又成为编辑距离算法(Edit Distance)。他是以字符串A通过插入字符、删除字符、替换字符变成另一个字符串B,那么操作的过程的次数表示两个字符串的差异。
LD算法的具体理论可以自行另外百度,这个该博主理论写的挺详细的,https://www.cnblogs.com/grenet/archive/2010/06/01/1748448.html
接下去就是我根据该理论的具体实现,我是一个半新手,可能对于代码写的有点啰嗦,希望大家能指出我的不足,跪谢。
1 #include "stdio.h" 2 #include "string.h" 3 4 #define N 20 5 #define T 20 6 7 #define MIN(a,b,c) ((a < b ? a : b) > c ? c : (a < b ? a : b)) 8 #define MAX(a,b) (a > b ? a : b) 9 10 void show_matrix(int buf[N][T], int row , int col) 11 { 12 int i , j ; 13 for(i = 0 ; i <=row ; i++){ 14 for(j = 0 ; j <= col ; j++){ 15 printf("%d\t",buf[i][j]); 16 } 17 printf("\n"); 18 } 19 } 20 21 int LD_matrix(int matrix[N][T] , int row , int col , char * buf1, char * buf2) 22 { 23 int i , j ; 24 int left,top,lefttop; 25 int LD; 26 for(i = 1 ; i <= row ; i++){ 27 for(j = 1 ; j <= col ; j++){ 28 left = matrix[i][j-1]; 29 top = matrix[i-1][j]; 30 lefttop = matrix[i-1][j-1]; 31 32 if(buf1[i-1] == buf2[j-1]){ 33 matrix[i][j] = lefttop; 34 }else{ 35 matrix[i][j] = MIN(left , top ,lefttop) + 1; 36 LD = matrix[i][j]; 37 } 38 } 39 } 40 printf("LD = %d\n",LD); 41 return LD; 42 } 43 44 int main() 45 { 46 int row , col; 47 int i , j ; 48 char buf1[N] = "hello"; 49 char buf2[N] = "hepppppppp"; 50 int matrix[N][T] = {0}; 51 float LD = 0; 52 float sim = 0.0; 53 54 row = strlen(buf1); 55 col = strlen(buf2); 56 57 for(i = 0 ; i <= row ; i++){ 58 matrix[i][0] = i; 59 } 60 for(j = 0 ; j <= col ; j++){ 61 matrix[0][j] = j; 62 } 63 64 LD = LD_matrix(matrix,row,col,buf1,buf2); 65 sim = 1 - LD / (MAX(row,col)); 66 67 printf("LD = %f\n",LD); 68 printf("similar = %.6f" ,sim); 69 return 0; 70 71 }
浙公网安备 33010602011771号