给定平面中大致位置的 N 个点的列表(没有三个点共线),找到一个与 N 个原始点中的任何对都不共线的新点 p。
我们显然无法搜索平面上的每个点,我从找到可以与给定点形成的所有线的重合点开始,或者用它们做一个圆圈。我不知道如何检查所有的点。
在http://introcs.cs.princeton.edu/java/42sort/中发现的问题
我在一本著名的算法书中发现了这个问题,这意味着它是可以回答的,但我想不出一个最佳解决方案,这就是为什么我在这里发布它,以便如果有人知道他/她可以回答它
给定平面中大致位置的 N 个点的列表(没有三个点共线),找到一个与 N 个原始点中的任何对都不共线的新点 p。
我们显然无法搜索平面上的每个点,我从找到可以与给定点形成的所有线的重合点开始,或者用它们做一个圆圈。我不知道如何检查所有的点。
在http://introcs.cs.princeton.edu/java/42sort/中发现的问题
我在一本著名的算法书中发现了这个问题,这意味着它是可以回答的,但我想不出一个最佳解决方案,这就是为什么我在这里发布它,以便如果有人知道他/她可以回答它
您实际上可以使用简单的 O(nlogn) 算法解决它,然后我们将其改进为 O(n)。将 A 命名为最底部的点(如果出现平局,请选择 x 坐标较小的点)。您现在可以使用 CCW 按顺时针顺序对其余点进行排序。现在,当您从排序顺序处理每个点时,您可以看到在与点 A 和底轴具有不同角度的任意两个连续点之间(让这些点为 U,V),没有角度为 c 的点,且 U <= c <= V. 所以我们可以在本节中添加任何点,并保证它不会与集合中的任何其他点共线。所以,你只需要找到一对相邻的点就可以了。因此,在 O(n) 时间内找到与 A 的最小和第二个最小角度(这些应该不同),并选择它们之间的任何点。
我能想到的最好的算法是 N^2 算法。开始:
步骤5中如何选择P沿L的下一个位置的细节留给你,
您可以进行一些明显的微不足道的拒绝测试,以便仅在测试线 M 与 L“足够平行”的情况下进行更昂贵的检查。
最后,我应该提一下,有可能将 P 推得足够远,以至于出现数值问题。在这种情况下,我可以建议的最好方法是在凸包之外尝试另一条线,距离至少为3e。