1. 程式人生 > >P、NP、NPC問題詳解

P、NP、NPC問題詳解

轉載地址

https://blog.csdn.net/bcb5202/article/details/51202589

P、NP、NPC


概念

> P問題:能夠在多項式時間內解決的決策問題。

—舉例: 圖搜尋問題、最短路徑問題、最小生成樹問題······


> NP問題:不能在多項式時間內解決或不確定能不能在多項式時間內解決,但能在多項式時間驗證的問題。

—驗證:給定一個問題的例項、證書(類似於證據),需要驗證這個證書是這個問題的正確答案。

— 舉例:漢密爾頓路徑,例項為G=(V,E),證書為頂點序列 {v0,v1,v2,v3,….,vk},我們的目的是要驗證這個證書就是這個問題的答案,驗證方法為:先遍歷一遍這個點序列,看看是不是每個點只出現一次,然後對於(vi,vi+1)是否為G的邊,這樣就能夠驗證這個點序列是不是漢密爾頓路徑,很顯然這個驗證過程是多項式時間的,所以漢密爾頓路徑是NP問題。


> NPC問題:目前不能用多項式時間解決的問題,但是我們還不能證明這個問題不能用多項式時間解決,我們這次的目標是研究這個問題。

—滿足的兩個條件:是一個NP問題 + 所有的NP問題可以在多項式時間內規約到它

—舉例:3SAT、頂點覆蓋、團、三維匹配、漢密爾頓迴路、劃分問題·······


> NP難問題:所有的NP問題可以在多項式時間歸約到它,但它不一定是一個NP問題


> 歸約(約化)的標準概念: 如果能找到這樣一個變化法則,對程式A的任意一個輸入,都能按這個法則變換成程式B的輸入,使這兩個程式的輸出相同,那麼我們說,問題A可歸約為問題B

— 問題A可以約化到問題B的含義是,可以用解決B的解法來解決A,或者說A可以“變成”B。

—A可歸約為B的直觀含義:B的時間複雜度>=A的時間複雜度。也即,A比B簡單。


關係

P、NP、NPC、NP Hard問題的關係如下:
P、NP、NPC、NP困難問題關係


證明NPC問題

證明問題B是NPC問題的過程如下:

  1. 證明B是NP問題
  2. 知道一個已知的NPC問題A
  3. 證明A歸約到B。

常見歸約問題

基本知識

1、獨立集 —— 在圖G = (VE)中,如果頂點集合S⊆V中的任意兩點之間都沒有邊,則稱S是獨立的。
—難點: 尋找最大獨立集。
—目標: 裝入儘可能多的頂點,要求邊涉及到的邊服從一些限制條件。


2、頂點覆蓋 —— 給定圖G = (VE),頂點集合S⊆V,如果圖中的每一條邊至少有一個端點在S中,則稱S是一個頂點覆蓋。
—難點: 尋找最小頂點覆蓋。
—目標: 用盡可能少的頂點覆蓋圖中的所有邊。


3、集合覆蓋 —— 試圖用一組較小的集合覆蓋一個任意的物件集合。


常見問題

1、獨立集問題——給定圖G和數k,問是否包含大小至少為k的獨立集?


2、頂點覆蓋問題——給定圖G和數k,問G是否包含大小至多為k的頂點覆蓋?


3、集合覆蓋問題——給定n個元素的集合U,U的子集S1,···,Sm以及數k,問在這些子集中有一組子集,它們的並等於整個U且至多包含k個子集嗎?


4、集合包裝問題——給定n個元素的集合U,U的子集S1,····,Sm以及數k,問在這些子集中至少有k個兩兩不相交嗎?


5、SAT(可滿足性問題)——給定bool變數集X={x1,···,xn}上的一組子句C1,···,Ck,問存在滿足的真值賦值嗎?
注意:每個子句均為析取子句(邏輯或∨),最終結果為各個子句的合取(邏輯與∧)。


6、3-SAT(三元可滿足性問題)——給定bool變數集X={x1,···,xn}上的一組子句C1,···,Ck,每個子句的長為3,問存在滿足的真值賦值嗎?
注意:同上。


常用引理

