P NP NPC和NP hard問題的理解

2022-05-10 12:09:56 字數 2583 閱讀 8745

1、p(polynomial)問題

可以在以多項式表達的時間內按部就班的按照步驟求出確切解的問題,也就是說它的計算複雜度是乙個多項式。我們通常用的o(n),o(logn),o(n2)等等類似的都是這類問題。

2、np(non-deterministicpolynomial)問題

有些計算問題是確定性的,比如加減乘除之類,你只要按照公式推導,按部就班一步步來,就可以得到結果。但是,有些問題是無法按部就班直接地計算出,這時就只能通過間接的「猜算」來得到結果,並且一定可以在多項式時間內猜到這個解。(關鍵是就是不判定這個問題到底有沒有解,而是猜出乙個解來證明這個問題是有解的)——所有的p類問題都是np問題。

例子:

比方說,我rp很好,在程式中需要列舉時,我可以一猜乙個準。現在某人拿到了乙個求最短路徑的問題,問從起點到終點是否有一條小於100個單位長度的路線。它根據資料畫好了圖,但怎麼也算不出來,於是來問我:你看怎麼選條路走得最少?我說,我rp很好,肯定能隨便給你指條很短的路出來。然後我就胡亂畫了幾條線,說就這條吧。那人按我指的這條把權值加起來一看,嘿,神了,路徑長度98,比100小。於是答案出來了,存在比100小的路徑。別人會問他這題怎麼做出來的,他就可以說,因為我找到了乙個比100小的解。在這個題中,找乙個解很困難,但驗證乙個解很容易。驗證乙個解只需要o(n)的時間複雜度,也就是說我可以花o(n)的時間把我猜的路徑的長度加出來。那麼,只要我rp好,猜得準,我一定能在多項式的時間裡解決這個問題。我猜到的方案總是最優的,不滿足題意的方案也不會來騙我去選它。這就是np問題。當然有不是np問題的問題,即你猜到了解但是沒用,因為你不能在多項式的時間裡去驗證它。舉另外乙個經典的例子,它指出了乙個目前還沒有辦法在多項式的時間裡驗證乙個解的問題。很顯然,前面所說的hamilton迴路是np問題,因為驗證一條路是否恰好經過了每乙個頂點非常容易。但我要把問題換成這樣:試問乙個圖中是否不存在hamilton迴路。這樣問題就沒法在多項式的時間裡進行驗證了,因為除非你試過所有的路,否則你不敢斷定它「沒有hamilton迴路」。

人們普遍認為,p=np不成立,也就是說,多數人相信,存在至少乙個不可能有多項式級複雜度的演算法的np問題。人們如此堅信p≠np是有原因的,就是在研究np問題的過程中找出了一類非常特殊的np問題叫做np-完全問題,也即所謂的npc問題。正是npc問題的存在,使人們相信p≠np。

3、npc(np-complete)問題

如果不斷地約化上去,不斷找到能「通吃」若干小np問題的乙個稍複雜的大np問題,那麼最後是否有可能找到乙個時間複雜度最高,並且能「通吃」所有的 np問題的這樣乙個超級np問題?答案居然是肯定的。也就是說,存在這樣乙個np問題,所有的np問題都可以約化成它。換句話說,只要解決了這個問題,那麼所有的np問題都解決了。這種問題的存在難以置信,並且更加不可思議的是,這種問題不只乙個,它有很多個,它是一類問題。這一類問題就是傳說中的npc 問題,也就是np-完全問題。

npc問題的出現使整個np問題的研究得到了飛躍式的發展。我們有理由相信,npc問題是最複雜的問題。我們可以看到,人們想表達乙個問題不存在多項式的高效演算法時應該說它「屬於npc問題」。

npc問題的定義非常簡單。同時滿足下面兩個條件的問題就是npc問題。首先,它得是乙個np問題;然後,所有的np問題都可以約化到它。證明乙個問題是 npc問題也很簡單。先證明它至少是乙個np問題,再證明其中乙個已知的npc問題能約化到它,這樣就可以說它是npc問題了。

既然所有的np問題都能約化成npc問題,那麼只要任意乙個npc問題找到了乙個多項式的演算法,那麼所有的np問題都能用這個演算法解決了,np也就等於p 了。因此,給npc找乙個多項式演算法太不可思議了。因此,前文才說,「正是npc問題的存在,使人們相信p≠np」。我們可以就此直觀地理解,npc問題目前沒有多項式的有效演算法,只能用指數級甚至階乘級複雜度的搜尋。

4、np-hard問題

np-hard問題是這樣一種問題,它滿足npc問題定義的第二條但不一定要滿足第一條(就是說,np-hard問題要比 npc問題的範圍廣,np-hard問題沒有限定屬於np

)。np-hard問題同樣難以找到多項式的演算法,但它不列入我們的研究範圍,因為它不一定是np問題。即使npc問題發現了多項式級的演算法,np-hard問題有可能仍然無法得到多項式級的演算法。事實上,由於np-hard放寬了限定條件,它將有可能比所有的npc問題的時間複雜度更高從而更難以解決。

補充:

歸約是將某個計算問題(computational problem)轉換為另乙個問題的過程。可用歸約法定義某些問題的複雜度類(因轉換過程而異)。以直覺觀之,「問題a可歸約為問題b」,指問題b的答案可用於解決問題a。因此解決a不會難於解決b。

《演算法導論》上舉了這麼乙個例子。比如說,現在有兩個問題:求解乙個一元一次方程和求解乙個一元二次方程。那麼我們說,前者可以約化為後者,意即知道如何解乙個一元二次方程那麼一定能解出一元一次方程。我們可以寫出兩個程式分別對應兩個問題,那麼我們能找到乙個「規則」,按照這個規則把解一元一次方程程式的輸入資料變一下,用在解一元二次方程的程式上,兩個程式總能得到一樣的結果。這個規則即是:兩個方程的對應項係數不變,一元二次方程的二次項係數為0。按照這個規則把前乙個問題轉換成後乙個問題,兩個問題就等價了。

關於P NP NPC和NP Hard問題

1 p問題 p中包含的是能在多項式時間內解決的問題,此類問題的時間複雜度不超過o 2 np問題 np中包含的是能在多項式時間內驗證某個解是否正確的問題。比如 1 所有的p問題都是np問題,因為我們總能在多項式時間內驗證給定的某個解是否正確。2 對於某些不屬於p問題的問題,如3 cnf可滿足性問題,給...

演算法 P NP NPC和NP hard

一般演算法效率的度量方法就是速度,即乙個演算法花了多少時間產生結果。然而有些問題,目前還並不知道有效的解法,則稱之為難題。當然,難題們也擁有不同的難度。p 能在多項式時間內解決的問題 我可以在一定時間內算出正確答案 np 不能在多項式時間內解決或不確定能不能在多項式時間內解決,但能在多項式時間驗證的...

P NP NPC與NP hard問題的定義

p問題 指的是能在多項式時間內解決的問題。np問題 指的是能在多項式時間內驗證的問題。在此,我們可以看出所有的p問題都屬於np問題,但是p是否等於np呢,至今還未得到驗證,即既證明不了p np,也證明不了p ne np。npc問題 np完全問題 是指np問題中最難的一類問題。證明乙個問題是否是npc...