重叠的部分

时间:2010-08-23 18:55:28

标签: python algorithm list comparison

我有一个巨大的两元素元组列表,它们是段的坐标(开始,结束)。以这种方式在下面的列表中

list = [ (1,4), (2, 3), (10, 20), (18, 45) ] 

有4个段的开始和结束本地化。我想删除重叠的段。我希望有一个这样的列表:

list = [ (1,4), (10,20) ]. 

我已经编写了一个函数,它将一对段作为输入,如果它们的坐标重叠则返回1:

def test_overlap(s1,e1,s2,e2):
    if (s1 <= e2 and e1 >= s2) or (e1 >= s2 and s1 <= e2):
        return 1
    if (s1 <= s2 and e1 >= e2) or (s1 >= s2 and e1 <= e2):
        return 1

但我不知道如何在一个巨大的细分列表中有效地比较每一对。任何帮助将受到高度赞赏!

2 个答案:

答案 0 :(得分:5)

有一个为此目的而设计的数据结构(有效识别区间重叠),它被称为interval tree

答案 1 :(得分:3)

首先,对列表进行排序(用于比较首次使用起点结束然后结束点)。然后浏览列表并删除与列表中前一个元素重叠的所有元组。排序是O(nlog(n)),O(n)遍历列表。

希望它有所帮助。