一尘不染

找到距离最远的点的算法-比O(n ^ 2)好吗?

algorithm

在我的程序中,我有一些要点。为了进行重新缩放,我正在搜索距离最远的两个节点,然后计算一个乘以所有坐标的因数,以使最大距离等于我定义的某个预定义坐标。

我用来查找最远的两个点的算法,但是对于大的点集是有问题的O(n^2)。伪代码(已计算的距离被跳过):

 for each point in points:
     for each other point in points:
         if distance between point and other point > max
             max = distance between point and other point

有更快的东西吗?


阅读 304

收藏
2020-07-28

共1个答案

一尘不染

如果您只需要比例尺而不是精确点,则可以在O(n)时间内执行此操作,并具有一定的误差余量。考虑制作边界框的简单情况。从所有点计算最小x值,最大x,最小y和最大y。这四个数字为您提供了一个最大的包围点,最大误差为1-(1
/ sqrt(2))约30%。您可以通过为正方形添加更多边来减少这种情况。考虑一个八边形的情况。要计算另一侧的最小值和最大值,必须旋转坐标系。

错误与运行时间的关系如下所示。

形状-运行时间-最大误差

  • 平方-2N-30%
  • 八边形-4N-16%
  • 16面-8N-4%
  • 32面-16N-1%

这是我想出的最大误差的方程式。

angle = 180 / sides
max_error = (1 / cos angle) - cos angle

让我知道是否应该添加一个说明图。

2020-07-28