簡體   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