設G=(V, E)是一個圖,S⊆V,那麼S是一個獨立集當且僅當它的補V-S是一個頂點覆蓋。
證明:首先,設S是一個獨立集。考慮任一邊e=(u,v),因為S是獨立集,u和v不可能同時在S中,所以u和v至少有一個在V-S中,即得任一邊至少有一個端點在V-S中,所以V-S是一個頂點覆蓋。
反過來,設V-S是一個頂點覆蓋,考慮S中的任意兩個頂點u、v,若它們間有一條邊e,那麼e的兩個端點均不在V-S中,這與假設V-S是一個頂點覆蓋矛盾。所以S中的任意兩點均無連線,所以S是一個獨立集。


常見歸約問題

歸約的一般思想(要點):證明Y到X的歸約,要用問題X中的分量構造“零件”來描寫在問題Y中正在做的事

1、 獨立集歸約到頂點覆蓋
證明:若有一個解頂點覆蓋的黑盒子,那麼通過問黑盒子G是否有大小至多為n-k的頂點覆蓋,就能確定G是否有大小至少為k的獨立集。


2、頂點覆蓋歸約到獨立集
證明:若有一個可以解獨立集的黑盒子,那麼通過問黑盒子G是否有大小至少為n-k的獨立集,就能確定G是否有大小至多為k的頂點覆蓋。


3、頂點覆蓋歸約到集合覆蓋
證明:若有一個可以解集合覆蓋的黑盒子,考慮頂點覆蓋的任一例項,給定圖G=(V, E)和數k。
構造集合覆蓋的一個例項,其基集U等於邊E,對圖G的每一個頂點i∈V,設Si⊆U為G中所有和點i相關聯的邊,把Si加入集合覆蓋的例項中。
U能被集合S1,S2,···,Sn中的至多k個覆蓋當且僅當G有大小至多為k的頂點覆蓋。於是,給定頂點覆蓋的例項,如上述的那樣構造集合覆蓋的例項,並把它輸入黑盒子。回答yes當且僅當黑盒子回答yes。


4、獨立集歸約到集合包裝
證明:若有一個解集合包裝的黑盒子,考慮獨立集的任一例項,給定圖G=(V,E)和數k。
構造集合包裝的一個例項,其基集U等於邊E,對圖G的每一個頂點i∈V,設Si⊆U為G中所有不和點i相關聯的邊,把Si加入集合包裝的例項中。
U的子集S1,S2,···,Sn(實際是n個邊集合)中至少k個兩兩不相交(即不存在相同邊)當且僅當G有大小至少為k的獨立集(此時k個頂點必不存在相連邊),於是,給定獨立集的例項,如上述的那樣構造集合包裝的例項,並把它輸入黑盒子。回答yes當且僅當黑盒子回答yes。


5、3-SAT歸約到獨立集
證明:設有一個解獨立集的黑盒子,要解3-SAT的例項,例項由變數集X={x1,····,xn}和子句C1,····,Ck組成。
考慮3-SAT的方法是:必須從每一個子句中選擇一個項,然後找一組真值賦值使得所有找出來的項都為1,從而滿足所有的子句。因此,如果如果沒有兩個被選中的項衝突,那麼就成功了。
具體歸約:用獨立集描述3-SAT例項。首先,構造圖G=(V,E),它由分成k個三角形的3k個頂點組成,如下圖所示。對每一個子句i,構造3個頂點vi1,vi2,vi3。依據3-SAT例項子句在圖中增加邊描述衝突:在每一對標號對應衝突的項的頂點間新增一條邊。
這裡寫圖片描述
要證明原來的3-SAT是可滿足的當且僅當構造出來的圖G(依據3-SAT的例項子句構造)有大小至少為k的獨立集。
>首先,若3-SAT是可滿足的,那麼構造出來的圖G中的每個三角形至少包含一個標號的值為1的頂點。設S是每一個三角形中的一個這樣的頂點組成的集合。設S不是一個獨立集,則至少存在兩個頂點u、v∈S間有一條邊,則u、v一定是衝突(一個是1,另一個必是0)的,而S中的每個點值都為1,所以矛盾,所以假設不成立,即S是一個獨立集。
>反過來,設圖G有一個大小至少為k的獨立集S。那麼,當S的大小恰好為k,那麼一定是由每個三角形的一個頂點組成,且S中的衝突頂點最多隻能成單出現。所以顯然可以設S中所有頂點對應的值全為1,且這些頂點每個對應於一個子句中選擇的代表,所以此時對應的3-SAT例項存在真值賦值。