gpt4 book ai didi

c++ - Damerau–Levenshtein distance (Edit Distance with Transposition) c实现

转载 作者:可可西里 更新时间:2023-11-01 15:15:42 26 4
gpt4 key购买 nike

我在 C++ 中实现了 Damerau–Levenshtein 距离,但它没有为输入(pantera,主动脉)提供正确的 o/p,正确的 o/p 是 4,但我的代码给出了 5......

int  editdist(string s,string t,int n,int m) 
{
int d1,d2,d3,cost;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
if(s[i+1]==t[j+1])
cost=0;
else
cost=1;
d1=d[i][j+1]+1;
d2=d[i+1][j]+1;
d3=d[i][j]+cost;
d[i+1][j+1]=minimum(d1,d2,d3);
if(i>0 && j>0 && s[i+1]==t[j] && s[i]==t[j+1] ) //transposition
{
d[i+1][j+1]=min(d[i+1][j+1],d[i-1][j-1]+cost);
}
}
}
return d[n+1][m+1];
}

我没有看到任何错误。有人能找到代码的问题吗?

最佳答案

帖子中的算法不计算 Damerau-Levenshtein 距离。在 wikipedia article该算法被定义为最佳字符串对齐距离。

DL 距离算法的 java 实现可以在另一个 SO post 中找到.

要获得正确的 OSA 距离值,请将下面标有 - 的行更改为标有 + 的行

 int  editdist(string s,string t,int n,int m) 
{
int d1,d2,d3,cost;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
- if(s[i+1]==t[j+1])
+ if(s[i+1]==t[j+1])
cost=0;
else
cost=1;
d1=d[i][j+1]+1;
d2=d[i+1][j]+1;
d3=d[i][j]+cost;
d[i+1][j+1]=minimum(d1,d2,d3);
- if(i>0 && j>0 && s[i+1]==t[j] && s[i]==t[j+1] ) //transposition
+ if(i>0 && j>0 && s[i]==t[j-1] && s[i-1]==t[j] ) //transposition
{
d[i+1][j+1]=min(d[i+1][j+1],d[i-1][j-1]+cost);
}
}
}
return d[n+1][m+1];
}

看起来好像代码是从用默认情况下数组索引从 1 开始的编程语言编写的程序中复制的。因此,所有对距离数组 d 元素的引用都会递增。但是,对字符串中字符的引用是对从 0 开始的数组的引用,因此不应更新它们。

要计算距离,必须正确初始化距离数组:

for( i = 0; i < n + 1; i++)
d[i][0] = i;
for( j = 1; j < m + 1; j++)
d[0][j] = j;

既然你得到了答案 5,你的距离数组可能已经正确初始化了。

由于上述算法不计算 DL 距离,这里是 DL 算法的 C 实现的草图(源自 SO 帖子,其中包含从维基百科文章中的 ActionScript 实现派生的 java 实现)。

#define d(i,j) dd[(i) * (m+2) + (j) ]
#define min(x,y) ((x) < (y) ? (x) : (y))
#define min3(a,b,c) ((a)< (b) ? min((a),(c)) : min((b),(c)))
#define min4(a,b,c,d) ((a)< (b) ? min3((a),(c),(d)) : min3((b),(c),(d)))

int dprint(int* dd, int n,int m){
int i,j;
for (i=0; i < n+2;i++){
for (j=0;j < m+2; j++){
printf("%02d ",d(i,j));
}
printf("\n");
}
printf("\n");
return 0;
}

int dldist2(char *s, char* t, int n, int m) {
int *dd;
int i, j, cost, i1,j1,DB;
int INFINITY = n + m;
int DA[256 * sizeof(int)];

memset(DA, 0, sizeof(DA));

if (!(dd = (int*) malloc((n+2)*(m+2)*sizeof(int)))) {
return -1;
}

d(0,0) = INFINITY;
for(i = 0; i < n+1; i++) {
d(i+1,1) = i ;
d(i+1,0) = INFINITY;
}
for(j = 0; j<m+1; j++) {
d(1,j+1) = j ;
d(0,j+1) = INFINITY;
}
dprint(dd,n,m);

for(i = 1; i< n+1; i++) {
DB = 0;
for(j = 1; j< m+1; j++) {
i1 = DA[t[j-1]];
j1 = DB;
cost = ((s[i-1]==t[j-1])?0:1);
if(cost==0) DB = j;
d(i+1,j+1) =
min4(d(i,j)+cost,
d(i+1,j) + 1,
d(i,j+1)+1,
d(i1,j1) + (i-i1-1) + 1 + (j-j1-1));
}
DA[s[i-1]] = i;
dprint(dd,n,m);
}
cost = d(n+1,m+1);
free(dd);
return cost;
}

关于c++ - Damerau–Levenshtein distance (Edit Distance with Transposition) c实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com