【轉】關於NP,NP-hard,P,NPC等相關問題的討論

你會常常看到網上出現「這怎麼作,這不是NP問題嗎」、「這個只有搜了,這已經被證實是NP問題了」之類的話。你要知道,大多數人此時所說的NP問題其實 都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題並非那種「只有搜才行」的問題,NPC問題纔是。好,行了,基本上這個誤解已 經被澄清了。下面的內容都是在講什麼是P問題,什麼是NP問題,什麼是NPC問題,你若是不是很感興趣就能夠不看了。接下來你能夠看到,把NP問題當成是 NPC問題是一個多大的錯誤。算法


仍是先用幾句話簡單說明一下時間複雜度。時間複雜度並非表示一個程序解決問題須要花多少時間,而是當問題規模擴大後,程序須要的時間長度增加得有多快。 也就是說,對於高速處理數據的計算機來講,處理某一個特定數據的效率不能衡量一個程序的好壞,而應該看當這個數據的規模變大到數百倍後,程序運行時間是否 仍是同樣,或者也跟着慢了數百倍,或者變慢了數萬倍。無論數據有多大,程序處理花的時間始終是那麼多的,咱們就說這個程序很好,具備O(1)的時間複雜 度,也稱常數級複雜度;數據規模變得有多大,花的時間也跟着變得有多長,這個程序的時間複雜度就是O(n),好比找n個數中的最大值;而像冒泡排序、插入 排序等,數據擴大2倍,時間變慢4倍的,屬於O(n^2)的複雜度。還有一些窮舉類的算法,所需時間長度成幾何階數上漲,這就是O(a^n)的指數級複雜 度,甚至O(n!)的階乘級複雜度。不會存在O(2*n^2)的複雜度,由於前面的那個「2」是係數,根本不會影響到整個程序的時間增加。一樣 地,O(n^3+n^2)的複雜度也就是O(n^3)的複雜度。所以,咱們會說,一個O(0.01*n^3)的程序的效率比O(100*n^2)的效率 低,儘管在n很小的時候,前者優於後者,但後者時間隨數據規模增加得慢,最終O(n^3)的複雜度將遠遠超過O(n^2)。咱們也說,O(n^100)的 複雜度小於O(1.01^n)的複雜度。優化


容易看出,前面的幾類複雜度被分爲兩種級別,其中後者的複雜度不管如何都遠遠大於前者:一種是O(1),O(log(n)),O(n^a)等,咱們把它叫 作多項式級的複雜度,由於它的規模n出如今底數的位置;另外一種是O(a^n)和O(n!)型複雜度,它是非多項式級的,其複雜度計算機每每不能承受。當我 們在解決一個問題時,咱們選擇的算法一般都須要是多項式級的複雜度,非多項式級的複雜度須要的時間太多,每每會超時,除非是數據規模很是小。排序


天然地,人們會想到一個問題:會不會全部的問題均可以找到複雜度爲多項式級的算法呢?很遺憾,答案是否認的。有些問題甚至根本不可能找到一個正確的算法 來,這稱之爲「不可解問題」(Undecidable Decision Problem),The Halting Problem就是一個著名的不可解問題。再好比,輸出從1到n這n個數的全排列。無論你用什麼方法,你的複雜度都是階乘級,由於你總得用階乘級的時間打 印出結果來。有人說,這樣的「問題」不是一個「正規」的問題,正規的問題是讓程序解決一個問題,輸出一個「YES」或「NO」(這被稱爲斷定性問題),或 者一個什麼什麼的最優值(這被稱爲最優化問題)。那麼,根據這個定義,我也能舉出一個不大可能會有多項式級算法的問題來:Hamilton迴路。問題是這 樣的:給你一個圖,問你可否找到一條通過每一個頂點一次且剛好一次(不遺漏也不重複)最後又走回來的路(知足這個條件的路徑叫作Hamilton迴路)。這 個問題如今尚未找到多項式級的算法。事實上,這個問題就是咱們後面要說的NPC問題。ci


