Suma de las distancias de Manhattan entre todos los pares de puntos

Dadas n coordenadas enteras. La tarea es encontrar la suma de la distancia de Manhattan entre todos los pares de coordenadas. 
Manhattan La distancia entre dos puntos (x 1 , y 1 ) y (x 2 , y 2 ) es: 
|x 1 – x 2 | + |y 1 – y 2 |
Ejemplos: 

Input : n = 4
        point1 = { -1, 5 }
        point2 = { 1, 6 }
        point3 = { 3, 5 }
        point4 = { 2, 3 }
Output : 22
Distance of { 1, 6 }, { 3, 5 }, { 2, 3 } from 
{ -1, 5 } are 3, 4, 5 respectively.
Therefore, sum = 3 + 4 + 5 = 12

Distance of { 3, 5 }, { 2, 3 } from { 1, 6 } 
are 3, 4 respectively.
Therefore, sum = 12 + 3 + 4 = 19

Distance of { 2, 3 } from { 3, 5 } is 3.
Therefore, sum = 19 + 3 = 22.

Método 1: (Fuerza bruta) 

Complejidad de tiempo: O(n 2 )
La idea es ejecutar dos bucles anidados, es decir, para cada punto, encontrar la distancia de Manhattan para todos los demás puntos.  

for (i = 1; i < n; i++)

  for (j = i + 1; j < n; j++)

    sum += ((xi - xj) + (yi - yj))

A continuación se muestra la implementación de este enfoque:  

C++

// CPP Program to find sum of Manhattan distance
// between all the pairs of given points
#include <bits/stdc++.h>
using namespace std;
 
// Return the sum of distance between all
// the pair of points.
int distancesum(int x[], int y[], int n)
{
    int sum = 0;
 
    // for each point, finding distance to
    // rest of the point
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            sum += (abs(x[i] - x[j]) + abs(y[i] - y[j]));
    return sum;
}
 
