zoukankan      html  css  js  c++  java
  • 数学-曼哈顿距离转切比雪夫距离

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

      

  • 相关阅读:
    树形dp入门
    D. Kilani and the Game(多源BFS)
    C. Ayoub and Lost Array
    poj3254(状压dp)
    CodeForces
    链式前项星(模板)
    “东信杯”广西大学第一届程序设计竞赛(同步赛)H
    最小生成树kruskal模板
    hdu-4763(kmp+拓展kmp)
    poj-3080(kmp+暴力枚举)
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12242138.html
Copyright © 2011-2022 走看看