查找具有非重叠区域的所有组合

时间:2018-11-06 16:34:04

标签: algorithm intervals interval-tree

在超区域S中,有k个小子区域。数字k最多可以为200。子区域之间可能有重叠。我有数百万个地区S。

对于每个超级区域,我的目标是找出其中有2个或更多不重叠子区域的所有组合。

这里是一个示例:

超级区域:1-100

子区域:1-8、2-13、9-18、15-30、20-35

目标:

组合1:1-8、9-18

组合2:1-8、20-35

组合3:1-8、9-18、20-35

组合4:1-8、15-30

...

1 个答案:

答案 0 :(得分:0)

子集的数量可能是指数的(最大值2 ^ k),因此以递归方式遍历所有可能的独立子集没有任何错误。我已经对下一个可能的时间间隔进行了线性搜索,但是值得利用二进制搜索。

def nonovl(l, idx, right, ll):
    if idx == len(l):
        if ll:
            print(ll)
        return

    #find next non-overlapping interval without using l[idx]
    next = idx + 1  
    while next < len(l) and right >= l[next][0]:
        next += 1
    nonovl(l, next, right, ll)

    #find next non-overlapping interval after using l[idx]
    next = idx + 1
    right = l[idx][1]
    while next < len(l) and right >= l[next][0]:
        next += 1
    nonovl(l, next, right, ll + str(l[idx]))

l=[(1,8),(2,13),(9,18),(15,30),(20,35)]
l.sort()
nonovl(l, 0, -1, "")

(20, 35)
(15, 30)
(9, 18)
(9, 18)(20, 35)
(2, 13)
(2, 13)(20, 35)
(2, 13)(15, 30)
(1, 8)
(1, 8)(20, 35)
(1, 8)(15, 30)
(1, 8)(9, 18)
(1, 8)(9, 18)(20, 35)