我想生成一些用于处理不同类型间隔的样本数据,并希望确保表示所有可能的间隔关系。
就我的目的而言,{满足,重叠,结束于}是等效的,等于可以忽略,{ B以A开头,A包含B }也是等效的。我还将假设所有间隔都经过排序和标记,以使A在B之前开始,在C之前开始,等等。所以我本质上对三种情况感兴趣:
引入第三个间隔会产生更多情况:
尽管对于在B之前的A而言,它也总是在C之前,但对于其他变体,情况并非如此,在这些变体中,我们还需要考虑A和C的关系:
在给定的时间间隔内,可能有多少种不同的关系组合?
将生成这些组合的算法是什么?
例如,该算法可能会产生以下输出来解决两个间隔的情况:
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
答案 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