下面引入P類問題的概念:若是一個問題能夠找到一個能在多項式的時間裏解決它的算法,那麼這個問題就屬於P問題。P是英文單詞多項式的第一個字母。哪些問 題是P類問題呢?一般NOI和NOIP不會出不屬於P類問題的題目。咱們常見到的一些信息奧賽的題目都是P問題。道理很簡單,一個用窮舉換來的非多項式級 時間的超時程序不會涵蓋任何有價值的算法。路由


接下來引入NP問題的概念。這個就有點難理解了,或者說容易理解錯誤。在這裏強調(回到我竭力想澄清的誤區上),NP問題不是非P類問題。NP問題是指可 以在多項式的時間裏驗證一個解的問題。NP問題的另外一個定義是,能夠在多項式的時間裏猜出一個解的問題。比方說,我RP很好,在程序中須要枚舉時,我能夠 一猜一個準。如今某人拿到了一個求最短路徑的問題,問從起點到終點是否有一條小於100個單位長度的路線。它根據數據畫好了圖,但怎麼也算不出來,因而來 問我:你看怎麼選條路走得最少?我說,我RP很好,確定能隨便給你指條很短的路出來。而後我就胡亂畫了幾條線,說就這條吧。那人按我指的這條把權值加起來 一看,嘿,神了,路徑長度98,比100小。因而答案出來了,存在比100小的路徑。別人會問他這題怎麼作出來的,他就能夠說,由於我找到了一個比100 小的解。在這個題中,找一個解很困難,但驗證一個解很容易。驗證一個解只須要O(n)的時間複雜度,也就是說我能夠花O(n)的時間把我猜的路徑的長度加 出來。那麼,只要我RP好,猜得準,我必定能在多項式的時間裏解決這個問題。我猜到的方案老是最優的,不知足題意的方案也不會來騙我去選它。這就是NP問 題。固然有不是NP問題的問題,即你猜到了解可是沒用,由於你不能在多項式的時間裏去驗證它。下面我要舉的例子是一個經典的例子,它指出了一個目前尚未 辦法在多項式的時間裏驗證一個解的問題。很顯然,前面所說的Hamilton迴路是NP問題,由於驗證一條路是否剛好通過了每個頂點很是容易。但我要把 問題換成這樣:試問一個圖中是否不存在Hamilton迴路。這樣問題就無法在多項式的時間裏進行驗證了,由於除非你試過全部的路,不然你不敢判定它「沒 有Hamilton迴路」。數學


之因此要定義NP問題,是由於一般只有NP問題纔可能找到多項式的算法。咱們不會期望一個連多項式地驗證一個解都不行的問題存在一個解決它的多項式級的算 法。相信讀者很快明白,信息學中的號稱最困難的問題——「NP問題」,其實是在探討NP問題與P類問題的關係。it


很顯然,全部的P類問題都是NP問題。也就是說,能多項式地解決一個問題,必然能多項式地驗證一個問題的解——既然正解都出來了,驗證任意給定的解也只需 要比較一下就能夠了。關鍵是,人們想知道,是否全部的NP問題都是P類問題。咱們能夠再用集合的觀點來講明。若是把全部P類問題歸爲一個集合P中,把全部 NP問題划進另外一個集合NP中,那麼,顯然有P屬於NP。如今,全部對NP問題的研究都集中在一個問題上,即到底是否有P=NP?一般所謂的「NP問 題」,其實就一句話:證實或推翻P=NP。io


NP問題一直都是信息學的巔峯。巔峯,意即很引人注目但難以解決。在信息學研究中,這是一個耗費了不少時間和精力也沒有解決的終極問題,比如物理學中的大統一和數學中的歌德巴赫猜測等。效率


目前爲止這個問題還「啃不動」。可是,一個總的趨勢、一個大方向是有的。人們廣泛認爲,P=NP不成立,也就是說,多數人相信,存在至少一個不可能有多項 式級複雜度的算法的NP問題。人們如此堅信P≠NP是有緣由的,就是在研究NP問題的過程當中找出了一類很是特殊的NP問題叫作NP-徹底問題,也即所謂的 NPC問題。C是英文單詞「徹底」的第一個字母。正是NPC問題的存在,令人們相信P≠NP。下文將花大量篇幅介紹NPC問題,你從中能夠體會到NPC問 題使P=NP變得多麼難以想象。搜索

