一尘不染

查找范围的最大相交子集

algorithm

如果您有一组范围,例如下面的简单示例…

[
    [12, 25], #1
    [14, 27], #2
    [15, 22], #3
    [17, 21], #4
    [20, 65], #5
    [62, 70], #6
    [64, 80]  #7
]

…如何计算 最大相交的子集 (不确定如何表达,但我的意思是“相交并具有最高基数的范围的子集”)并确定相交程度(该子集中范围的基数) )?

从逻辑上讲,我可以解决这个问题,并且可以将其转换为简单的算法。在列表下方,我们看到1-5相交,而5-7相交,#5相交。

我想要的结果只是子集,因为这给了我关于基数的信息,而且只要它们全部相交,我就可以轻松地计算出集合的交集。在上面的示例中,它将为[[14, 27],[15, 22],[12, 25],[17, 21],[20, 65]]

我可能会尝试将每个范围转换为一个图形节点,将相交的部分连接起来,然后找到最大的全连接图。

我还反复考虑要从头开始,继续建立相交范围的列表,并在每个相交范围上运行一个相交的区域以进​​行检查-
直到您找到一个不相交的元素,然后开始一个新列表。继续对照现有交叉口检查每个项目。但是我不确定这是否完成。

我可以尝试实现某些东西(语言是ruby FWIW),但是我很想听听其他人如何解决这个问题,以及最有效,最优雅的方法是什么。

更新:

我认为这是最大派系问题的一个具体案例,这是NP难题,因此实际上很困难。对于近似值/实际使用的建议将不胜感激!

另请参阅:http :
//en.wikipedia.org/wiki/Maximum_clique
/ 查找图中的所有完整子图

更新2

在此找到了有关此问题的NP硬度和NP完整性的很好证明: http :
//www.cs.bris.ac.uk/~popa/ipl.pdf

看起来这是行的结尾。抱歉!我将使用足够好的贪婪近似进行工作。谢谢。

如答案中所述,我认为该论文没有描述这个问题……我们可能会根据范围在此处提供更多信息。


阅读 567

收藏
2020-07-28

共1个答案

一尘不染

如果我对问题的理解正确,那么这并不是您所链接论文中描述的NP问题的一个实例。这是我对问题的理解以及多项式时间解。

  1. 我们给定了一组实数范围,例如n:[A1,B1],[A2,B2],…,[An,Bn],其中Ai <= Bi。

  2. 创建起点和终点的排序列表,并按数字顺序排列,以指示该点是起点还是终点。

在您的示例中,该值为:12 +,14 +,15 +,17 +,20 +,21-,22-,25-,27-,62 +,64 +,65-,70-,80-

  1. 将curOverlap和maxOverlap初始化为零。

  2. 遍历列表,为每个+增加curOverlap,为每个-减少。在每个增量上设置maxOverlap = max(curOverlap,maxOverlap)。

要继续例如:
缬氨酸,CUR,最大
12,1,1
14,2,2
15,3,3
17,4,4
20,5,5
21,4,5
22,3,5
25,2,5
27,1,5
62,2,5
64,3,5
65,2,5
70,1,5
80,0,5

最大重叠值为5。如果您想知道最大重叠发生在何处,也可以存储与最大关联的val。在此示例中,这将为您提供20。然后遍历初始范围并找到包含20个范围的5个范围很简单。

-edit-如果您有重复的值,请在每个值的负号之前对正号进行计数,以便包括在单个点处重叠的范围。

2020-07-28