演算法:NP問題,NP完全問題(NPC),NPhard問題
在做計算機演算法關於NP完全問題這一章的作業的時候,發現有很多概念理解的不是很透徹,然後就反覆看老師的講義,在網上查閱各種資料,花了很多時間來弄懂這塊的內容。發現書上的概念太正式,定義太標準,不容易很快理解,而網上的資料有些地方論述的不夠全面,像我這樣的新手在遇到NP家族的概念和問題的時候就很容易懵逼…因此在此將我的心得與整理的資料放在這裡,一方面供我以後自己參考,避免又搞混,一方面和大家進行交流。
一、概念介紹
下面就對這些令人頭疼的概念做個簡單的介紹和對比:
1. P類問題
這類問題是最簡單的一類問題,即所有這類問題都可以用一個確定性演算法在多項式時間內求出解。此類問題的複雜度是此類問題的一個例項的規模n的多項式函式。比如排序問題,求最短路徑問題等。
2. NP(Non-deterministic Polynomial,即多項式複雜程度的非確定性問題)問題
有些問題很難找到多項式時間的解法(也許根本就不存在),但是如果給出了該問題的一個解,我們可以在多項式時間內判斷這個解是否正確,比如對於哈密爾頓迴路問題,如果給出一個任意的迴路,我們可以很容易的判斷出該回路是否是哈密爾頓迴路(看是不是所有頂點都在迴路中)。
P類問題是NP問題的子集,原因是P類問題既然能在多項式時間內求解,也必然能在多項式時間在驗證它的解,滿足NP類問題的定義。
3. NP完全問題(NPC)
如果所有NP問題都能在多項式時間內轉化為A,則稱A為NPC問題。
NPC是NP的子集。
4. NP-hard問題(NPH,NP困難問題)
問題A不一定是一個NP問題,但所有的NPC問題都可以在多項式時間內轉化為A,則稱A為NPH問題。
二、其他知識
1. NPC問題一定是NP困難問題
根據NP完全問題和NP困難問題的定義可以發現,NP完全問題A的定義中,除了要求對於所有別的判定問題A’ ∈NP,都有A’ ∝A,還要求A∈NP,而NP困難問題不一定是NP問題,所以可以看出NP完全問題是NP困難問題的子集,所以NP完全問題一定都是NP困難問題。
2.NP困難問題中包含的一些問題是既不屬於NP也不屬於P類問題的,一個典型的例子就是第k個最重子集問題。
3.證明一個新問題A是NPC問題的方法:
a.證明A∈NP;
b.選取一個已知的NPC問題B;
c.構造一個從B到A的變換f;
d.證明f為一個多項式變換。
這裡一個關鍵的問題是如何選取參照物B和構造多項式變換f。在實際的證明中參照物的選擇帶有一定的經驗性,已知的NPC問題越多越有利。第一個被證明的NPC問題是sat問題(可滿足性問題),這個開創性的工作是由COOK完成的,自從他證明了sat問題是NPC問題以來,人們已經發現並證明了數千個NPC問題,如0/1揹包問題和哈密爾頓迴路問題等。
4.幾個典型的NPC問題
三維匹配問題(3 dimensional matching,3DM);三元精確覆蓋問題(exact cover by 3-set,X3C);頂點覆蓋問題(vertex cover,VC);
哈密爾頓迴路問題(Hamiltonian circuit,HC);劃分問題(PARTS);三元可滿足性問題(3SAT);團問題(CLIQUE);0/1揹包(判定)問題(0/1KPS)
暫時先寫這麼多,本人水平有限,可能有些講的不清楚的地方,歡迎批評指正。