Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8687281
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 12, 20262026-06-12T23:04:55+00:00 2026-06-12T23:04:55+00:00

The question is: Given N points(in 2D) with x and y coordinates, find a

  • 0

The question is:

Given N points(in 2D) with x and y coordinates, find a point P (in N
given points) such that the sum of distances from other(N-1) points to
P is minimum.

This point is commonly known as Geometric Median. Is there any efficient algorithm to solve this problem, other than the naive O(N^2) one?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-12T23:04:56+00:00Added an answer on June 12, 2026 at 11:04 pm

    I solved something similar for a local online judge once using simulated annealing. That was the official solution as well and the program got AC.

    The only difference was that the point I had to find did not have to be part of the N given points.

    This was my C++ code, and N could be as large as 50000. The program executes in 0.1s on a 2ghz pentium 4.

    // header files for IO functions and math
    #include <cstdio>
    #include <cmath>
    
    // the maximul value n can take
    const int maxn = 50001;
    
    // given a point (x, y) on a grid, we can find its left/right/up/down neighbors
    // by using these constants: (x + dx[0], y + dy[0]) = upper neighbor etc.
    const int dx[] = {-1, 0, 1, 0};
    const int dy[] = {0, 1, 0, -1};
    
    // controls the precision - this should give you an answer accurate to 3 decimals
    const double eps = 0.001;
    
    // input and output files
    FILE *in = fopen("adapost2.in","r"), *out = fopen("adapost2.out","w");
    
    // stores a point in 2d space
    struct punct
    {
        double x, y;
    };
    
    // how many points are in the input file
    int n;
    
    // stores the points in the input file
    punct a[maxn];
    
    // stores the answer to the question
    double x, y;
    
    // finds the sum of (euclidean) distances from each input point to (x, y)
    double dist(double x, double y)
    {
        double ret = 0;
    
        for ( int i = 1; i <= n; ++i )
        {
            double dx = a[i].x - x;
            double dy = a[i].y - y;
    
            ret += sqrt(dx*dx + dy*dy); // classical distance formula
        }
    
        return ret;
    }
    
    // reads the input
    void read()
    {
        fscanf(in, "%d", &n); // read n from the first 
    
        // read n points next, one on each line
        for ( int i = 1; i <= n; ++i )
            fscanf(in, "%lf %lf", &a[i].x, &a[i].y), // reads a point
            x += a[i].x,
            y += a[i].y; // we add the x and y at first, because we will start by approximating the answer as the center of gravity
    
        // divide by the number of points (n) to get the center of gravity
        x /= n; 
        y /= n;
    }
    
    // implements the solving algorithm
    void go()
    {
        // start by finding the sum of distances to the center of gravity
        double d = dist(x, y);
    
        // our step value, chosen by experimentation
        double step = 100.0;
    
        // done is used to keep track of updates: if none of the neighbors of the current
        // point that are *step* steps away improve the solution, then *step* is too big
        // and we need to look closer to the current point, so we must half *step*.
        int done = 0;
    
        // while we still need a more precise answer
        while ( step > eps )
        {
            done = 0;
            for ( int i = 0; i < 4; ++i )
            {
                // check the neighbors in all 4 directions.
                double nx = (double)x + step*dx[i];
                double ny = (double)y + step*dy[i];
    
                // find the sum of distances to each neighbor
                double t = dist(nx, ny);
    
                // if a neighbor offers a better sum of distances
                if ( t < d )
                {
                    update the current minimum
                    d = t;
                    x = nx;
                    y = ny;
    
                    // an improvement has been made, so
                    // don't half step in the next iteration, because we might need
                    // to jump the same amount again
                    done = 1;
                    break;
                }
            }
    
            // half the step size, because no update has been made, so we might have
            // jumped too much, and now we need to head back some.
            if ( !done )
                step /= 2;
        }
    }
    
    int main()
    {
        read();
        go();
    
        // print the answer with 4 decimal points
        fprintf(out, "%.4lf %.4lf\n", x, y);
    
        return 0;
    }
    

    Then I think It’s correct to pick the one from your list that is closest to the (x, y) returned by this algorithm.

    This algorithm takes advantage of what this wikipedia paragraph on the geometric median says:

    However, it is straightforward to calculate an approximation to the
    geometric median using an iterative procedure in which each step
    produces a more accurate approximation. Procedures of this type can be
    derived from the fact that the sum of distances to the sample points
    is a convex function, since the distance to each sample point is
    convex and the sum of convex functions remains convex. Therefore,
    procedures that decrease the sum of distances at each step cannot get
    trapped in a local optimum.

    One common approach of this type, called
    Weiszfeld’s algorithm after the work of Endre Weiszfeld,[4] is a form
    of iteratively re-weighted least squares. This algorithm defines a set
    of weights that are inversely proportional to the distances from the
    current estimate to the samples, and creates a new estimate that is
    the weighted average of the samples according to these weights. That
    is,

    The first paragraph above explains why this works: because the function we are trying to optimize does not have any local minimums, so you can greedily find the minimum by iteratively improving it.

    Think of this as a sort of binary search. First, you approximate the result. A good approximation will be the center of gravity, which my code computes when reading the input. Then, you see if adjacent points to this give you a better solution. In this case, a point is considered adjacent if it as a distance of step away from your current point. If it is better, then it is fine to discard your current point, because, as I said, this will not trap you into a local minimum because of the nature of the function you are trying to minimize.

    After this, you half the step size, just like in binary search, and continue until you have what you consider to be a good enough approximation (controlled by the eps constant).

    The complexity of the algorithm therefore depends on how accurate you want the result to be.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

from the title you can read that I'm given latitude and longitude points. They
I am looking at the following interview question : Given 2d coordinates , find
Given a set of points p , I would like to find a point
Question: Given a SQL string like CREATE VIEW TestView AS SELECT value1, value2 FROM
QUESTION: Given a cell index (red) compute the array index (black) that surround the
That's the question xD Given an instance of a CCSprite in cocos2d in iphone,
I came across this question: say given two weights 1 and 3, u can
I know this is a bit bleeding edge, but here's the question anyway: Given
Problem: Given : n points that are strongly correlated to a 3d k-sided non-convex
Another collinear-points question. This one's twist is, I'm using integer arithmetic, and I'm looking

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.