資源描述:
《轉(zhuǎn)載:澄清問題、NP問題、NPC問題的概念.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、轉(zhuǎn)載:澄清P問題、NP問題、NPC問題的概念你會(huì)經(jīng)常看到網(wǎng)上出現(xiàn)“這怎么做,這不是NP問題嗎”、“這個(gè)只有搜了,這已經(jīng)被證明是NP問題了”之類的話。你要知道,大多數(shù)人此時(shí)所說的NP問題其實(shí)都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并不是那種“只有搜才行”的問題,NPC問題才是。好,行了,基本上這個(gè)誤解已經(jīng)被澄清了。下面的內(nèi)容都是在講什么是P問題,什么是NP問題,什么是NPC問題,你如果不是很感興趣就可以不看了。接下來你可以看到,把NP問題當(dāng)成是NPC問題是一個(gè)多大的錯(cuò)誤。還是先用幾句話簡(jiǎn)單說明
2、一下時(shí)間復(fù)雜度。時(shí)間復(fù)雜度并不是表示一個(gè)程序解決問題需要花多少時(shí)間,而是當(dāng)問題規(guī)模擴(kuò)大后,程序需要的時(shí)間長(zhǎng)度增長(zhǎng)得有多快。也就是說,對(duì)于高速處理數(shù)據(jù)的計(jì)算機(jī)來說,處理某一個(gè)特定數(shù)據(jù)的效率不能衡量一個(gè)程序的好壞,而應(yīng)該看當(dāng)這個(gè)數(shù)據(jù)的規(guī)模變大到數(shù)百倍后,程序運(yùn)行時(shí)間是否還是一樣,或者也跟著慢了數(shù)百倍,或者變慢了數(shù)萬倍。不管數(shù)據(jù)有多大,程序處理花的時(shí)間始終是那么多的,我們就說這個(gè)程序很好,具有O(1)的時(shí)間復(fù)雜度,也稱常數(shù)級(jí)復(fù)雜度;數(shù)據(jù)規(guī)模變得有多大,花的時(shí)間也跟著變得有多長(zhǎng),這個(gè)程序的時(shí)間復(fù)雜度就是O(n),比如找n個(gè)數(shù)中的
3、最大值;而像冒泡排序、插入排序等,數(shù)據(jù)擴(kuò)大2倍,時(shí)間變慢4倍的,屬于O(n^2)的復(fù)雜度。還有一些窮舉類的算法,所需時(shí)間長(zhǎng)度成幾何階數(shù)上漲,這就是O(a^n)的指數(shù)級(jí)復(fù)雜度,甚至O(n!)的階乘級(jí)復(fù)雜度。不會(huì)存在O(2*n^2)的復(fù)雜度,因?yàn)榍懊娴哪莻€(gè)“2”是系數(shù),根本不會(huì)影響到整個(gè)程序的時(shí)間增長(zhǎng)。同樣地,O(n^3+n^2)的復(fù)雜度也就是O(n^3)的復(fù)雜度。因此,我們會(huì)說,一個(gè)O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,盡管在n很小的時(shí)候,前者優(yōu)于后者,但后者時(shí)間隨數(shù)據(jù)規(guī)模增長(zhǎng)得慢,最終O(n^
4、3)的復(fù)雜度將遠(yuǎn)遠(yuǎn)超過O(n^2)。我們也說,O(n^100)的復(fù)雜度小于O(1.01^n)的復(fù)雜度。容易看出,前面的幾類復(fù)雜度被分為兩種級(jí)別,其中后者的復(fù)雜度無論如何都遠(yuǎn)遠(yuǎn)大于前者:一種是O(1),O(log(n)),O(n^a)等,我們把它叫做多項(xiàng)式級(jí)的復(fù)雜度,因?yàn)樗囊?guī)模n出現(xiàn)在底數(shù)的位置;另一種是O(a^n)和O(n!)型復(fù)雜度,它是非多項(xiàng)式級(jí)的,其復(fù)雜度計(jì)算機(jī)往往不能承受。當(dāng)我們?cè)诮鉀Q一個(gè)問題時(shí),我們選擇的算法通常都需要是多項(xiàng)式級(jí)的復(fù)雜度,非多項(xiàng)式級(jí)的復(fù)雜度需要的時(shí)間太多,往往會(huì)超時(shí),除非是數(shù)據(jù)規(guī)模非常小。自然
5、地,人們會(huì)想到一個(gè)問題:會(huì)不會(huì)所有的問題都可以找到復(fù)雜度為多項(xiàng)式級(jí)的算法呢?很遺憾,答案是否定的。有些問題甚至根本不可能找到一個(gè)正確的算法來,這稱之為“不可解問題”(UndecidableDecisionProblem)。TheHaltingProblem就是一個(gè)著名的不可解問題,在我的MSNSpace上有過專門的介紹和證明。再比如,輸出從1到n這n個(gè)數(shù)的全排列。不管你用什么方法,你的復(fù)雜度都是階乘級(jí),因?yàn)槟憧偟糜秒A乘級(jí)的時(shí)間打印出結(jié)果來。有人說,這樣的“問題”不是一個(gè)“正規(guī)”的問題,正規(guī)的問題是讓程序解決一個(gè)問題,輸出
6、一個(gè)“YES”或“NO”(這被稱為判定性問題),或者一個(gè)什么什么的最優(yōu)值(這被稱為最優(yōu)化問題)。那么,根據(jù)這個(gè)定義,我也能舉出一個(gè)不大可能會(huì)有多項(xiàng)式級(jí)算法的問題來:Hamilton回路。問題是這樣的:給你一個(gè)圖,問你能否找到一條經(jīng)過每個(gè)頂點(diǎn)一次且恰好一次(不遺漏也不重復(fù))最后又走回來的路(滿足這個(gè)條件的路徑叫做Hamilton回路)。這個(gè)問題現(xiàn)在還沒有找到多項(xiàng)式級(jí)的算法。事實(shí)上,這個(gè)問題就是我們后面要說的NPC問題。下面引入P類問題的概念:如果一個(gè)問題可以找到一個(gè)能在多項(xiàng)式的時(shí)間里解決它的算法,那么這個(gè)問題就屬于P問題。
7、P是英文單詞多項(xiàng)式的第一個(gè)字母。哪些問題是P類問題呢?通常NOI和NOIP不會(huì)出不屬于P類問題的題目。我們常見到的一些信息奧賽的題目都是P問題。道理很簡(jiǎn)單,一個(gè)用窮舉換來的非多項(xiàng)式級(jí)時(shí)間的超時(shí)程序不會(huì)涵蓋任何有價(jià)值的算法。接下來引入NP問題的概念。這個(gè)就有點(diǎn)難理解了,或者說容易理解錯(cuò)誤。在這里強(qiáng)調(diào)(回到我竭力想澄清的誤區(qū)上),NP問題不是非P類問題。NP問題是指可以在多項(xiàng)式的時(shí)間里驗(yàn)證一個(gè)解的問題。NP問題的另一個(gè)定義是,可以在多項(xiàng)式的時(shí)間里猜出一個(gè)解的問題。比方說,我RP很好,在程序中需要枚舉時(shí),我可以一猜一個(gè)準(zhǔn)。現(xiàn)在
8、某人拿到了一個(gè)求最短路徑的問題,問從起點(diǎn)到終點(diǎn)是否有一條小于100個(gè)單位長(zhǎng)度的路線。它根據(jù)數(shù)據(jù)畫好了圖,但怎么也算不出來,于是來問我:你看怎么選條路走得最少?我說,我RP很好,肯定能隨便給你指條很短的路出來。然后我就胡亂畫了幾條線,說就這條吧。那人按我指的這條把權(quán)值加起來一看,嘿,神了,路徑長(zhǎng)度98,比100小。于是