爲了說明NPC問題,咱們先引入一個概念——約化(Reducibility,有的資料上叫「歸約」)。


簡單地說,一個問題A能夠約化爲問題B的含義便是,能夠用問題B的解法解決問題A,或者說,問題A能夠「變成」問題B。《算法導論》上舉了這麼一個例子。 好比說,如今有兩個問題:求解一個一元一次方程和求解一個一元二次方程。那麼咱們說,前者能夠約化爲後者,意即知道如何解一個一元二次方程那麼必定能解出 一元一次方程。咱們能夠寫出兩個程序分別對應兩個問題,那麼咱們能找到一個「規則」,按照這個規則把解一元一次方程程序的輸入數據變一下,用在解一元二次 方程的程序上,兩個程序總能獲得同樣的結果。這個規則便是:兩個方程的對應項係數不變,一元二次方程的二次項係數爲0。按照這個規則把前一個問題轉換成後 一個問題,兩個問題就等價了。一樣地,咱們能夠說,Hamilton迴路能夠約化爲TSP問題(Travelling Salesman Problem,旅行商問題):在Hamilton迴路問題中,兩點相連即這兩點距離爲0,兩點不直接相連則令其距離爲1,因而問題轉化爲在TSP問題 中,是否存在一條長爲0的路徑。Hamilton迴路存在當且僅當TSP問題中存在長爲0的迴路。


「問題A可約化爲問題B」有一個重要的直觀意義:B的時間複雜度高於或者等於A的時間複雜度。也就是說,問題A不比問題B難。這很容易理解。既然問題A能 用問題B來解決,假若B的時間複雜度比A的時間複雜度還低了,那A的算法就能夠改進爲B的算法,二者的時間複雜度仍是相同。正如解一元二次方程比解一元一 次方程難,由於解決前者的方法能夠用來解決後者。


很顯然,約化具備一項重要的性質:約化具備傳遞性。若是問題A可約化爲問題B,問題B可約化爲問題C,則問題A必定可約化爲問題C。這個道理很是簡單,就沒必要闡述了。


如今再來講一下約化的標準概念就不難理解了:若是能找到這樣一個變化法則,對任意一個程序A的輸入,都能按這個法則變換成程序B的輸入,使兩程序的輸出相同,那麼咱們說,問題A可約化爲問題B。


固然,咱們所說的「可約化」是指的可「多項式地」約化(Polynomial-time Reducible),即變換輸入的方法是能在多項式的時間裏完成的。約化的過程只有用多項式的時間完成纔有意義。


好了,從約化的定義中咱們看到,一個問題約化爲另外一個問題,時間複雜度增長了,問題的應用範圍也增大了。經過對某些問題的不斷約化,咱們可以不斷尋找複雜 度更高,但應用範圍更廣的算法來代替複雜度雖然低,但只能用於很小的一類問題的算法。再回想前面講的P和NP問題,聯想起約化的傳遞性,天然地,咱們會想 問,若是不斷地約化上去,不斷找到能「通吃」若干小NP問題的一個稍複雜的大NP問題,那麼最後是否有可能找到一個時間複雜度最高,而且能「通吃」全部的 NP問題的這樣一個超級NP問題?答案竟然是確定的。也就是說,存在這樣一個NP問題,全部的NP問題均可以約化成它。換句話說,只要解決了這個問題,那 麼全部的NP問題都解決了。這種問題的存在難以置信,而且更加難以想象的是,這種問題不僅一個,它有不少個,它是一類問題。這一類問題就是傳說中的NPC 問題,也就是NP-徹底問題。NPC問題的出現使整個NP問題的研究獲得了飛躍式的發展。咱們有理由相信,NPC問題是最複雜的問題。再次回到全文開頭, 咱們能夠看到,人們想表達一個問題不存在多項式的高效算法時應該說它「屬於NPC問題」。此時,個人目的終於達到了,我已經把NP問題和NPC問題區別開 了。到此爲止,本文已經寫了近5000字了,我佩服你還能看到這裏來,同時也佩服一下本身能寫到這裏來。


