一尘不染

寻找与多边形相交的光线尽可能多

algorithm

这是一个有趣的练习:

令P是简单但不一定是凸的多边形,q是不一定在P中的任意点。

设计一种有效的算法,以查找与q的最大边数相交的,源自q的线段。

换句话说,如果站在q点,您应该朝哪个方向瞄准枪支,这样子弹才能穿过最多的墙壁?

通过P顶点的子弹仅能赢得一堵墙的功劳。

O(n log n)算法是可能的。n是顶点或边的数量,因为它是多边形,所以边的数量大致等于顶点的数量。

这是我的想法:

首先将q与P中的所有顶点连接(假设有N个顶点)。将有N条线或N-1对线。

最终射击线必须在这两对之间。因此,我们必须找到包含最大数量边的线对。

我不认为此解决方案是O(n log n)。

有任何想法吗?


阅读 263

收藏
2020-07-28

共1个答案

一尘不染

好吧,首先将点坐标转换为以P为中心的极坐标系。

  • 在不失一般性的前提下,让我们针对角度坐标选择特殊的顺时针方向。
  • 现在,让我们沿着多边形的所有边缘依次进行圆形行走,并注意这些边缘的起点和终点,其中,行走使我们相对于P沿顺时针方向运动。
  • 让我们将此边缘的终点称为“对接”,并将起点称为“头部”。所有这些都应在O(n)中完成。现在,我们必须对这些首尾进行排序,因此使用quicksort可能是O(nlog(n))。我们从最小的φ开始按它们的角度(φ)坐标对它们进行排序,确保在φ坐标相等的情况下,头部被认为小于对接(这对于解决问题的最后规则很重要)。
  • 一旦完成,我们将开始从最小的φ开始移动,每当遇到对接时就递增运行总和,并在遇到头部时递减,注意全局最大值,这将是φ坐标上的间隔。这也应该在O(n)中完成,因此总体复杂度为O(nlog(n))

现在,您能告诉我为什么要问这种问题吗?

2020-07-28