📌  相关文章
📜  到所有给定点的最小欧氏距离总和

📅  最后修改于: 2021-05-17 03:51:14             🧑  作者: Mango

给定矩阵mat [] [],该矩阵mat[ x,y}形式的N对组成,每对表示N个点的坐标,任务是找到到所有点的欧几里得距离的最小和。

例子:

方法:
由于任务是最小化到所有点的欧几里德距离,因此我们的想法是计算所有点的中值。几何中位数将中位数的概念推广到更高维度

请按照以下步骤解决问题:

  • 通过获取点的平均值,计算所有给定坐标的质心。
  • 求出质心到所有点的欧几里得距离。
  • 计算这些距离的总和并作为答案。

下面是上述方法的实现:

C++
// C++ Program to implement
// the above approach
#include 
using namespace std;
  
// Function to calculate Euclidean distance
double find(double x, double y,
            vector >& p)
{
  
    double mind = 0;
    for (int i = 0; i < p.size(); i++) {
  
        double a = p[i][0], b = p[i][1];
        mind += sqrt((x - a) * (x - a)
                     + (y - b) * (y - b));
    }
  
    return mind;
}
  
// Function to calculate the minimum sum
// of the euclidean distances to all points
double getMinDistSum(vector >& p)
{
  
    // Calculate the centroid
    double x = 0, y = 0;
    for (int i = 0; i < p.size(); i++) {
        x += p[i][0];
        y += p[i][1];
    }
    x = x / p.size();
    y = y / p.size();
  
    // Calculate distance of all
    // points
    double mind = find(x, y, p);
  
    return mind;
}
  
// Driver Code
int main()
{
  
    // Initializing the points
    vector > vec
        = { { 0, 1 }, { 1, 0 }, { 1, 2 }, { 2, 1 } };
  
    double d = getMinDistSum(vec);
    cout << d << endl;
  
    return 0;
}


Java
// Java program to implement
// the above approach
class GFG{
  
// Function to calculate Euclidean distance
static double find(double x, double y,
                   int [][] p)
{
    double mind = 0;
      
    for(int i = 0; i < p.length; i++)
    {
        double a = p[i][0], b = p[i][1];
        mind += Math.sqrt((x - a) * (x - a) +
                          (y - b) * (y - b));
    }
    return mind;
}
  
// Function to calculate the minimum sum
// of the euclidean distances to all points
static double getMinDistSum(int [][]p)
{
      
    // Calculate the centroid
    double x = 0, y = 0;
    for(int i = 0; i < p.length; i++)
    {
        x += p[i][0];
        y += p[i][1];
    }
      
    x = x / p.length;
    y = y / p.length;
  
    // Calculate distance of all
    // points
    double mind = find(x, y, p);
  
    return mind;
}
  
// Driver Code
public static void main(String[] args)
{
      
    // Initializing the points
    int [][]vec = { { 0, 1 }, { 1, 0 },
                    { 1, 2 }, { 2, 1 } };
  
    double d = getMinDistSum(vec);
      
    System.out.print(d + "\n");
}
}
  
// This code is contributed by Amit Katiyar


Python3
# Python3 program to implement
# the above approach
from math import sqrt
  
# Function to calculate Euclidean distance
def find(x, y, p):
  
    mind = 0
    for i in range(len(p)):
        a = p[i][0]
        b = p[i][1]
        mind += sqrt((x - a) * (x - a) +
                     (y - b) * (y - b))
                       
    return mind
  
# Function to calculate the minimum sum
# of the euclidean distances to all points
def getMinDistSum(p):
  
    # Calculate the centroid
    x = 0
    y = 0
      
    for i in range(len(p)):
        x += p[i][0]
        y += p[i][1]
          
    x = x // len(p)
    y = y // len(p)
  
    # Calculate distance of all
    # points
    mind = find(x, y, p)
  
    return mind
  
# Driver Code
if __name__ == '__main__':
  
    # Initializing the points
    vec = [ [ 0, 1 ], [ 1, 0 ],
            [ 1, 2 ], [ 2, 1 ] ]
  
    d = getMinDistSum(vec)
    print(int(d))
  
# This code is contributed by mohit kumar 29


C#
// C# program to implement
// the above approach
using System;
class GFG{
  
// Function to calculate Euclidean distance
static double find(double x, double y,
                   int [,] p)
{
    double mind = 0;
      
    for(int i = 0; i < p.GetLength(0); i++)
    {
        double a = p[i,0], b = p[i,1];
        mind += Math.Sqrt((x - a) * (x - a) +
                          (y - b) * (y - b));
    }
    return mind;
}
  
// Function to calculate the minimum sum
// of the euclidean distances to all points
static double getMinDistSum(int [,]p)
{
      
    // Calculate the centroid
    double x = 0, y = 0;
    for(int i = 0; i < p.GetLength(0); i++)
    {
        x += p[i,0];
        y += p[i,1];
    }
      
    x = x / p.Length;
    y = y / p.Length;
  
    // Calculate distance of all
    // points
    double mind = find(x, y, p);
  
    return mind;
}
  
// Driver Code
public static void Main(String[] args)
{
      
    // Initializing the points
    int [,]vec = { { 0, 1 }, { 1, 0 },
                    { 1, 2 }, { 2, 1 } };
  
    int d = (int)getMinDistSum(vec);
      
    Console.Write(d + "\n");
}
}
  
// This code is contributed by Rohit_ranjan


输出:
4

时间复杂度: O(N)
辅助空间: O(1)