1. 程式人生 > >[總結]演算法中的P問題、NP問題、NP完全問題和NP難問題

[總結]演算法中的P問題、NP問題、NP完全問題和NP難問題

在討論演算法的時候,常常會說到這個問題的求解是個P類問題,或者是NP難問題等等,於是我特地搜了這方面的資料,自己總結了下,估計研究演算法的大家應該都知道,要是我總結的哪裡不對,歡迎一起探討~

在講P類問題之前先介紹兩個個概念:多項式,時間複雜度。(知道這兩概念的可以自動跳過這部分)

1、多項式:axn-bxn-1+c

恩....就是長這個樣子的,叫x最高次為n的多項式....

咳咳,別嫌我囉嗦。。有些人說不定還真忘了啥是多項式了。。例如第一次看到的鄙人→_→

2、時間複雜度

我們知道在計算機演算法求解問題當中,經常用時間複雜度和空間複雜度來表示一個演算法的執行效率。空間複雜度表示一個演算法在計算過程當中要佔用的記憶體空間大小,這裡暫不討論。時間複雜度則表示這個演算法執行得到想要的解所需的計算工作量,他探討的是當輸入值接近無窮時,演算法所需工作量的變化快慢程度。

舉個例子:氣泡排序。

在計算機當中,排序問題是最基礎的,將輸入按照大小或其他規則排好序,有利於後期運用資料進行其他運算。氣泡排序就是其中的一種排序演算法。假設手上現在有n個無序的數,利用氣泡排序對其進行排序,

①首先比較第1個數和第2個數,如果後者>前者,就對調他們的位置,否則不變

②接著比較第2個數和第3個數,如果後者>前者,就對調他們的位置,否則不變

③一直向下比較直到第n-1和第n個數比較完,第一輪結束。(這時候最大的數移動到了第n個數的位置)

④重複前三步,但是隻比較到第n-1個數(將第二大的數移動到第n-1個數位置)

⑤持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

舉個例項:5,4,3,2,1,對其進行排序,先是比較5跟4變成4,5,3,2,1,第一輪結束後變成43215,可以計算,當對其排序完正好要經過4+3+2+1=10次比較,當然這是最複雜的情況,即完全反序。可以知道對於n個數,至多要經過1+2+...+n-1即(n^2-n)/2次比較才能排好序。這個式子裡n的最高次階是2,可知道當n→∞時,一次性對其比較次數影響很小,所以我們把這個演算法的時間複雜度比作:o(n^2)。取其最高次,可以看出,這是一個時間複雜度為多項式的表示方式。

時間複雜度排序o(1)<o(n)<o(lgn)<o(n^2)<o(n^a)<o(e^n)(a>2,n表示輸入的資料個數,o(1)為常數級別)

好了,介紹完上面的概念就可以開始講關於什麼叫P類問題了。以上個例子氣泡排序為例,我們知道了,在排序這個大問題裡,是可以找到一種時間複雜度為多項式o(n^2)的演算法(如氣泡排序法)來求解排序問題的,所以我們說排序問題是一個有多項式時間演算法的問題。

所以我們稱,

P類問題:存在多項式時間演算法的問題。(P:polynominal,多項式)

然後扯個題外話,為什麼我們要研究這個?因為計算機處理的輸入常常不是那麼幾十個幾千個那麼一點點,想象一下,當計算機處理的資料達到100萬個的時候,時間複雜度為o(n^2)和o(e^n)的演算法,所需的執行次數簡直是天壤之別,o(e^n)指數級的可能執行好幾天都沒法完成任務,所以我們才要研究一個問題是否存在多項式時間演算法。而我們也只在乎一個問題是否存在多項式演算法,因為一個時間複雜度比多項式演算法還要複雜的演算法研究起來是沒有任何實際意義的。

好了,接下來我們介紹NP,先給定義,

NP類問題:能在多項式時間內驗證得出一個正確解的問題。(NP:Nondeterministic polynominal,非確定性多項式)

P類問題是NP問題的子集,因為存在多項式時間解法的問題,總能在多項式時間內驗證他。

