【问题标题】:Intersection ranges (algorithm)交点范围(算法)
【发布时间】:2013-12-08 18:30:08
【问题描述】:

例如,我有下一个数组:

[100,192]
[235,280]
[129,267]

作为相交数组,我们得到:

[129,192]
[235,267]

对人们来说简单的练习,但创建找到第二个多维数组的算法的问题......

任何语言,任何想法..

如果有人不理解我:

【问题讨论】:

  • 你忘了java标签..

标签: algorithm multidimensional-array


【解决方案1】:

我假设您希望输出具有 2 个或更多重叠间隔的任何范围。
因此[1,5][2,4][3,3] 的输出将(仅)为[2,4]

这里的基本思想是使用sweep-line algorithm

将范围分为起点和终点。

对点进行排序。

现在使用初始化为 0 的计数器变量遍历这些点。

如果你得到一个起点:

  • 增加计数器。
  • 如果计数器的值现在为 2,则将该点记录为输出中某个范围的起点。

如果你得到一个端点

  • 减少计数器。
  • 如果计数器的值为 1,则将该点记录为输出中某个范围的端点。

注意:

如果起点和终点的值相同,如果计数器为 1,则需要先处理终点,如果计数器为 2 或更大,则需要先处理起点,否则' 会以 0 大小范围或输出中两个范围之间的 0 大小间隙结束。

这应该是相当简单的,只要有一组以下结构:

Element
  int startCount
  int endCount
  int value

然后将具有相同值的所有点组合成一个这样的元素,并适当地设置计数。

运行时间:

O(n log n)

示例:

输入:

[100, 192]
[235, 280]
[129, 267]

S 开始,E 结束)

Points |   |  100  |  129  |  192  |  235  |  267  |  280  |
Type   |   | Start | Start |  End  | Start |  End  |  End  |
Count  | 0 |   1   |   2   |   1   |   2   |   1   |   0   |
Output |   |       | [129, |  192] | [235, |  267] |       |

【讨论】:

  • @dfb 初始排序需要 O(n log n)(假设这是必需的),但其余的是线性的。
【解决方案2】:

这是交叉算法的python实现。它的计算计算复杂度O(n^2)。

a = [[100,192],[235,280],[129,267]]

def get_intersections(diapasons):
    intersections = []
    for d in diapasons:
        for check in diapasons:
            if d == check:
                continue
            if d[0] >= check[0] and d[0] <= check[1]:
                right = d[1]
                if check[1] < d[1]:
                    right = check[1]
                intersections.append([d[0], right])
    return intersections

print get_intersections(a)

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2017-12-09
    • 2010-09-18
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多