我正在研究这段代码以找到动态时间扭曲距离,但我无法理解某些部分。
public static void d(int[] x1, int[] x2) {
int n1 = x1.length;
int n2 = x2.length;
double[][] table = new double[2][n2 + 1];
table[0][0] = 0;
for (int i = 1; i <= n2; i++) {
table[0][i] = Double.POSITIVE_INFINITY;
}
for (int i = 1; i <= n1; i++) {
table[1][0] = Double.POSITIVE_INFINITY;
for (int j = 1; j <= n2; j++) {
double cost = Math.abs(x1[i-1] - x2[j-1]);
double min = table[0][j - 1];
if (min > table[0][j]) {
min = table[0][j];
}
if (min > table[1][j - 1]) {
min = table[1][j - 1];
}
table[1][j] = cost + min;
}
double[] swap = table[0];
table[0] = table[1];
table[1] = swap;
}
System.out.println(table[0][n2]);
}
首先,为什么这条线会创建一个“垂直”数组[2][n2+1]
?
double[][] table = new double[2][n2 + 1];
其次,在最后一行我们为什么要打印table[0][n2]
?最终值不应该是[n1][n2]
?
最后,为什么我们在这里交换?
double[] swap = table[0];
table[0] = table[1];
table[1] = swap;