Thuật toán trong bài viết không tính toán khoảng cách Damerau-Levenshtein. Trong một wikipedia article thuật toán này được định nghĩa là Khoảng cách chuỗi liên kết tối ưu.
Việc triển khai java thuật toán khoảng cách DL có thể được tìm thấy trong một số SO post khác.
Để có được giá trị đúng đắn về khoảng cách OSA hãy thay đổi các dòng được đánh dấu bằng -
dưới đây với các dòng được đánh dấu bằng +
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];
}
Có vẻ như nếu mã đã được sao chép từ một chương trình viết bằng ngôn ngữ lập trình ở đâu chỉ số mảng bắt đầu ở mức 1 theo mặc định. Do đó tất cả các tham chiếu đến các phần tử của mảng khoảng cách d
được tăng lên. Tuy nhiên, các tham chiếu đến các ký tự trong các chuỗi là tham chiếu đến các mảng dựa trên 0, do đó chúng không được cập nhật.
Để tính toán khoảng cách mảng khoảng cách phải được khởi tạo đúng cách:
for(i = 0; i < n + 1; i++)
d[i][0] = i;
for(j = 1; j < m + 1; j++)
d[0][j] = j;
Vì bạn đã có câu trả lời 5, bạn có thể có mảng khoảng cách của bạn đã khởi tạo một cách chính xác.
Vì thuật toán trên không tính toán khoảng cách DL, đây là bản phác thảo về triển khai C của thuật toán DL (bắt nguồn từ bài SO với java impl. Xuất phát từ một đoạn mã ActionScript trong bài viết trên Wikipedia).
#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;
}
không phải là khoảng cách levensthein tính trên cây? loại dữ liệu cây của bạn ở đâu? – lurscher