時間復雜度
時間復雜度描述了當輸入規模變大時,程序運行時間的變化程度,通常使用\(O\)來表示。比如單層循環的時間復雜度為\(O(n)\),也就是說程序運行的時間隨着輸入規模的增大線性增長,兩層循環的時間復雜度為O\((n^2)\),快速排序的時間復雜度為\(O(nlogn)\),使用窮舉法解決旅行商問題的時間復雜度為\(O(n!)\)。時間復雜度根據變化速率的快慢可以分為兩類:1、多項式級的時間復雜度,如\(O(1)\),\(O(n),O(n^a),O(logn)\)等;2、非多項式級時間復雜度,如\(O(a^n)\),\(O(n!)\)等。當我們使用計算機解決一個問題時,我們要盡可能地找到一個具有多項式級時間復雜度的算法,非多項式級時間復雜度的算法一般運行時間較長,當輸入數據規模較大時很難被接收。
P類問題
如果一個問題能找到在多項式時間內解決它的算法,那么我們說該問題是P類問題。P是多項式(Polynomial)的第一個字母。比如排序問題就是一個P問題,因為我們可以找到一個時間復雜度為\(O(n^2)\)的冒泡排序算法。
NP問題
有些問題比較復雜,如旅行商問題,漢密爾頓回路問題等,當我們使用暴力搜索時,此類問題的時間復雜度為\(O(n!)\),看起來很難找到一個能在多項式時間內解決該問題的算法,而如果別人給了我一個解,我可以很快地驗證該解是不是問題的正確答案。比如在漢密爾頓回路問題中,我想驗證一條路徑是否正確,則驗證路徑是否正確的時間復雜度為\(O(n)\),為多項式級的時間復雜度。所以,如果我們可以在多項式級的時間內驗證一個問題解的正確性,那么我們說該問題是NP問題,也就是說直接找NP問題的一個解可能很慢,當驗證NP問題的解卻很快。前面提到的漢密爾頓回路就是一個NP問題。NP問題不是“非P問題”,而是非確定性多項式(nondeterministic polynomial)問題。
NPC問題
從上面的介紹我們知道,所有P問題都是NP問題,因為能在多項式時間內解決的問題也能夠在多項式時間內驗證解的正確性。那么我們還想知道是否所有的NP問題都是P問題,這就是著名的“P對NP問題(P=NP?)”。在2000年美國的Clay數學研究所公布的七個千年數學難題中,P對NP問題位居榜首,可見解決該問題的難度。由於直接證明P對NP問題過於復雜,人們引入了另一類問題--NPC問題(NP -complete,NP-完全問題)。
歸約
在介紹NPC問題之前,需要先了解歸約的概念。假設有兩個問題A和B,對問題A的輸入a經過某種規則轉換為對問題B的輸入b,而A(a)和B(b)的結果相同,也就是說我們可以將求解A問題轉換為求解B問題,或者說可以用解決問題B的方法解決問題A,那我們稱A可以歸約(reducibility,或“約化”)到B。比如問題A為“求解一元一次方程的解”,問題B為“求解一元二次方程的解”,那么我們就可以將問題A歸約到問題B,因為求解一元二次方程解的方法可以被用來求解一元一次方程的解。有一點需要注意,問題A不會難於問題B,也就是說,A要歸約到更難的問題(時間復雜度更高)。除此之外,歸約還具有傳遞性,如果A可以歸約到B,B可以歸約到C,那么A可以歸約到C。
NPC問題
當一個問題歸約到另一個問題時,問題的復雜度變高了,問題的適用范圍也更廣了。通過對問題的不斷歸約,我們可以得到更復雜、適用范圍更廣的問題來替代簡單但使用范圍小的問題。那么我們就有一個想法 :是否可以將若干相對不那么復雜NP問題不斷歸約,從而得到一個最難的“超級NP問題”,所有的NP問題都可以歸約到這個“超級NP問題”,只要解決了這個“超級NP問題”,那么也就意味着所有NP問題都可以被解決。事實上,存在這樣的一類“超級NP問題”,這也就是我們所說的NPC問題。NPC問題的定義如下:如果一個問題Q,它滿足以下兩條性質:
(1). Q是NP問題
(2). 任一NP問題都可在多項式時間內歸約到問題Q
那么我們說問題Q是NPC問題。
Stephen Cook是NPC理論的奠基人,而Richard Karp則證明了組合優化中的大多數經典問題(背包問題、覆蓋問題、匹配問題、分區問題、路徑問題、調度問題等)都是NPC問題。如果我們給NPC問題找到了一個多項式時間復雜度的算法,那么也就意味着我們給所有的NP問題找到了多項式時間復雜度的算法,從而NP=P,因為P=NP,所以“P對NP問題”就可以被解決。比如背包問題是NPC問題,如果我們給背包問題找到了一個多項式時間復雜度的算法,那么就證明了P=NP,但給NPC問題找一個多項式時間復雜度的算法太難了,所以現在人們普遍相信P≠NP。
NPH問題
上面我們介紹了NPC問題需要滿足兩條性質,當一個問題僅滿足性質(2),而不滿足性質(1)時,我們說該問題時NPH問題(NP-hard,NP-難問題)。
4類問題的聯系
下圖直觀地描述了這4類問題之間的聯系: