我有n
个元素,每个元素都有两个无符号的int属性x
和y
。
现在我想找出符合以下条件的所有群体:
A.x >= B.y
和B.x >= A.y
。
这些群组可以是多个2
,3
,...,n
。例如,A
,B
,C
可以相互满足此要求,因此形成一组3
。
两个或多个组中的元素可以重叠。
如何有效地找到它们?
这是我工作中出现的现实问题,而不是编码/算法挑战。
答案 0 :(得分:1)
您正在图表中搜索<strong> cliques 。节点是元素,如果它们满足兼容性条件,则在两个节点之间绘制边缘。
生成派系相当简单,并且有一些库可以帮助您这样做。然而,在一般图中找到最大团的问题是NP难的,因此一般来说没有有效的算法。
另一方面,在您的情况下,似乎有更多的结构可以帮助。如果我理解正确,在你的情况下,所有的x变量必须大于所有的y变量(一个可能的例外;见下文),所以你可以生成派系选取一些数字c并包括满足x> = c和y <= c。
的所有元素我相信在这种情况下你可以通过让参数c从x和y的最小值变化到最大值来搜索最大甚至最大的派系,并且对于每个c计数这个数字满足条件x> = c,y <= c的元素的数量。计数函数将是一个阶跃函数,当c =某个x或y时,它会增加或减少一个。
很容易证明该方法会产生派系。通过更多的工作,我们可以看到如何快速生成所有派系。首先,让我为一个元素定义逆行的概念。如果A.y>,则元素A逆行。斧头。命题:一个集团最多只能有一个逆行元素。证明:如果B也在集团中,那么B.x&gt; = A.y&gt; A.x> = B.y,因此B不逆行。此外,如果一个集团包含一个逆行元素,那么集团的每个其他元素满足Bx> = c和c> = By,对于某些c(即c = Ax,或c = Ay,或者某些c之间)。 / p>
另一方面,如果一个集团不包含逆行元素,那么集团的每个元素都满足Ax&gt; = Ay和Ax&gt; = By,所以所有的y都以min为界。 X;类似地,所有x都以max y为界。所以在这种情况下你可以选择c = min x或max y。
换句话说,每个集团都是以下集团之一的子集:每个元素的集合A满足A.x> = c和c> = A.y对于某些固定的c;或者具有一个逆行元素R的集团,其中所有其他元素都满足A.x> = R.y和R.x> = A.y.这应该给出O(n)和O(n ^ 2)时间之间的所有最大集团;然后,您可以从最大集团的集合中选择最大集团。
答案 1 :(得分:0)
按x和y +对数据进行排序,然后设置交叉点。
这使问题变得更加容易。不要试图把幻想理论模型(集团,聚类等)放在上面,但要在视觉上勾画出你想要的东西。