【问题标题】:Find the maximum number of lines intersecting [closed]找到相交的最大线数[关闭]
【发布时间】:2015-05-28 02:20:04
【问题描述】:

给定 n 条线 (x1,x2) ,其中 x1 是起点,x2 是平行于 x 轴的线的终点。我们需要绘制一条垂直于 X 轴的线,使其与最大数量的线(平行于 X 轴)相交。如何找到相交线的坐标和最大交点数。

谁能提供一些解决这个问题的提示?

【问题讨论】:

  • 如果它们都是线,那么任何垂直于X轴的线都会与所有这些线相交。
  • 我想不出在任何情况下都能帮助解决问题的算法。考虑所有线都非常短(接近点)并且间隔均匀的极端情况。算法如何帮助找到答案?
  • @PhamTrung 这些线不一定覆盖 x 轴的整个长度,否则问题将变得微不足道且毫无意义。
  • @TimBiegeleisen 是的,这个问题只有segments才有意义,而不是线,如果是线段,我们可以使用扫描线算法来解决这个问题。
  • 此问题与this question重复

标签: algorithm data-structures dynamic-programming


【解决方案1】:

除非线条是拉伸的(长度有限 - 我希望这是正确的术语),否则任何垂直于 X 轴的线条都将满足要求。假设它们是拉伸:

define line: int x_l , int x_r //representation of a line (y-coordinates aren't necessary)

define mostLinesX:
    input: list coords
    output: xOpt

    Map<Integer , Integer> growthMap

    for line l in coords
        put(growthMap , l.x_l , 1)
        put(growthMap , l.x_r , -1)

    int maxX = -1
    int max = 0
    int curCt = 0
    for int i in sorted(growthMap.keys)
        curCt += get(growthMap , i)

        if curCt > max
            maxX = i
            max = curCt

     return maxX

基本思想非常简单:定义一个函数f(x),它显示将与x 处的垂直线相交的行数。此函数的结果将是在x 之前开始的所有行数减去在x 之前结束的所有行数。现在算法所要做的就是找到f(x) 的峰值。 x 将始终是可能的最小值,这样就找不到匹配条件的更大的x

注意:行尾是唯一的。因此,如果我们有一行 (a , b)b 本身就不是该行的一部分 - 或者换句话说:(a , a + 1) 的长度为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多