NPC問題的定義很是簡單。同時知足下面兩個條件的問題就是NPC問題。首先,它得是一個NP問題;而後,全部的NP問題均可以約化到它。證實一個問題是 NPC問題也很簡單。先證實它至少是一個NP問題,再證實其中一個已知的NPC問題能約化到它(由約化的傳遞性,則NPC問題定義的第二條也得以知足;至 於第一個NPC問題是怎麼來的,下文將介紹),這樣就能夠說它是NPC問題了。


既然全部的NP問題都能約化成NPC問題,那麼只要任意一個NPC問題找到了一個多項式的算法,那麼全部的NP問題都能用這個算法解決了,NP也就等於P 了。所以,給NPC找一個多項式算法太難以想象了。所以,前文才說,「正是NPC問題的存在,令人們相信P≠NP」。咱們能夠就此直觀地理解,NPC問題 目前沒有多項式的有效算法,只能用指數級甚至階乘級複雜度的搜索。


順便講一下NP-Hard問題。NP-Hard問題是這樣一種問題,它知足NPC問題定義的第二條但不必定要知足第一條(就是說,NP-Hard問題要比 NPC問題的範圍廣)。NP-Hard問題一樣難以找到多項式的算法,但它不列入咱們的研究範圍,由於它不必定是NP問題。即便NPC問題發現了多項式級 的算法,NP-Hard問題有可能仍然沒法獲得多項式級的算法。事實上,因爲NP-Hard放寬了限定條件,它將有可能比全部的NPC問題的時間複雜度更 高從而更難以解決。

不要覺得NPC問題是一紙空談。NPC問題是存在的。確實有這麼一個很是具體的問題屬於NPC問題。下文即將介紹它。


下文即將介紹邏輯電路問題。這是第一個NPC問題。其它的NPC問題都是由這個問題約化而來的。所以,邏輯電路問題是NPC類問題的「鼻祖」。

邏輯電路問題是指的這樣一個問題:給定一個邏輯電路,問是否存在一種輸入使輸出爲True。
什麼叫作邏輯電路呢?一個邏輯電路由若干個輸入,一個輸出,若干「邏輯門」和密密麻麻的線組成。看下面一例,不須要解釋你立刻就明白了。

這是個較簡單的邏輯電路,當輸入一、輸入二、輸入3分別爲True、True、False或False、True、False時,輸出爲True。
有輸出不管如何都不可能爲True的邏輯電路嗎?有。下面就是一個簡單的例子。

 

上面這個邏輯電路中,不管輸入是什麼,輸出都是False。咱們就說,這個邏輯電路不存在使輸出爲True的一組輸入。


回到上文,給定一個邏輯電路,問是否存在一種輸入使輸出爲True,這即邏輯電路問題。


邏輯電路問題屬於NPC問題。這是有嚴格證實的。它顯然屬於NP問題,而且能夠直接證實全部的NP問題均可以約化到它(不要覺得NP問題有無窮多個將給證 明形成不可逾越的困難)。證實過程至關複雜,其大概意思是說任意一個NP問題的輸入和輸出均可以轉換成邏輯電路的輸入和輸出(想一想計算機內部也不過是一些 0和1的運算),所以對於一個NP問題來講,問題轉化爲了求出知足結果爲True的一個輸入(即一個可行解)。

有了第一個NPC問題後,一大堆NPC問題就出現了,由於再證實一個新的NPC問題只須要將一個已知的NPC問題約化到它就好了。後來,Hamilton 迴路成了NPC問題,TSP問題也成了NPC問題。如今被證實是NPC問題的有不少,任何一個找到了多項式算法的話全部的NP問題均可以完美解決了。所以 說,正是由於NPC問題的存在,P=NP變得難以置信。P=NP問題還有許多有趣的東西,有待你們本身進一步的挖掘。攀登這個信息學的巔峯是咱們這一代的 終極目標。如今咱們須要作的,至少是不要把概念弄混淆了。

相關文章
相關標籤/搜索