公共课距离{ //**************************** //获取三个值中的最小值 //**************************** private int最小值(int a,int b,int c){ int mi; mi=a; 如果(b<mi){ mi=b; } 如果(c<mi){ mi=c; } 返回mi; } //***************************** //计算Levenshtein距离 //***************************** public int LD(字符串s,字符串t){ int d[][];// 矩阵 整数n;// s的长度 整数m;// t的长度 整数i;// 迭代s 整数j;// 迭代t 字符s_i;// s的第i个字符 字符tj;// t的j特征 int成本;// 成本 //第1步 n=s.长度(); m=t.长度(); 如果(n==0){ 返回m; } 如果(m==0){ 返回n; } d=新整数[n+1][m+1]; //第2步 对于(i=0;i<=n;i++){ d[i][0]=i; } 对于(j=0;j<=m;j++){ d[0][j]=j; } //步骤3 对于(i=1;i<=n;i++){ s_i=s.charAt(i-1); //第4步 对于(j=1;j<=m;j++){ t_j=t.charAt(j-1); //第5步 如果(si==tj){ 成本=0; } 其他{ 成本=1; } //第6步 d[i][j]=最小值(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+成本); } } //第7步 返回d[n][m]; } }
整数sz=5; 整数arr[sz];
类距离 { 公众: int LD(字符常量*s,字符常量*t); 私人: int最小值(int a,int b,int c); int*GetCellPointer(int*pOrigin,int col,int row,int nCols); int GetAt(int*pOrigin,int col,int row,int nCols); void PutAt(int*pOrigin,int col,int row,int nCols,int x); };
#包括“distance.h” #包括<string.h> #包括<malloc.h> //**************************** //获取至少三个值 //**************************** int距离::最小值(int a,int b,int c) { 整数mi; mi=a; 如果(b<mi){ mi=b; } 如果(c<mi){ mi=c; } 返回mi; } //************************************************** //获取指向矩阵中指定单元格的指针 //************************************************** int*距离::GetCellPointer(int*pOrigin,int col,int row,int nCols) { return pOrigin+col+(行*(nCols+1)); } //***************************************************** //获取矩阵中指定单元格的内容 //***************************************************** int距离::GetAt(int*pOrigin,int col,int row,int nCols) { int*pCell; pCell=获取单元格指针(pOrigin,col,row,nCols); return*pCell; } //******************************************************* //用值x填充矩阵中的指定单元格 //******************************************************* void距离::PutAt(int*pOrigin,int col,int row,int nCols,int x) { int*pCell; pCell=获取单元格指针(pOrigin,col,row,nCols); *p细胞=x; } //***************************** //计算Levenshtein距离 //***************************** int距离::LD(char const*s,char const*t) { 整数*d;// 指向矩阵的指针 整数n;// s的长度 整数m;// t的长度 整数i;// 迭代s 整数j;// 遍历t 字符s_i;// s的第i个字符 字符t_j;// t的j特征 int成本;// 成本 int结果;// 结果 int单元格;// 目标单元格内容 int以上;// 上方单元格内容 剩余int;// 单元格内容立即向左 int诊断;// 左上方单元格内容 int sz;// 矩阵中的单元数 //第1步 n=结构; m=斯特伦(t); 如果(n==0){ 返回m; } 如果(m==0){ 返回n; } sz=(n+1)*(m+1)*大小(int); d=(int*)malloc(sz); //第2步 对于(i=0;i<=n;i++){ PutAt(d,i,0,n,i); } 对于(j=0;j<=m;j++){ PutAt(d,0,j,n,j); } //步骤3 对于(i=1;i<=n;i++){ s_i=s[i-1]; //第4步 对于(j=1;j<=m;j++){ tj=t[j-1]; //第5步 如果(si==tj){ 成本=0; } 其他{ 成本=1; } //第6步 above=GetAt(d,i-1,j,n); left=GetAt(d,i,j-1,n); diag=GetAt(d,i-1,j-1,n); cell=最小值(上方+1,左侧+1,diag+cost); PutAt(d,i,j,n,cell); } } //第7步 结果=GetAt(d,n,m,n); 免费(d); 返回结果; }
'******************************* '***至少获取三个值 '******************************* 私有函数最小值(ByVal a作为整数_ ByVal b作为整数_ ByVal c作为整数)作为整数 Dim mi为整数 mi=a 如果b<mi,则 mi=b End If(结束条件) 如果c<mi,则 mi=c End If(结束条件) 最小值=mi End函数 '******************************** '***计算Levenshtein距离 '******************************** 公共函数LD(ByVal s作为字符串,ByVal t作为字符串)作为整数 Dim d()As Integer矩阵 尺寸m为t的整数长度 Dim n As Integer'长度s Dim i As Integer'遍历s Dim j As Integer'遍历t Dim s_i As String'包含s个字符 Dim t_j作为字符串't的第j个字符 Dim cost As Integer成本 '步骤1 n=长度 m=长度(t) 如果n=0,则 LD=米 退出功能 End If(结束条件) 如果m=0,则 LD=n 退出功能 End If(结束条件) 将d(0到n,0到m)重定为整数 '步骤2 对于i=0到n d(i,0)=i 接下来i 对于j=0至m d(0,j)=j 下一个j '步骤3 对于i=1到n s_i=中间$(s,i,1) '步骤4 对于j=1至m t_j=中间$(t,j,1) '步骤5 如果s_i=t_j,则 成本=0 其他 成本=1 End If(结束条件) '步骤6 d(i,j)=最小值 下一个j 接下来i '步骤7 LD=d(n,m) 擦除d End函数