// Driven Program
int main()
{
    int x[] = { -1, 1, 3, 2 };
    int y[] = { 5, 6, 5, 3 };
    int n = sizeof(x) / sizeof(x[0]);
    cout << distancesum(x, y, n) << endl;
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

C

// C Program to find sum of Manhattan distance
// between all the pairs of given points
#include <stdio.h>
#include <stdlib.h>
 
// Return the sum of distance between all
// the pair of points.
int distancesum(int x[], int y[], int n)
{
    int sum = 0;
 
    // for each point, finding distance to
    // rest of the point
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            sum += (abs(x[i] - x[j]) + abs(y[i] - y[j]));
    return sum;
}
 
// Driven Program
int main()
{
    int x[] = { -1, 1, 3, 2 };
    int y[] = { 5, 6, 5, 3 };
    int n = sizeof(x) / sizeof(x[0]);
    printf("%d\n", distancesum(x, y, n));
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

Java

// Java Program to find sum of Manhattan distance
// between all the pairs of given points
 
import java.io.*;
 
class GFG {
 
    // Return the sum of distance between all
    // the pair of points.
    static int distancesum(int x[], int y[], int n)
    {
        int sum = 0;
 
        // for each point, finding distance to
        // rest of the point
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j < n; j++)
                sum += (Math.abs(x[i] - x[j])
                        + Math.abs(y[i] - y[j]));
        return sum;
    }
 
    // Driven Program
    public static void main(String[] args)
    {
        int x[] = { -1, 1, 3, 2 };
        int y[] = { 5, 6, 5, 3 };
        int n = x.length;
 
        System.out.println(distancesum(x, y, n));
    }
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

Python3

# Python3 code to find sum of
# Manhattan distance between all
# the pairs of given points
 
# Return the sum of distance
# between all the pair of points.
def distancesum (x, y, n):
    sum = 0
     
    # for each point, finding distance
    # to rest of the point
    for i in range(n):
        for j in range(i+1,n):
            sum += (abs(x[i] - x[j]) +
                        abs(y[i] - y[j]))
     
    return sum
 
# Driven Code
x = [ -1, 1, 3, 2 ]
y = [ 5, 6, 5, 3 ]
n = len(x)
print(distancesum(x, y, n) )
 
# This code is contributed by "Sharad_Bhardwaj".

C#

// C# Program to find sum of Manhattan distance
// between all the pairs of given points
using System;
 
class GFG {
     
    // Return the sum of distance between all
    // the pair of points.
    static int distancesum(int []x, int []y, int n)
    {
        int sum = 0;
 
        // for each point, finding distance to
        // rest of the point
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j < n; j++)
                sum += (Math.Abs(x[i] - x[j]) +
                            Math.Abs(y[i] - y[j]));
        return sum;
    }
 
    // Driven Program
    public static void Main()
    {
        int []x = { -1, 1, 3, 2 };
        int []y = { 5, 6, 5, 3 };
        int n = x.Length;
         
        Console.WriteLine(distancesum(x, y, n));
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP Program to find sum
// of Manhattan distance
// between all the pairs
// of given points
 
// Return the sum of distance
// between all the pair of points.
function distancesum( $x, $y, $n)
{
    $sum = 0;
 
    // for each point, finding
    // distance to rest of
    // the point
    for($i = 0; $i < $n; $i++)
        for ($j = $i + 1; $j < $n; $j++)
            $sum += (abs($x[$i] - $x[$j]) +
                     abs($y[$i] - $y[$j]));
    return $sum;
}
 
    // Driver Code
    $x = array(-1, 1, 3, 2);
    $y = array(5, 6, 5, 3);
    $n = count($x);
    echo distancesum($x, $y, $n);
     
// This code is contributed by anuj_67.
?>

Javascript

<script>
 
// JavaScript Program to find sum of Manhattan distance
// between all the pairs of given points
 
    // Return the sum of distance between all
    // the pair of points.
    function distancesum(x, y, n)
    {
        let sum = 0;
  
        // for each point, finding distance to
        // rest of the point
        for (let i = 0; i < n; i++)
            for (let j = i + 1; j < n; j++)
                sum += (Math.abs(x[i] - x[j]) +
                            Math.abs(y[i] - y[j]));
        return sum;
    }
 
// Driver code
        let x = [ -1, 1, 3, 2 ];
        let y = [ 5, 6, 5, 3 ];
        let n = x.length;
          
        document.write(distancesum(x, y, n));
          
         // This code is contributed by sanjoy_62.
</script>

Producción:  

22

Tiempo Complejidad: O(n 2
Espacio Auxiliar: O(1)

Método 2: (Enfoque eficiente) 

  1. La idea es utilizar el enfoque codicioso. Primero observe, la fórmula de Manhattan se puede descomponer en dos sumas independientes, una para la diferencia entre las coordenadas x y la segunda entre las coordenadas y . Si sabemos cómo calcular uno de ellos, podemos usar el mismo método para calcular el otro. Así que ahora nos limitaremos a calcular la suma de las coordenadas x de la distancia.
  2. Supongamos que hemos calculado la suma de distancias entre dos puntos cualesquiera hasta un punto x i-1 para todos los valores de x menores que x i-1 , dejemos que esta suma sea res y ahora tenemos que calcular la distancia entre cualquier dos puntos con x i incluido, donde x i es el siguiente punto mayor, Para calcular la distancia de cada punto al siguiente punto mayor x i , podemos sumar la suma de diferencias existente res con la distancia de x i a todos los puntos x k que son menores que x i. Por lo tanto, la suma entre dos puntos cualesquiera ahora será igual a res + ( x i x k ) , donde x i es el punto actual desde el cual se miden las diferencias, y x k son todos los puntos menores que x i .
  3. Debido a que para cada cálculo x i sigue siendo el mismo, podemos simplificar la suma como:

res = res + (x i – x 0 ) + (x i – x 1 ) + (x i – x 2 ) + (x i – x 3 )………(x i – x i-1 )

res = res + (x i )*i – (x 0 +x 1 + x 2 + …… x i-1 ) , porque en una array ordenada, hay i elementos más pequeños que el índice actual i .

res = res + (x i )*i – S i-1  , donde S i-1 es la suma de todos los puntos anteriores hasta el índice i – 1

        4. Para el nuevo índice i, necesitamos sumar la diferencia del índice actual x i de todos los índices anteriores x < x i

        5. Si clasificamos todos los puntos en orden no decreciente, podemos calcular fácilmente la suma deseada de distancias a lo largo de un eje entre cada par de coordenadas en tiempo O(N), procesando los puntos de izquierda a derecha y usando el método anterior. 
Además, no tenemos que preocuparnos si dos puntos tienen coordenadas iguales, después de ordenar los puntos en orden no decreciente, decimos que un punto x i-1 es x i más pequeño si y solo si aparece antes en la array ordenada.
A continuación se muestra la implementación de este enfoque: 

C++

// CPP Program to find sum of Manhattan
// distances between all the pairs of
// given points
#include <bits/stdc++.h>
using namespace std;
 
// Return the sum of distance of one axis.
int distancesum(int arr[], int n)
{
    // sorting the array.
    sort(arr, arr + n);
 
    // for each point, finding the distance.
    int res = 0, sum = 0;
    for (int i = 0; i < n; i++) {
        res += (arr[i] * i - sum);
        sum += arr[i];
    }
 
    return res;
}
 
int totaldistancesum(int x[], int y[], int n)
{
    return distancesum(x, n) + distancesum(y, n);
}
 
// Driven Program
int main()
{
    int x[] = { -1, 1, 3, 2 };
    int y[] = { 5, 6, 5, 3 };
    int n = sizeof(x) / sizeof(x[0]);
    cout << totaldistancesum(x, y, n) << endl;
    return 0;
}

Java

// Java Program to find sum of Manhattan
// distances between all the pairs of
// given points
 
import java.io.*;
import java.util.*;
 
class GFG {
     
    // Return the sum of distance of one axis.
    static int distancesum(int arr[], int n)
    {
         
        // sorting the array.
        Arrays.sort(arr);
 
        // for each point, finding the distance.
        int res = 0, sum = 0;
        for (int i = 0; i < n; i++) {
            res += (arr[i] * i - sum);
            sum += arr[i];
        }
 
        return res;
    }
 
    static int totaldistancesum(int x[],
                            int y[], int n)
    {
        return distancesum(x, n) +
                        distancesum(y, n);
    }
 
    // Driven Program
    public static void main(String[] args)
    {
 
        int x[] = { -1, 1, 3, 2 };
        int y[] = { 5, 6, 5, 3 };
        int n = x.length;
        System.out.println(totaldistancesum(x,
                                        y, n));
    }
}
 
// This code is contributed by vt_m.

Python3

# Python3 code to find sum of Manhattan
# distances between all the pairs of
# given points
 
# Return the sum of distance of one axis.
def distancesum (arr, n):
     
    # sorting the array.
    arr.sort()
     
    # for each point, finding
    # the distance.
    res = 0
    sum = 0
    for i in range(n):
        res += (arr[i] * i - sum)
        sum += arr[i]
     
    return res
     
def totaldistancesum( x , y , n ):
    return distancesum(x, n) + distancesum(y, n)
     
# Driven Code
x = [ -1, 1, 3, 2 ]
y = [ 5, 6, 5, 3 ]
n = len(x)
print(totaldistancesum(x, y, n) )
 
# This code is contributed by "Sharad_Bhardwaj".

C#

// C# Program to find sum of Manhattan
// distances between all the pairs of
// given points
 
using System;
 
class GFG {
     
    // Return the sum of distance of one axis.
    static int distancesum(int []arr, int n)
    {
         
        // sorting the array.
        Array.Sort(arr);
 
        // for each point, finding the distance.
        int res = 0, sum = 0;
        for (int i = 0; i < n; i++) {
            res += (arr[i] * i - sum);
            sum += arr[i];
        }
 
        return res;
    }
 
    static int totaldistancesum(int []x,
                            int []y, int n)
    {
        return distancesum(x, n) +
                        distancesum(y, n);
    }
 
    // Driven Program
    public static void Main()
    {
 
        int []x = { -1, 1, 3, 2 };
        int []y = { 5, 6, 5, 3 };
        int n = x.Length;
        Console.WriteLine(totaldistancesum(x,
                                        y, n));
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP Program to find sum of
// Manhattan distances between
// all the pairs of given points
 
// Return the sum of
// distance of one axis.
function distancesum($arr, $n)
{
    // sorting the array.
    sort($arr);
 
    // for each point,
    // finding the distance.
    $res = 0; $sum = 0;
    for ($i = 0; $i < $n; $i++)
    {
        $res += ($arr[$i] * $i - $sum);
        $sum += $arr[$i];
    }
 
    return $res;
}
 
function totaldistancesum($x, $y, $n)
{
    return distancesum($x, $n) +
           distancesum($y, $n);
}
 
// Driver Code
$x = array(-1, 1, 3, 2);
$y = array(5, 6, 5, 3);
$n = sizeof($x);
echo totaldistancesum($x, $y, $n), "\n";
 
// This code is contributed by m_kit
?>

Javascript

<script>
 
// JavaScript Program to find sum of Manhattan
// distances between all the pairs of
// given points
 
    // Return the sum of distance of one axis.
    function distancesum(arr, n)
    {
          
        // sorting the array.
        arr.sort();
  
        // for each point, finding the distance.
        let res = 0, sum = 0;
        for (let i = 0; i < n; i++) {
            res += (arr[i] * i - sum);
            sum += arr[i];
        }
  
        return res;
    }
  
    function totaldistancesum(x,
                            y, n)
    {
        return distancesum(x, n) +
                        distancesum(y, n);
    }
      
 
// Driver code
         
        let x = [ -1, 1, 3, 2 ];
        let y = [ 5, 6, 5, 3 ];
        let n = x.length;
        document.write(totaldistancesum(x,
                                        y, n));
                   
</script>

Producción : 

22

Complejidad de tiempo: O(n log n) 
Espacio auxiliar: O(1)

Este artículo es una contribución de Aarti_Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por anuj0503 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *