我有大量的间隔(约5k到10k)。这些元素具有开始和结束位置,例如(203,405)。间隔的坐标存储在列表中。
我想确定每对间隔之间重叠部分的坐标和长度。可以按以下方式完成:
# a small list for clarity, with length normally around 5000s
cList = ((20, 54), (25, 48), (67, 133), (90,152), (140,211), (190,230))
for i, c1 in enumerate(cList[:-1]): # a linear pairwise combination
for c2 in cList[i + 1:]:
left = max(c1[0], c2[0])
right = min(c1[1], c2[1])
overlap = right - left
if overlap > 0:
print "left: %s, right: %s, length: %s" % (left, right, overlap)
导致:
left: 25, right: 48, length: 23
left: 90, right: 133, length: 43
left: 140, right: 152, length: 12
left: 190, right: 211, length: 21
如图所示,它可以工作...因为这可能需要相当长的时间(20秒),所以我的问题是,我该如何优化它?我尝试在第二个循环的开始位置超过第一个结束位置时切断第二个循环:
if c1[1] < c2[0]:
break
这大大缩短了流程时间,但重叠数量比以前少了约三倍,因此结果肯定是无效的。这是由于某些元素的长度比前面的元素要大得多。
我相信有一些数学技巧可以解决这个问题。
[(0, 4), (1, 5), (2, 6)]
,那么你将面对一个复杂的多重重叠模式。在这种情况下,你是否仍想要成对的重叠结果?(在这种情况下,重叠的区间本身也会发生重叠。) - user2357112[(0, 4), (2, 6), (4, 8), (6, 10)]
,你想要输出[(2, 4), (4, 6), (6, 8)]
,还是[(2, 8)]
,或者其他什么? - user2357112