java中的Wagner Fischer算法实现

时间:2015-09-30 06:06:59

标签: java algorithm

我正在尝试使用Wikipedia参考

在java中实现Wagner-Fischer algorithm

wagner-fischer

Java代码:

public class StringDistance {

public static void main(String[] args) {
    int i, j, m, n, temp, tracker;

    int[][] d = new int[50][50];

    String s = "kitten";
    String t = "sitting";

    char u[] = s.toCharArray();
    char v[] = t.toCharArray();

    m = u.length;
    n = v.length;

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

    for (j = 1; j <= m; j++) {
        for (i = 1; i <= n; i++) {
            if (u[i - 1] == v[j - 1]) {
                tracker = 0;
            } else {
                tracker = 1;
            }

            temp = Math.min((d[i - 1][j] + 1), (d[i][j - 1] + 1));
            d[i][j] = Math.min(temp, (d[i - 1][j - 1] + tracker));

        }
    }

    System.out.println("The levenstien distance" + d[n][m]);
}
}

但是上面的代码只适用于长度相等的字符串。如果我想为不相等的字符串做这项工作。请让我知道如何克服这个问题。

我得到的索引超出界限错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at StringDistance.main(StringDistance.java:32)

2 个答案:

答案 0 :(得分:1)

让我们摆脱一些局部变量,以便更清楚地说明原因:

for (j = 1; j <= u.length; j++) {
    for (i = 1; i <= v.length; i++) {
        if (u[i - 1] == v[j - 1]) {
            tracker = 0;
        } else {
            tracker = 1;
        }

您使用i - 1(保证在v范围内)作为uj - 1的索引(保证是{范围为u)作为v的索引。

所以我怀疑这个表达:

u[i - 1] == v[j - 1]

应该只是

u[j - 1] == v[i - 1]

我强烈建议仅在首次使用时声明变量,在最小范围内,并使用基于0的索引而不是基于1的索引。条件运算符也有帮助。所以你的循环将成为:

for (int j = 0; j < u.length; j++) {
    for (int i = 0; i < v.length; i++) {
        int tracker = u[j] == v[i] ? 0 : 1;
        int temp = Math.min(d[i][j + 1] + 1, d[i + 1][j] + 1);
        d[i + 1][j + 1] = Math.min(temp, d[i][j] + tracker);
    }
}

答案 1 :(得分:0)

根据wagner-fischer algorithm

,您在循环中使用了错误的条件
 for (j = 1; j <= n; j++) {
    for (i = 1; i <= m; i++) {
        if (u[i - 1] == v[j - 1]) {
            tracker = 0;
        } else {
            tracker = 1;
        }

        temp = Math.min((d[i - 1][j] + 1), (d[i][j - 1] + 1));
        d[i][j] = Math.min(temp, (d[i - 1][j - 1] + tracker));

    }
}

您还需要检查跟踪器状况是否正确。