有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是啥

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】:

所以扫线算法是你基本上需要知道的,为了解决这个问题。

【讨论】:

以上是关于有多少条线段将在一个平面上与一条水平线相交?找到这个的最有效方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

POJ1410线段相交快速排斥实验跨立实验

1264 线段相交

线段树维护二维平面中的线段

1264 线段相交

平面分割类问题总结

判断2个线段是否相交