生成区间关系组合的算法

时间:2019-05-20 08:42:04

标签: algorithm combinations

我想生成一些用于处理不同类型间隔的样本数据,并希望确保表示所有可能的间隔关系。

Overview of different relationships between intervals

就我的目的而言,{满足,重叠,结束于}是等效的,等于可以忽略,{ B以A开头,A包含B }也是等效的。我还将假设所有间隔都经过排序和标记,以使A在B之前开始,在C之前开始,等等。所以我本质上对三种情况感兴趣:

  • A在B之前(例如A = [1,2],B = [3,4])
  • A包含B(例如A = [1,4],B = [2,3])
  • A与B重叠(例如A = [1,3],B = [2,4])

引入第三个间隔会产生更多情况:

  • A在B之前,B在C之前(例如A = [1,2],B = [3,4],C = [5,6])
  • A在B之前,B包含C(例如A = [1,2],B = [3,6],C = [4,5])
  • A在B之前,B与C重叠(例如A = [1,2],B = [3,5],C = [4,6])
  • ...

尽管对于在B之前的A而言,它也总是在C之前,但对于其他变体,情况并非如此,在这些变体中,我们还需要考虑A和C的关系:

  • A包含B,B重叠C,A重叠C(例如A = [1,5],B = [2,4],C = [3,6])
  • A包含B,B重叠C,A包含C(例如A = [1,6],B = [2,4],C = [3,5])

在给定的时间间隔内,可能有多少种不同的关系组合?

将生成这些组合的算法是什么?

例如,该算法可能会产生以下输出来解决两个间隔的情况:

combination, interval name, start, end
1, A, 1, 2
1, B, 3, 4
2, A, 1, 4
2, B, 2, 3
3, A, 1, 3
3, B, 2, 4

图片来源:Höppner, Frank & Topp, Alexander. (2007). Classification Based on the Trace of Variables over Time. 739-749. 10.1007/978-3-540-77226-2_74.


编辑:根据MBo的答案,为解决方案添加了四个间隔的可视化视图。 enter image description here

1 个答案:

答案 0 :(得分:2)

有(2 * n-1)个!! (double factorial为奇数)组合n个间隔,序列为1,3,15,105,945...

快速制作的Python实现可显示结果。在每个阶段,我们都可以开始新的间隔(比以前的间隔大1)或结束任何打开的间隔

t = 0
def genintervals(n, level, opstart, opened, s):
    if level == 2 * n:
        print(s)
        global t
        t += 1
        return
    if opstart < n:
        genintervals(n, level + 1, opstart + 1, opened + [opstart], s + 's' + str(opstart) + " ")
    for i in range(len(opened)):
        genintervals(n, level + 1, opstart, opened[0:i] + opened[i+1:], s + 'e' + str(opened[i]) + " ")

s0 s1 s2 e0 e1 e2 
s0 s1 s2 e0 e2 e1 
s0 s1 s2 e1 e0 e2 
s0 s1 s2 e1 e2 e0 
s0 s1 s2 e2 e0 e1 
s0 s1 s2 e2 e1 e0  //A covers B and C, B covers C
s0 s1 e0 s2 e1 e2 
s0 s1 e0 s2 e2 e1  //start A, start B, finish A, start C, finish C, finish B
s0 s1 e0 e1 s2 e2 
s0 s1 e1 s2 e0 e2 
s0 s1 e1 s2 e2 e0 
s0 s1 e1 e0 s2 e2 
s0 e0 s1 s2 e1 e2 
s0 e0 s1 s2 e2 e1 
s0 e0 s1 e1 s2 e2
15