数学-曼哈顿距离转切比雪夫距离
2020-01-30 09:22:39
一、定义
曼哈顿距离:以二维举例,对于二维的两点p1(x1, y1),p2(x2, y2)它们的曼哈顿距离如下
dis = |x1 - x2| + |y1 - y2|
切比雪夫距离:以二维举例,对于二维的两点p1(x1, y1),p2(x2, y2)它们的切比雪夫距离如下
dis = max{|x1 - x2|, |y1 - y2|}
二、曼哈顿距离转切比雪夫距离
首先我们需要注意到为什么要进行转化。
如果求一组点的曼哈顿距离的最大值,是只能两两计算求极值的,时间复杂度显然是O(n^2)。
但是,如果我们转化成计算切比雪夫的最大值,那么我们只需要首先计算max(x) - min(x),在计算max(y) - min(y)从中区最大值即可,时间复杂度可以降低到O(n)。
现在我们来进行转化工作。
dis = |x1 - x2| + |y1 - y2|
= max{x1 - x2 + y1 - y2, x1 - x2 + y2 - y1, x2 - x1 + y1 - y2, x2 - x1 + y2 - y1}
= max{|(x1 + y1) - (x2 + y2)|, |(x1 - y1) - (x2 - y2)|
从上述的变化中我们可以看出,将(x, y)映射到(x + y, x - y)那么计算新空间的切比雪夫距离和原空间的曼哈顿距离是等价的。
类比到三维空间中,就是将(x, y, z)映射到(x + y + z, x + y - z, x - y + z, x - y - z)。
三、例题
问题描述:

问题求解:
public int maxAbsValExpr(int[] arr1, int[] arr2) {
int res = Integer.MIN_VALUE;
int n = arr1.length;
int[][] points = new int[n][4];
for (int i = 0; i < n; i++) {
int x = i;
int y = arr1[i];
int z = arr2[i];
points[i][0] = x + y + z;
points[i][1] = x + y - z;
points[i][2] = x - y + z;
points[i][3] = x - y - z;
}
for (int i = 0; i < 4; i++) {
res = Math.max(res, get_max(points, i) - get_min(points, i));
}
return res;
}
private int get_max(int[][] nums, int dim) {
int res = Integer.MIN_VALUE;
for (int[] num : nums) res = Math.max(res, num[dim]);
return res;
}
private int get_min(int[][] nums, int dim) {
int res = Integer.MAX_VALUE;
for (int[] num : nums) res = Math.min(res, num[dim]);
return res;
}

浙公网安备 33010602011771号