P問題
如果一個問題能找到在多項式時間內解決它的算法,那么我們說該問題是P類問題。P是多項式(Polynomial)的第一個字母。比如排序問題就是一個P問題,因為我們可以找到一個時間復雜度為O(n2)O(n2)的冒泡排序算法。
NP問題
一些問題我們很難在多項式時間內找到解決問題的算法, 但是如果別人給了我一個解,我可以很快地驗證該解是不是問題的正確答案。比如在漢密爾頓回路問題中,我想驗證一條路徑是否正確,則驗證路徑是否正確的時間復雜度為O(n)O(n),為多項式級的時間復雜度。
也就是說直接找NP問題的一個解可能很慢,當驗證NP問題的解卻很快。
NPC問題
所有P問題都是NP問題,因為能在多項式時間內解決的問題也能夠在多項式時間內驗證解的正確性。
是否所有的NP問題都是P問題,這就是著名的“P對NP問題(P=NP?)”。在2000年美國的Clay數學研究所公布的七個千年數學難題中,P對NP問題位居榜首,可見解決該問題的難度。由於直接證明P對NP問題過於復雜,人們引入了另一類問題--NPC問題(NP -complete,NP-完全問題)。
規約
假設有兩個問題A和B,對問題A的輸入a經過某種規則轉換為對問題B的輸入b,而A(a)和B(b)的結果相同,也就是說我們可以將求解A問題轉換為求解B問題,或者說可以用解決問題B的方法解決問題A,那我們稱A可以歸約(reducibility,或“約化”)到B。
超級NP問題
是否可以將若干相對不那么復雜NP問題不斷歸約,從而得到一個最難的“超級NP問題”,所有的NP問題都可以歸約到這個“超級NP問題”,只要解決了這個“超級NP問題”,那么也就意味着所有NP問題都可以被解決。事實上,存在這樣的一類“超級NP問題”,這也就是我們所說的NPC問題。
NPC問題的定義如下:如果一個問題Q,它滿足以下兩條性質:
(1). Q是NP問題
(2). 任一NP問題都可在多項式時間內歸約到問題Q
那么我們說問題Q是NPC問題。
如果我們給NPC問題找到了一個多項式時間復雜度的算法,那么也就意味着我們給所有的NP問題找到了多項式時間復雜度的算法,從而NP=P,因為P=NP,所以“P對NP問題”就可以被解決。比如背包問題是NPC問題,如果我們給背包問題找到了一個多項式時間復雜度的算法,那么就證明了P=NP,但給NPC問題找一個多項式時間復雜度的算法太難了,所以現在人們普遍相信P≠NP。
NPH問題
上面我們介紹了NPC問題需要滿足兩條性質,當一個問題僅滿足性質(2),而不滿足性質(1)時,我們說該問題時NPH問題(NP-hard,NP-難問題)。