轉載之:http://zhiqiang.org/blog/
具體研究:
- Analysis of Algorithms - 算法
- Computational Complexity - 計算複雜性
- Communication Complexity - 通訊複雜性
- Cryptographic Protocols - 密碼
- Quantum Computing - 量子計算
這個問題,作爲理論計算機科學的核心問題,其聲名早已經超越了這個領域。它是Clay研究所的七個百萬美元大獎問題之一,在2006國際數學家大會上,它是某個1小時講座的主題。
要說起P和NP是什麼東西,得先從算法的多項式時間複雜度談起,注意,這裏面的兩個P都是指Polynomial。
一個問題的規模指的是輸入的總位數,比如一個n個數的排序問題,輸入規模就是n。注意,在某些時候,輸入規模是要值得注意的,比如判定一個數n是否是一個質數這個問題,它的輸入規模並不是n,而是log(n),因爲一個數n用大約log(n)位就能表示出來了,這也是爲何枚舉因子判定素數的算法並不是多項式時間算法的原因。
如果一個算法,它能在以輸入規模爲參變量的某個多項式的時間內給出答案,則稱它爲多項式時間算法。注意:這裏的多項式時間是指算法運行的步數。一個算法是否是多項式算法,與計算模型的具體的物理實現沒有關係,雖然大多數假想的計算模型不可能有任何物理的實現。
P指確定型圖靈機上的具有多項式算法的問題集合,NP指非確定型圖靈機上具有多項式算法的問題集合,這裏N是Non-Deterministic的意思(圖靈機的概念見理論計算機初步:算法和計算模型)。
脫離圖靈機的概念,就在普通的計算機上看,P問題是指能夠在多項式時間求解的判定問題(判定問題指只需要回答是和不是的問題),而NP問題則是指那些其肯定解能夠在給定正確信息下在多項式時間內驗證的判定問題。比如,要判定一個數是合數,如果給我一個約數,我們就很快判定它就是合數。所以判定一個數是合數的問題屬於NP。 下面是一些NP問題的例子:
從上面的定義知道,NP包含P。P vs NP問題指P是否完全等於NP,即確定型圖靈機和非確定圖靈機的性能是否一樣。
人們爲何要提出NP問題?因爲,大多數遇到的自然的難解問題,最後都發現它們是NP問題。如果我們能證明NP跟P的關係,則解決了無數問題的算法複雜度問題。
NP裏面有無數個不同的問題,我們是否要一個一個地判定它們是否屬於P呢?P vs NP問題的美妙和簡潔之處便在於在NP中,有一個子類,NP完全(NP Complete,簡記爲NPC)問題,指的是那些NP中最難的那些問題:所有其它的NP問題都可以歸約到這些NP完全問題。也就是說,只要這些NP完全問題的某一個得到解決,無論是證明其存在多項式算法,還是不存在,都意味着P vs NP問題的解決。
而幾乎所有NP裏面無法確定是否屬於P的問題最後都被證明爲NP完全。正因爲如此,多數理論計算機學家都猜測P≠NP。目前已知的NP完全問題數以千計,上面引用中的例子都是完全問題,更多NP完全問題見NP完全問題的不完全列表。
一個很自然的想法是如果NP≠P,則NP-P裏面的問題都是完全問題。至少有兩個自然的問題,一個是大數分解(給出一個數的質因數分解式),另一個是圖同構問題(給出兩個圖,它們是否同構),它們既沒有被證明是P的,也沒有被證明是NP-完全。但是更驚人的是還有這個定理:
當然,這種問題具體是什麼樣子,是無法用直觀的語言表示出來,它純粹是一個數學上的構造性證明。
概率算法和近似算法
已經提到了顯示中大多數難解問題問題最後都被證明是NP-完全問題。這意味着,除非NP=P,它們是不可能有多項式時間算法的(而且,即使NP=P,人們也可能找不到一個NP完全問題的「有效」算法)。
所以人們發展了各種工具來避開它們,最常用的兩種方法是使用概率算法和近似算法,這兩種方法也符合實際需要:在解決實際問題中,我們不需要結果絕對正確,也不需要結果絕對精確。
所謂概率算法,就是在算法的過程中引入隨機數,使得算法在執行的過程中隨機選擇下一個計算步驟。它最後可能導致結果也是不確定的。一個結果不確定的概率算法叫做Monte Carlo算法,而總是得到準確解的概率算法叫做Sherwood算法(一個例子是引進隨機因子的快速排序算法)。
爲何引入隨機數能夠提升計算性能(事實上,理論計算機學家還沒能證實隨機因子本質上更有效率——指具有指數級別的效率提升),主要有下面兩個原因:
首先,通常一個算法,它對於很多種情況是比較快的,但對於某些「特別差」的輸入,它要找到一個解則特別困難。引入隨機數之後,使得算法的時間複雜度平均化了,然後算得更快(評價一個隨機算法的複雜性通常是考慮其平均複雜性)。
其次,對於Monte Carlo算法,它的輸出是不精確的,這種犧牲使得算法能夠在較短時間內完成。
需要指出的是,下面這個定理,使得一個不那麼精確的Monte Carlo算法亦有實際的效用的:
上面的結果由於k出現在指數上,所以只需要將一個Monte Carle算法重複很少的次數,便能得到很高的準確率。
近似算法從字面的意思來看似乎和上面的Monte Carle算法差不多,其實它們的考慮對象是不一樣的,而且通常所指的近似算法是確定型算法。近似算法多用在組合優化的問題,而不是判定性問題上。組合優化問題,指的是那些需要求最優解的問題,比如下面這個
對於這種問題,如果最短路徑是1000,而且我們能很快找到一個1000.1的路徑,在實際運用中,我們還需要浪費巨大的計算資源去找那個1000的路徑嗎?近似算法便基於此思想而來。
近似算法指在解決優化問題中,最後得到的結果能保證在一定的誤差之內的算法。
從近似算法的角度來說,同爲NP完全問題,它們也有不同的可近似度。在多項式時間內,有些問題可以無窮小誤差的逼近,但有些問題卻連常數倍數之內的結果都沒法得到。
參閱:
- Complexity classes P and NP - Wikipedia, the free encyclopedia, P/NP問題- Wikipedia
- Turing machine - Wikipedia, the free encyclopedia, 圖靈機- Wikipedia
- NP-hard - Wikipedia, the free encyclopedia,
- P verse NP problem
- The history and status of P verse NP question