Algorithm 线性规划-算法
给定平面上的两组点 解决方案:如果有一条线将Algorithm 线性规划-算法,algorithm,linear-programming,Algorithm,Linear Programming,给定平面上的两组点 解决方案:如果有一条线将P1的点与P2分隔开,则该线表示P1中的所有点都在一侧,而P2中的所有点都在另一侧,则返回“有这样的线”,否则返回“没有这样的线” 例:考虑这些点:P>P1和P2的两个凸壳分别设计一个解决方案。您可以使用上列出的算法之一。格雷厄姆扫描非常容易实现,并且具有O(nlogn)时间复杂性 然后检查这两个多边形是否重叠。为此,您可以采取以下步骤: 对于第一个凸包上的每个顶点,检查它是否完全位于第二个凸包内。这意味着检查顶点是否位于其他凸包的每个(定向)边的同一
P1
的点与P2
分隔开,则该线表示P1
中的所有点都在一侧,而P2
中的所有点都在另一侧,则返回“有这样的线”,否则返回“没有这样的线”
例:考虑这些点:P>P1和P2的两个凸壳分别设计一个解决方案。您可以使用上列出的算法之一。格雷厄姆扫描非常容易实现,并且具有O(nlogn)时间复杂性 然后检查这两个多边形是否重叠。为此,您可以采取以下步骤:
如果这些步骤都没有得出它们重叠的结论,那么它们就没有重叠。步骤1:为点集p1创建凸包。检查集合P2的任何点是否位于点P1的凸包内 步骤2:为点集p2创建凸包。检查集合P1的任何点是否位于点P2的凸包内 如果在任一步骤中,一个点位于多边形内,“没有这样的线”。否则,“就有这样一条线” 你必须完成这两个步骤。不能只为P1创建一个凸包,然后检查P2中的点是否在P1的凸包内,反之亦然。如上图中的示例所示,您不能只为红色点创建一个凸包,然后检查黄色点是否在该凸包内 凸壳的时间复杂度:O(nlogn) 参考资料:
您还可以在和上找到一些有趣的方法。这些提到了一些不使用凸包方法的方法。的确,当且仅当有一条线分隔两组点的凸包时,才有一条线分隔这两组点,但为了解决这个问题,您不需要完成生成外壳和相交多边形的所有工作 首先,检查点集在其x坐标中是否重叠,即如果min_x(P1)=min_x(p2) 如果它们在x坐标中没有重叠,那么就有一条垂直线将它们分开,这样就完成了。否则 使用单调链算法查找P1的上外壳和下外壳以及P2的上外壳和下外壳: 如果有一条线分隔P1和P2,则在重叠的x坐标区域内,P1的下壳将完全位于P2的上壳之上,反之亦然。可以通过按x坐标的顺序处理上外壳和下外壳上的点来检查这一点
该算法确实使用了用于生成凸包的单调链方法,但它避免了一般的多边形相交,并且非常容易在O(N logn)时间内实现。谢谢您的回答,先生!但是,有没有另一种不使用凸包的方法来解决这个问题?@TariqGanem:如果是这样的话,那么你应该在你的帖子中传达相应的信息,以便社区能够进行相应的思考。顺便说一句,我在回答中指出了一些不使用凸包来解决这个问题的链接。凸包有什么问题?例如,P1=[(-1,0),(1,0)],P2=[(0,-1),(0,1)]