1. 程式人生 > >演算法:NP問題,NP完全問題(NPC),NPhard問題

演算法: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)

    暫時先寫這麼多,本人水平有限,可能有些講的不清楚的地方,歡迎批評指正。