给定一个n个顶点的逆时针凸多边形的列表,给出一个O(lgn)算法来确定一个给定的点是否在多边形内。假设基本操作需要O(1)时间。
我想到了一个方向:如果一个点在一个凸多边形内部,那么这些点和所有的顶点或边之间有何特殊关系?此外,我猜想这里的技巧是凸多边形,这使得算法复杂度为lgn。
给定一个n个顶点的逆时针凸多边形的列表,给出一个O(lgn)算法来确定一个给定的点是否在多边形内。假设基本操作需要O(1)时间。
我想到了一个方向:如果一个点在一个凸多边形内部,那么这些点和所有的顶点或边之间有何特殊关系?此外,我猜想这里的技巧是凸多边形,这使得算法复杂度为lgn。
O(n)
多边形的预处理时间。之后,每个查询点都可以在预处理多边形中处理,并且处理时间为 O(lg n)
。P
(称之为“极点”),对于每个顶点从 P
出发并经过该顶点绘制射线。将其视为极坐标系,其原点位于 P
,通过这些射线将整个极面划分为扇区。现在,给定查询点,您只需要将其转换为以我们的极点 P
为原点的极坐标系即可。然后进行二进制搜索,以确定包含查询点的特定扇区。扇区内的最终内/外检查(点与边的位置测试)是一个微不足道的操作,时间复杂度为 O(1)
。每次查询都需要用于二进制搜索的 O(lg n)
时间来处理。O(n)
预处理的原因是需要提前确定极点的位置。O(lg n)
算法,无需预处理。你可能想要查看这个链接,其中包含详细信息,如何确定一个点是否在一个复杂的多边形内,包括示例(c)代码。
O(n)
算法,而不是一个O(log(n))
算法。 - Bart KiersO(n)
,它不符合要求。 - AnT stands with Russia
O(n)
。在这种情况下,整个重点是利用多边形是凸的事实提出O(lg n)
算法。 - AnT stands with RussiaO(n)
而不是O(log(n))
。 - Bart Kiers