資源描述:
《p問題、np問題、npc問題的概念》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、P問題、NP問題、NPC問題的概念?????這或許是眾多OIer最大的誤區(qū)之一。?????你會經(jīng)??吹骄W(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問題是一個多大的錯
2、誤。??????還是先用幾句話簡單說明一下時間復(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)
3、,比如找n個數(shù)中的最大值;而像冒泡排序、插入排序等,數(shù)據(jù)擴大2倍,時間變慢4倍的,屬于O(n^2)的復(fù)雜度。還有一些窮舉類的算法,所需時間長度成幾何階數(shù)上漲,這就是O(a^n)的指數(shù)級復(fù)雜度,甚至O(n!)的階乘級復(fù)雜度。不會存在O(2*n^2)的復(fù)雜度,因為前面的那個“2”是系數(shù),根本不會影響到整個程序的時間增長。同樣地,O(n^3+n^2)的復(fù)雜度也就是O(n^3)的復(fù)雜度。因此,我們會說,一個O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,盡管在n很小的時候,前者優(yōu)于后者,但后者時間隨數(shù)據(jù)規(guī)模增長得慢,最終O(n^3
4、)的復(fù)雜度將遠遠超過O(n^2)。我們也說,O(n^100)的復(fù)雜度小于O(1.01^n)的復(fù)雜度。??????容易看出,前面的幾類復(fù)雜度被分為兩種級別,其中后者的復(fù)雜度無論如何都遠遠大于前者:一種是O(1),O(log(n)),O(n^a)等,我們把它叫做多項式級的復(fù)雜度,因為它的規(guī)模n出現(xiàn)在底數(shù)的位置;另一種是O(a^n)和O(n!)型復(fù)雜度,它是非多項式級的,其復(fù)雜度計算機往往不能承受。當(dāng)我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復(fù)雜度,非多項式級的復(fù)雜度需要的時間太多,往往會超時,除非是數(shù)據(jù)規(guī)模非常小。?????自然
5、地,人們會想到一個問題:會不會所有的問題都可以找到復(fù)雜度為多項式級的算法呢?很遺憾,答案是否定的。有些問題甚至根本不可能找到一個正確的算法來,這稱之為“不可解問題”(UndecidableDecisionProblem)。TheHaltingProblem就是一個著名的不可解問題,在我的MSNSpace上有過專門的介紹和證明。再比如,輸出從1到n這n個數(shù)的全排列。不管你用什么方法,你的復(fù)雜度都是階乘級,因為你總得用階乘級的時間打印出結(jié)果來。有人說,這樣的“問題”不是一個“正規(guī)”的問題,正規(guī)的問題是讓程序解決一個問題,輸出一個“YES”或“N
6、O”(這被稱為判定性問題),或者一個什么什么的最優(yōu)值(這被稱為最優(yōu)化問題)。那么,根據(jù)這個定義,我也能舉出一個不大可能會有多項式級算法的問題來:Hamilton回路。問題是這樣的:給你一個圖,問你能否找到一條經(jīng)過每個頂點一次且恰好一次(不遺漏也不重復(fù))最后又走回來的路(滿足這個條件的路徑叫做Hamilton回路)。這個問題現(xiàn)在還沒有找到多項式級的算法。事實上,這個問題就是我們后面要說的NPC問題。?????下面引入P類問題的概念:如果一個問題可以找到一個能在多項式的時間里解決它的算法,那么這個問題就屬于P問題。P是英文單詞多項式的第一個字母
7、。哪些問題是P類問題呢?通常NOI和NOIP不會出不屬于P類問題的題目。我們常見到的一些信息奧賽的題目都是P問題。道理很簡單,一個用窮舉換來的非多項式級時間的超時程序不會涵蓋任何有價值的算法。??????接下來引入NP問題的概念。這個就有點難理解了,或者說容易理解錯誤。在這里強調(diào)(回到我竭力想澄清的誤區(qū)上),NP問題不是非P類問題。NP問題是指可以在多項式的時間里驗證一個解的問題。NP問題的另一個定義是,可以在多項式的時間里猜出一個解的問題。比方說,我RP很好,在程序中需要枚舉時,我可以一猜一個準(zhǔn)。現(xiàn)在某人拿到了一個求最短路徑的問題,問從起
8、點到終點是否有一條小于100個單位長度的路線。它根據(jù)數(shù)據(jù)畫好了圖,但怎么也算不出來,于是來問我:你看怎么選條路走得最少?我說,我RP很好,肯定能隨便給你指條很短的路出來。然后我就