数学-曼哈顿距离转切比雪夫距离
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; }