【问题标题】:overlapping segments重叠段
【发布时间】:2010-08-23 18:55:28
【问题描述】:

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

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

但我不知道如何有效地比较大量细分列表中的每一对。任何帮助将不胜感激!

【问题讨论】:

  • 范围是否有最大尺寸?
  • 你怎么知道正确的输出不应该是[ (1,4), (18,45) ]?
  • @Aren 不,这不是家庭作业,我正在尝试识别人类基因组中的重叠基因,这些统计和停止坐标是基因的实际坐标。 @gnibbler,是的,有一个最大值:400。
  • 正确答案是 [],因为每个片段都至少与其他片段重叠
  • @recursive,我为每个段分配了一个分值,我总是会选择得分较高的那个。

标签: python algorithm list comparison


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 2020-11-23
      • 2014-03-05
      • 2020-10-18
      • 1970-01-01
      • 2021-04-13
      • 2013-04-02
      相关资源
      最近更新 更多