有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是啥
Posted
技术标签:
【中文标题】有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是啥【英文标题】:how many line segments will intersect in a plane will intersect with a horizontal line ? what will be the most effective way to find this有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是什么 【发布时间】:2020-03-11 09:30:51 【问题描述】:我正在尝试解决this Cyberchef challenge:
在平面上给你 N 个点(编号为 1 到 N);对于每个有效的 i,第 i 个点是 Pi=(i,Ai)。它们之间有 N-1 条线段(编号为 1 到 N-1);对于每个有效的 i,第 i 条线段由点 Pi 和 Pi+1 连接而成。
给你 Q 个水平线段。每个查询水平线段由两个点表示,从点 (x1,y) 到点 (x2,y)(它停止并且不再传播)。对于每个水平线段,您必须从它在途中碰撞的那些(N-1 条线段)中找到线段的数量。
所以这就是问题所在:
2 1谁能教我在时间复杂度方面哪种方法最好、最有效?
【问题讨论】:
【参考方案1】:所以你有唯一的折线并且想要检查许多查询是否与水平线段相交。
在该折线上构建某种二进制空间分区(BSP) 是值得的。在这种情况下,您可以在 O(log(n))
时间检查交叉点,因此总时间是 O(nlogn)+O(qlogn)
(构建和检查)
如果你的折线幸运的是 凸 多边形(没有一个闭合边),事情就非常简单 - 只需按 Y 坐标对边进行排序并只检查那些相交的查询 Y(二分搜索,log(n )每个查询)。在一般情况下(非凸),您的折线可能看起来像 WMWMWMW
,您必须检查太多边。
【讨论】:
抱歉,我不知道 hwat 是折线还是 BSP,我在哪里可以更详细地了解您的方法? Emm...谷歌和计算几何书籍? 折线是常用术语。二进制空间分区 - 各种不同的数据结构。【参考方案2】:我使用 k-d 树来解决这个问题。也不要提出持续挑战的问题。
【讨论】:
【参考方案3】:所以扫线算法是你基本上需要知道的,为了解决这个问题。
【讨论】:
以上是关于有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是啥的主要内容,如果未能解决你的问题,请参考以下文章