什么是P問題、NP問題和NPC問題.doc_第1頁
什么是P問題、NP問題和NPC問題.doc_第2頁
什么是P問題、NP問題和NPC問題.doc_第3頁
什么是P問題、NP問題和NPC問題.doc_第4頁
什么是P問題、NP問題和NPC問題.doc_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

什么是P問題、NP問題和NPC問題 Program Impossible | 2006-08-28 22:58| 71 Comments | 本文內(nèi)容遵從CC版權(quán)協(xié)議 轉(zhuǎn)載請注明出自這或許是眾多OIer最大的誤區(qū)之一。你會經(jīng)常看到網(wǎng)上出現(xiàn)“這怎么做,這不是NP問題嗎”、“這個只有搜了,這已 經(jīng)被證明是NP問題了”之類的話。你要知道,大多數(shù)人此時所說的NP問題其實都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并 不是那種“只有搜才行”的問題,NPC問題才是。好,行了,基本上這個誤解已經(jīng)被澄清了。下面的內(nèi)容都是在講什么是P問題,什么是NP問題,什么是NPC 問題,你如果不是很感興趣就可以不看了。接下來你可以看到,把NP問題當(dāng)成是 NPC問題是一個多大的錯誤。還是先用幾句話簡單 說明一下時間復(fù)雜度。時間復(fù)雜度并不是表示一個程序解決問題需要花多少時間,而是當(dāng)問題規(guī)模擴大后,程序需要的時間長度增長得有多快。也就是說,對于高速 處理數(shù)據(jù)的計算機來說,處理某一個特定數(shù)據(jù)的效率不能衡量一個程序的好壞,而應(yīng)該看當(dāng)這個數(shù)據(jù)的規(guī)模變大到數(shù)百倍后,程序運行時間是否還是一樣,或者也跟 著慢了數(shù)百倍,或者變慢了數(shù)萬倍。不管數(shù)據(jù)有多大,程序處理花的時間始終是那么多的,我們就說這個程序很好,具有O(1)的時間復(fù)雜度,也稱常數(shù)級復(fù)雜 度;數(shù)據(jù)規(guī)模變得有多大,花的時間也跟著變得有多長,這個程序的時間復(fù)雜度就是O(n),比如找n個數(shù)中的最大值;而像冒泡排序、插入排序等,數(shù)據(jù)擴大2 倍,時間變慢4倍的,屬于O(n2)的復(fù)雜度。還有一些窮舉類的算法,所需時間長度成幾何階數(shù)上漲,這就是O(an)的指數(shù)級復(fù)雜度,甚至O(n!) 的階乘級復(fù)雜度。不會存在O(2*n2)的復(fù)雜度,因為前面的那個“2”是系數(shù),根本不會影響到整個程序的時間增長。同樣地,O (n3+n2)的復(fù)雜度也就是O(n3)的復(fù)雜度。因此,我們會說,一個O(0.01*n3)的程序的效率比O(100*n2)的效率低,盡管 在n很小的時候,前者優(yōu)于后者,但后者時間隨數(shù)據(jù)規(guī)模增長得慢,最終O(n3)的復(fù)雜度將遠遠超過O(n2)。我們也說,O(n100)的復(fù)雜度小 于O(1.01n)的復(fù)雜度。容易看出,前面的幾類復(fù)雜度被分為兩種級別,其中后者的復(fù)雜度無論如何都遠遠大于前者:一種是 O(1),O(log(n),O(na)等,我們把它叫做多項式級的復(fù)雜度,因為它的規(guī)模n出現(xiàn)在底數(shù)的位置;另一種是O(an)和O(n!)型復(fù) 雜度,它是非多項式級的,其復(fù)雜度計算機往往不能承受。當(dāng)我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復(fù)雜度,非多項式級的復(fù)雜度需要的 時間太多,往往會超時,除非是數(shù)據(jù)規(guī)模非常小。自然地,人們會想到一個問題:會不會所有的問題都可以找到復(fù)雜度為多項式級的算法呢?很遺憾,答案是否定的。有些問題甚至根本不可能找到一個正確的算法來,這稱之為“不可解問題”(Undecidable Decision Problem)。The Halting Problem就 是一個著名的不可解問題,在我的Blog上有過專門的介紹和證明。再比如,輸出從1到n這n個數(shù)的全排列。不管你用什么方法,你的復(fù)雜度都是階乘級,因為 你總得用階乘級的時間打印出結(jié)果來。有人說,這樣的“問題”不是一個“正規(guī)”的問題,正規(guī)的問題是讓程序解決一個問題,輸出一個“YES”或“NO”(這 被稱為判定性問題),或者一個什么什么的最優(yōu)值(這被稱為最優(yōu)化問題)。那么,根據(jù)這個定義,我也能舉出一個不大可能會有多項式級算法的問題 來:Hamilton回路。問題是這樣的:給你一個圖,問你能否找到一條經(jīng)過每個頂點一次且恰好一次(不遺漏也不重復(fù))最后又走回來的路(滿足這個條件的 路徑叫做Hamilton回路)。這個問題現(xiàn)在還沒有找到多項式級的算法。事實上,這個問題就是我們后面要說的NPC問題。下面 引入P類問題的概念:如果一個問題可以找到一個能在多項式的時間里解決它的算法,那么這個問題就屬于P問題。P是英文單詞多項式的第一個字母。哪些問題是 P類問題呢?通常NOI和NOIP不會出不屬于P類問題的題目。我們常見到的一些信息奧賽的題目都是P問題。道理很簡單,一個用窮舉換來的非多項式級時間 的超時程序不會涵蓋任何有價值的算法。接下來引入NP問題的概念。這個就有點難理解了,或者說容易理解錯誤。在這里強調(diào)(回到我竭力想澄 清的誤區(qū)上),NP問題不是非P類問題。NP問題是指可以在多項式的時間里驗證一個解的問題。NP問題的另一個定義是,可以在多項式的時間里猜出一個解的 問題。比方說,我RP很好,在程序中需要枚舉時,我可以一猜一個準(zhǔn)?,F(xiàn)在某人拿到了一個求最短路徑的問題,問從起點到終點是否有一條小于100個單位長度 的路線。它根據(jù)數(shù)據(jù)畫好了圖,但怎么也算不出來,于是來問我:你看怎么選條路走得最少?我說,我RP很好,肯定能隨便給你指條很短的路出來。然后我就胡亂 畫了幾條線,說就這條吧。那人按我指的這條把權(quán)值加起來一看,嘿,神了,路徑長度98,比100小。于是答案出來了,存在比100小的路徑。別人會問他這 題怎么做出來的,他就可以說,因為我找到了一個比100 小的解。在這個題中,找一個解很困難,但驗證一個解很容易。驗證一個解只需要O(n)的時間復(fù)雜度,也就是說我可以花O(n)的時間把我猜的路徑的長度加 出來。那么,只要我RP好,猜得準(zhǔn),我一定能在多項式的時間里解決這個問題。我猜到的方案總是最優(yōu)的,不滿足題意的方案也不會來騙我去選它。這就是NP問 題。當(dāng)然有不是NP問題的問題,即你猜到了解但是沒用,因為你不能在多項式的時間里去驗證它。下面我要舉的例子是一個經(jīng)典的例子,它指出了一個目前還沒有 辦法在多項式的時間里驗證一個解的問題。很顯然,前面所說的Hamilton回路是NP問題,因為驗證一條路是否恰好經(jīng)過了每一個頂點非常容易。但我要把 問題換成這樣:試問一個圖中是否不存在Hamilton回路。這樣問題就沒法在多項式的時間里進行驗證了,因為除非你試過所有的路,否則你不敢斷定它“沒 有Hamilton回路”。之所以要定義NP問題,是因為通常只有NP問題才可能找到多項式的算法。我們不會指望一個連多項式地驗證一個 解都不行的問題存在一個解決它的多項式級的算法。相信讀者很快明白,信息學(xué)中的號稱最困難的問題“NP問題”,實際上是在探討NP問題與P類問題的關(guān) 系。很顯然,所有的P類問題都是NP問題。也就是說,能多項式地解決一個問題,必然能多項式地驗證一個問題的解既然正解都出 來了,驗證任意給定的解也只需要比較一下就可以了。關(guān)鍵是,人們想知道,是否所有的NP問題都是P類問題。我們可以再用集合的觀點來說明。如果把所有P類 問題歸為一個集合P中,把所有 NP問題劃進另一個集合NP中,那么,顯然有P屬于NP?,F(xiàn)在,所有對NP問題的研究都集中在一個問題上,即究竟是否有P=NP?通常所謂的“NP問 題”,其實就一句話:證明或推翻P=NP。NP問題一直都是信息學(xué)的巔峰。巔峰,意即很引人注目但難以解決。在信息學(xué)研究中,這是一個耗費了很多時間和精力也沒有解決的終極問題,好比物理學(xué)中的大統(tǒng)一和數(shù)學(xué)中的歌德巴赫猜想等。目 前為止這個問題還“啃不動”。但是,一個總的趨勢、一個大方向是有的。人們普遍認為,P=NP不成立,也就是說,多數(shù)人相信,存在至少一個不可能有多項式 級復(fù)雜度的算法的NP問題。人們?nèi)绱藞孕臥NP是有原因的,就是在研究NP問題的過程中找出了一類非常特殊的NP問題叫做NP-完全問題,也即所謂的 NPC問題。C是英文單詞“完全”的第一個字母。正是NPC問題的存在,使人們相信PNP。下文將花大量篇幅介紹NPC問題,你從中可以體會到NPC問 題使P=NP變得多么不可思議。為了說明NPC問題,我們先引入一個概念約化(Reducibility,有的資料上叫“歸約”)。簡 單地說,一個問題A可以約化為問題B的含義即是,可以用問題B的解法解決問題A,或者說,問題A可以“變成”問題B。算法導(dǎo)論上舉了這么一個例子。比 如說,現(xiàn)在有兩個問題:求解一個一元一次方程和求解一個一元二次方程。那么我們說,前者可以約化為后者,意即知道如何解一個一元二次方程那么一定能解出一 元一次方程。我們可以寫出兩個程序分別對應(yīng)兩個問題,那么我們能找到一個“規(guī)則”,按照這個規(guī)則把解一元一次方程程序的輸入數(shù)據(jù)變一下,用在解一元二次方 程的程序上,兩個程序總能得到一樣的結(jié)果。這個規(guī)則即是:兩個方程的對應(yīng)項系數(shù)不變,一元二次方程的二次項系數(shù)為0。按照這個規(guī)則把前一個問題轉(zhuǎn)換成后一 個問題,兩個問題就等價了。同樣地,我們可以說,Hamilton回路可以約化為TSP問題(Travelling Salesman Problem,旅行商問題):在Hamilton回路問題中,兩點相連即這兩點距離為0,兩點不直接相連則令其距離為1,于是問題轉(zhuǎn)化為在TSP問題 中,是否存在一條長為0的路徑。Hamilton回路存在當(dāng)且僅當(dāng)TSP問題中存在長為0的回路。“問題A可約化為問題B”有一個重要的 直觀意義:B的時間復(fù)雜度高于或者等于A的時間復(fù)雜度。也就是說,問題A不比問題B難。這很容易理解。既然問題A能用問題B來解決,倘若B的時間復(fù)雜度比 A的時間復(fù)雜度還低了,那A的算法就可以改進為B的算法,兩者的時間復(fù)雜度還是相同。正如解一元二次方程比解一元一次方程難,因為解決前者的方法可以用來 解決后者。很顯然,約化具有一項重要的性質(zhì):約化具有傳遞性。如果問題A可約化為問題B,問題B可約化為問題C,則問題A一定可約化為問題C。這個道理非常簡單,就不必闡述了?,F(xiàn)在再來說一下約化的標(biāo)準(zhǔn)概念就不難理解了:如果能找到這樣一個變化法則,對任意一個程序A的輸入,都能按這個法則變換成程序B的輸入,使兩程序的輸出相同,那么我們說,問題A可約化為問題B。當(dāng)然,我們所說的“可約化”是指的可“多項式地”約化(Polynomial-time Reducible),即變換輸入的方法是能在多項式的時間里完成的。約化的過程只有用多項式的時間完成才有意義。好 了,從約化的定義中我們看到,一個問題約化為另一個問題,時間復(fù)雜度增加了,問題的應(yīng)用范圍也增大了。通過對某些問題的不斷約化,我們能夠不斷尋找復(fù)雜度 更高,但應(yīng)用范圍更廣的算法來代替復(fù)雜度雖然低,但只能用于很小的一類問題的算法。再回想前面講的P和NP問題,聯(lián)想起約化的傳遞性,自然地,我們會想 問,如果不斷地約化上去,不斷找到能“通吃”若干小NP問題的一個稍復(fù)雜的大NP問題,那么最后是否有可能找到一個時間復(fù)雜度最高,并且能“通吃”所有的 NP問題的這樣一個超級NP問題?答案居然是肯定的。也就是說,存在這樣一個NP問題,所有的NP問題都可以約化成它。換句話說,只要解決了這個問題,那 么所有的NP問題都解決了。這種問題的存在難以置信,并且更加不可思議的是,這種問題不只一個,它有很多個,它是一類問題。這一類問題就是傳說中的NPC 問題,也就是NP-完全問題。NPC問題的出現(xiàn)使整個NP問題的研究得到了飛躍式的發(fā)展。我們有理由相信,NPC問題是最復(fù)雜的問題。再次回到全文開頭, 我們可以看到,人們想表達一個問題不存在多項式的高效算法時應(yīng)該說它“屬于NPC問題”。此時,我的目的終于達到了,我已經(jīng)把NP問題和NPC問題區(qū)別開 了。到此為止,本文已經(jīng)寫了近5000字了,我佩服你還能看到這里來,同時也佩服一下自己能寫到這里來。NPC問題的定義非常簡 單。同時滿足下面兩個條件的問題就是NPC問題。首先,它得是一個NP問題;然后,所有的NP問題都可以約化到它。證明一個問題是 NPC問題也很簡單。先證明它至少是一個NP問題,再證明其中一個已知的NPC問題能約化到它(由約化的傳遞性,則NPC問題定義的第二條也得以滿足;至 于第一個NPC問題是怎么來的,下文將介紹),這樣就可以說它是NPC問題了。既然所有的NP問題都能約化成NPC問題,那么只要任意一 個NPC問題找到了一個多項式的算法,那么所有的NP問題都能用這個算法解決了,NP也就等于P 了。因此,給NPC找一個多項式算法太不可思議了。因此,前文才說,“正是NPC問題的存在,使人們相信PNP”。我們可以就此直觀地理解,NPC問題 目前沒有多項式的有效算法,只能用指數(shù)級甚至階乘級復(fù)雜度的搜索。順便講一下NP-Hard問題。NP-Hard問題是這樣一種 問題,它滿足NPC問題定義的第二條但不一定要滿足第一條(就是說,NP-Hard問題要比 NPC問題的范圍廣)。NP-Hard問題同樣難以找到多項式的算法,但它不列入我們的研究范圍,因為它不一定是NP問題。即使NPC問題發(fā)現(xiàn)了多項式級 的算法,NP-Hard問題有可能仍然無法得到多項式級的算法。事實上,由于NP-Hard放寬了限定條件,它將有可能比所有的NPC問題的時間復(fù)雜度更 高從而更難以解決。不要以為NPC問題是一紙空談。NPC問題是存在的。確實有這么一個非常具體的問題屬于NPC問題。下文即將介紹它。下文即將介紹邏輯電路問題。這是第一個NPC問題。其它的NPC問題都是由這個問題約化而來的。因此,邏輯電路問題是NPC類問題的“鼻祖”。邏輯電路問題是指的這樣一個問題:給定一個邏輯電路,問是否存在一種輸入使輸出為True。什么叫做邏輯電路呢?一個邏輯電路由若干個輸入,一個輸出,若干“邏輯門”和密密麻麻的線組成??聪旅嬉焕?,不需要解釋你馬上就明白了。 輸入1 or 輸入2AND 輸出 輸入3 NOT這是個較簡單的邏輯電路,當(dāng)輸入1、輸入2、輸入3分別為True、True、False或False、True、False時,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論