繁体   English   中英

查找图的一个没有交叉边界的分区

[英]Finding a partition of a graph with no edges crossing partition

我有一个图,保证可以将其划分为两个相等大小的分区(一侧可能比另一侧大1),并且该分区上没有边。 我最初以为这是NP难题,但我怀疑可能不是。 有什么(有效的)方法可以解决这个问题?

通过将两种众所周知的算法结合在一起,可以在时间O(n 2 )内解决您的问题。

当我第一次看到您的问题时,我最初以为它会与诸如在图形中找到最大最小切割之类的事情有关。 但是,由于您正在专门寻找一种将节点分为两组的方法,因此在这些组之间完全没有边,因此,我认为您所寻找的更接近于找到图的连接组件 毕竟,如果将图形分解为已连接的组件,则这些组件之间将不会有任何边。 因此,问题归结为以下几点:

  1. 找到图中所有连接的组件,并记下每个组件中有多少个节点。

  2. 将两个连接的组件划分为两组,大小大致相等-特别是,一侧的组的大小最多应比另一侧的组大。

步骤(1)是您可以使用广度优先或深度优先的搜索来识别所有连接的组件的步骤。 这将花费您时间O(m + n),其中m是边的数量,n是节点的数量。

最初,步骤(2)似乎很困难。 这使人想起了分区问题 NP-hard。 分区问题的工作方式是这样的:给您输入一个数字列表,您想确定是否将这些数字分为两组,它们的总数彼此相等。 (可以解决此问题,以便您可以容忍一个正负的拆分,而无需更改复杂性)。 该问题恰好是NP完全问题,这表明您的问题可能很难解决。

但是,有一点细微差别实际上使分区问题的表观NP硬度不是问题。 在给定的数字以二进制形式写出的情况下,分区问题很难解决。 另一方面,如果数字以一元形式写出,则分区问题具有多项式时间解。 更具体地说,存在一种用于分区问题的算法,该算法在时间O(kU)内运行,其中k是数字的数量,U是所有这些数字的总和。 对于您正在描述的问题,您知道图形中连接的组件的大小总和必须为n,即图形中的节点数,并且您知道连接的组件数也为上限由n界定。 这意味着O(kU)的运行时间(插入k = O(n)和U = O(n))可以算出O(n 2 ),可以在多项式时间内完成。

(另一种看待方式-有一个用于分区问题的伪多项式时间算法 ,但是由于在您的情况下,最大可能的总和受输入大小中实际多项式的限制,因此总体运行时间为多项式。)

我上面提到的算法是一种标准的动态编程练习。 您选择了一些数字顺序(不一定按排序顺序),然​​后填写2D表,其中每个条目都对应于以下问题的答案:“是否有前i个数字的子集加起来等于j?” 如果您对这种算法不熟悉,我将由您自己来解决细节,因为要解决这个问题确实很漂亮,因为它有一个相当简单而优雅的解决方案。

总体而言,此算法将在时间O(n 2 )上运行,因为您需要执行O(m + n)= O(n 2 )来查找连接的组件,然后是时间O(n 2 )来运行分区问题。 DP确定拆分是否存在。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM