数学-曼哈顿距离转切比雪夫距离

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;
    }

  

猜你喜欢

转载自www.cnblogs.com/hyserendipity/p/12242138.html