注意定義,這裡是驗證。NP類問題,我用個人的俗話理解就是,不知道這個問題是不是存在多項式時間內的演算法,所以叫non-deterministic非確定性,但是我們可以在多項式時間內驗證並得出這個問題的一個正確解。舉個例子,

著名的NP類問題:旅行家推銷問題(TSP)。即有一個推銷員,要到n個城市推銷商品,他要找出一個包含所有n個城市的環路,這個環路路徑小於a。我們知道這個問題如果單純的用列舉法來列舉的話會有(n-1)! 種,已經不是多項式時間的演算法了,(注:階乘演算法比多項式的複雜)。那怎麼辦呢?我們可以用猜的,假設我人品好,猜幾次就猜中了一條小於長度a的路徑,我畫畫畫畫,好的,我得到了一條路徑小於a的環路,問題解決了,皆大歡喜。可是,我不可能每次都猜的那麼準,也許我要猜完所有種呢?所以我們說,這是一個NP類問題。也就是,我們能在多項式的時間內驗證並得出問題的正確解,可是我們卻不知道該問題是否存在一個多項式時間的演算法,每次都能解決他(注意,這裡是不知道,不是不存在)。

所以這就引出了這類討論的一個千年問題:是否 NP類問題=P類問題?

即,是否所有能在多項式時間內驗證得出正確解的問題,都是具有多項式時間演算法的問題呢?

太讓人震驚了,要是解決了這個問題,那豈不是所有的NP問題都可以通過計算機來解決?

聖戰的結果是,有的存在,有的不存在。=_=

在這場聖戰中,人們還發現了很多的東東,也就是我們接下來要介紹的NPC問題(啊喂,我不是遊戲NPC)和NPH問題。

(PS :網路上經常有人說,這不是個NP問題嗎,其實很多時候他們說的應該是NPC問題,而不是NP問題)

為了證明這個千古難題,科學家想出了很多辦法。其中之一就是問題的約化。所謂問題約化就是,可以用問題B的演算法來解決A ,我們就說問題A可以約化成問題B。舉個例子,一元一次方程的求解,跟二元一次方程的求解,我們知道,只要能求解二元一次方程,那就可以用二元一次方程的解法來求解一元一次方程,只需要將一元一次方程加上y,並附加一個方程y=0就可以將一元一次方程變形為一個二元一次方程,然後用二元一次方程的解法來求解這個方程。注意,這裡二元一次方程的解法會比一元一次的複雜。所以我們說,只需要找到解二元一次方程的規則性解法,那就能用這個規則性解法來求解一元一次方程。從這裡也可以看出,約化是具有傳遞性的,如A約化到B,B約化到C,A就可以約化到C,同時不斷約化下去,我們會發現一個很驚人的特性,就是他一定會存在一個最大的問題,而我們只需要解決了這個問題,那其下的所有問題也就解決啦!這就是我們所說的NPC問題的概念!!!

引到NP問題裡就是,對於同一類的所有的NP類問題,若他們都可以在多項式時間內約化成最難的一個NP類問題,(我們直觀的認為,被約化成的問題應具有比前一個問題更復雜的時間複雜度)當我們針對這個時間複雜度最高的超級NP問題要是能找到他的多項式時間演算法的話,那就等於變向的證明了其下的所有問題都是存在多項式演算法的,即NP=P!!!!給出NPC問題定義,

NPC問題:如果所有np問題都能在多項式時間內轉化為他,則稱該np問題為npc問題(NPC:NP complete又叫NP完全問題)

NPC問題是NP問題的子集。

當然,很多時候NPC問題是找不到一個多項式時間演算法的,更多時候他是一個指數級的演算法。

最後介紹下NPH問題。

NPH問題:我們又叫NP難問題,他不是一個NP問題,然後所有的NPC問題都可以在多項式時間內轉化為他的話,我們就叫他NPH(hard)問題。

至此,介紹完了這四大問題,感覺自己像在寫小說一樣,越寫越興奮,哈哈,簡直又臭又長~~