Algorithm 在二维平面上划分一组点

Algorithm 在二维平面上划分一组点,algorithm,computational-geometry,partitioning,Algorithm,Computational Geometry,Partitioning,问题陈述如下: “给你一组N个点,其中N是偶数,N有一种简单的方法可以在O(N^2 logn)时间内完成 也许可以缩短排序时间,因为排序后的斜坡阵列将接近排序(只需要O(n)时间即可完全排序)将极坐标转换到另一个原点时,但我目前无法证明这一点。如果您愿意展示自己在尝试解决问题时所做的努力,则最好是自己-至少向我们展示您尝试过O(n^3)的蛮力解决方案-然后你可以问它如何改进…谢谢你的回答。我已经添加了蛮力方法。请注意,排序坡度不会这样做。永远移动-你只想得到坡度数组中的第k个元素,这可以在O(n

问题陈述如下:
“给你一组N个点,其中N是偶数,N有一种简单的方法可以在O(N^2 logn)时间内完成


也许可以缩短排序时间,因为排序后的斜坡阵列将接近排序(只需要O(n)时间即可完全排序)将极坐标转换到另一个原点时,但我目前无法证明这一点。

如果您愿意展示自己在尝试解决问题时所做的努力,则最好是自己-至少向我们展示您尝试过O(n^3)的蛮力解决方案-然后你可以问它如何改进…谢谢你的回答。我已经添加了蛮力方法。请注意,排序坡度不会这样做。永远移动-你只想得到坡度数组中的第k个元素,这可以在O(n)中完成考虑下面的5点作为五角大厦和六点在中间-这种情况将失败的斜坡排序,因为每一个点的五角大楼回答约束与中间。point@DavidWinder我不明白你的例子。是的,五角大楼的每个点都会回答这个约束。算法会找到它们,就像它应该找到的那样。什么这是你的选择吗?所以我可能误解了你的算法:你所说的
确定线OA两侧有多少点(这是一个O(1)作业)
?给定O(1)中的排序斜率数组,你怎么做?我知道我没有解释清楚。将algo的内环视为一个旋转的圆直径。它将圆分成两半,比如红色和蓝色。圆上有一些点。最初你知道有多少点是任意颜色的。然后随着直径的旋转,你知道它的两端b将击中下一个点因为点已排序。将其重新绘制为相反的颜色。每次红色和蓝色点的数量相等时,您都会找到答案中的一个元素。循环在直径旋转180°时结束。O(N)通过所有N点,每个点O(1)。谢谢!我已经实现了此算法。它对我有效且足够高效。
class Point{
public:
   int x, y;
   Point(){x = y = 0;}
   void make_point(int X, int Y){ x = X; y = Y; }
   int Point:: orientation (Point &p0, Point &p1){
     Point p2 = *this;
     Point a = p1 - p0;
     Point b = p2 - p0;
     int area = (a.x * b.y) - (b.x * a.y);
     if (area > 0)return 1;
     if (area < 0)return -1;
     return 0;
   }
};
int main() {
  Point p[4];
  p[0].make_point(0, 0);
  p[1].make_point(0, 1);
  p[2].make_point(1, 1);
  p[3].make_point(1, 0);
  int sz = sizeof(p) / sizeof(p[0]);
  int ans = 0;
  for (int i = 0; i < sz; i++){
    for (int j = i+1; j < sz; j++){
        int leftCnt = 0, rightCnt = 0;
        for (int k = 0; k < sz; k++){
            if (k == i || k == j)continue;
            if (p[k].orientation(p[i], p[j]) == 1)leftCnt++;
            if (p[k].orientation(p[i], p[j]) == -1)rightCnt++;
        }
        if (leftCnt == rightCnt && leftCnt == (sz/2-1))ans++;
    }
  }
  cout << ans << '\n';

  return 0;
}
for each point O in the set
   for each point A /= O
      calculate the slope of the ray OA 
   sort the points by the slope (this is the n log n limiting step) 
   for each point A /= O
      determine how many points are at either side of the line OA (this is an O(1) job)