【问题标题】:Can this be solved with a line sweep algorithm in O(n)?这可以用 O(n) 中的线扫描算法解决吗?
【发布时间】:2021-10-06 20:58:01
【问题描述】:

在这个问题中,我们给定平面中的 n 个水平线段,在 O(n) 时间内找到一条与所有线段相交且具有最大可能斜率的线,或者确定不存在这样的线。

我想通过求解不等式并获取所有可能的线方程,然后找到斜率最大的方程来找到所有可能的线,但是我找不到与我们在计算几何中学到的任何东西相关的解决方案 任何人都可以给我一个提示或提及任何可以帮助的计算几何相关主题

【问题讨论】:

  • 行扫描需要初步排序。忘记 O(n) 界限。

标签: geometry computational-geometry intersection segment


【解决方案1】:

不,这个问题不能通过线性时间的线扫描算法解决 - 请参阅@YvesDaoust 评论。但是,它可以通过另一种方法在线性时间内解决 - 请参见下文。

您描述n 线段与刺线之间的交叉点不等式 的意图是正确的,但是您可以更进一步,将您的问题简化为具有两个变量的线性规划 (LP) 问题和2*n 约束。

让我们用三个数字来表示i 段的参数 - xMin(i)xMax(i)y(i)。刺线将由方程y = a*x + b 描述。这条线必须与线段i 相交,因此对于每个这样的线段,我们有两个不等式,保证相交:

a*xMin(i) + b <= y(i)
a*xMax(i) + b >= y(i)

因此,您需要在上述2*n 约束下最大化斜率a,这是一个众所周知的固定维度LP 问题,有两个变量ab。根据 Nimrod Megiddo 的this paper,具有n 约束和固定(不依赖于n)变量数量的LP 问题可以在O(n) 时间内解决。

【讨论】:

    【解决方案2】:

    由于 cmets 建议的线扫描算法比 O(n) 慢,所以答案是否定的但是简单的 O(n) 方法仍然是可能的,例如像这样:

    1. 找到相交线的 BBOX

      所以您正在搜索穿过所有线(水色矩形)内部的“内接”矩形的x0,y0,x1,y1 坐标。这可以在O(n)中完成

      所以搜索所有行并得到:

      y0 = min(y)
      y1 = max(y)
      x0 = max(left_x)
      x1 = min(righ_x)
      

      其中left_x&lt;right_x 是每条线的两个x 坐标。

    2. 构建你的生产线

      如果是x0&gt;x1,则不可能有这样的行

      对于最小斜率,只需使用 BBOX 的对角线之一:

      Line(x0,y0,x1,y1)
      Line(x0,y1,x1,y0)
      

      这取决于您的坐标系(点甚至可能颠倒)...

      最大斜率是垂直线,因此您可以在 &lt;x0,x1&gt; 区间内使用任何 x,例如

      Line(x0,y0,x0,y1)   
      

    【讨论】:

    • 这种方法不会涵盖所有可能的情况 - 矩形边界框可能不存在,但可能存在斜率
    • @HEKTO hmm 好点 +1 ... 对于非矩形 BBOX 情况,应搜索最小和最大坡度 (atan2) 而不是最小和最大 x ad 一旦它们相互交叉处理为非可解决的......但是这很可能比O(n)慢(因为也需要起点范围),除非使用了我现在看不到的一些讨厌的技巧......
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2016-01-27
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2017-03-10
    相关资源
    最近更新 更多