演算法分析與設計 —— NP完全性理論
確定性演算法和非確定性演算法
(1)確定性演算法:整個執行過程中每一步都只有一個選擇,則稱A是確定性演算法。對同樣的輸入,輸出結果一定相同。
(2)非確定性演算法:在每一時刻,根據當時的狀態和輸入,若機器有多個動作可供選擇,第一個獲得結束的成功選擇使演算法終止,此時稱演算法為非確定性的。
P類問題
用一個確定性演算法在多項式時間內可解的問題。
(1) P類問題是NP問題的子集(如果P類問題既然能在多項式時間內求解,也必然能在多項式時間在驗證它的解)
NP類問題
能在多項式時間內驗證得出一個正確解的問題。
(1)對於哈密爾頓迴路問題,如果給出一個任意的迴路,我們可以很容易的判斷出該回路是否是哈密爾頓迴路(看是不是所有頂點都在迴路中),故哈密爾頓迴路是NP問題。
約化
(1)一個問題A可以約化成問題B的含義即是,可以用解決問題B的解法來解決問題A,或者說,問題A可以“變成”問題B。如:一元一次方程可以“約化”為一元二次方程
(2)問題A可“約化”為問題B的直觀意義:B的時間複雜度高於或等於A的時間複雜度。也就是說,問題A不比問題B難
(3)約化具有傳遞性:如果問題A可約化成問題B,問題B可約化成問題C,則問題A一定可約化成問題C
(4)約化需要在多項式時間內完成
NP完全問題(NPC)
存在這樣一個NP問題,所有的NP問題都可以在多項式時間內約化成它,則這個問題是NPC問題。換句話說,只要解決了這個問題,那麼所有的NP問題都解決了。
(1)NPC問題是NP問題的子集。
(2)目前為止我們還不能證明NPC問題有多項式演算法(即NP等於P),也不能證明NPC問題沒有多項式演算法(即NP不等於P)。因此,我們一般認為NPC問題是難解問題。
(3)如何證明一個新問題A是NPC問題
-
證明A∈NP;
-
選取一個已知的NPC問題B;
-
構造一個從B到A的變換f;
-
證明f為一個多項式變換。
(4)哈密爾頓迴路也是NPC問題,但尚未被解決。(通過上述證明過程可被證明)
NP難問題(NPH)
存在這樣一個NPC問題,所有的NPC問題都可以在多項式時間內約化成它,則這個問題是NPH問題