1. 程式人生 > >P問題、NP問題、NPC問題

P問題、NP問題、NPC問題

ack 一次 har ref 集合 題目 二次 details 1.0

  看師兄們的論文經常說一句這是個NP難問題,所以采用另外一種方法來代替(比如凸松弛,把l0範數的問題松弛為l1範數的問題來求解)。然後搜索了相關知識,也還是沒看太懂,把一些理論知識先貼上來,希望以後再接觸到會有更好的理解。

參考來源:http://blog.csdn.net/jbb0523/article/details/40710449


》簡要介紹

(簡單介紹了相關概念和從屬關系,若時間不緊可詳細看下文中的相關解釋)

一、相關概念

  P: 能在多項式時間內解決的問題

  NP: 不能在多項式時間內解決或不確定能不能在多項式時間內解決,但能在多項式時間驗證的問題

  NPC: NP完全問題,所有NP問題在多項式時間內都能約化(Reducibility)到它的NP問題

,即解決了此NPC問題,所有NP問題也都得到解決。

  NP hard:NP難問題,所有NP問題在多項式時間內都能約化(Reducibility)到它的問題(不一定是NP問題)。

二、四者聯系的圖形表示

  將四種問題用集合表示,它們的關系圖1所示。

技術分享

圖1 P NP NPC NPhard關系的圖形表示

  說明:

  1. P問題屬於NP問題,NPC問題屬於NP問題。

  2. NPC問題同時屬於NP hard問題,是NP與NPhard的交集。


》時間復雜度

  時間復雜度並不是表示一個程序解決問題需要花多少時間,而是當問題規模擴大後,程序需要的時間長度增長得有多快。也就是說,對於高速處理數據的計算機來說,處理某一個特定數據的效率不能衡量一個程序的好壞,而應該看當這個數據的規模變大到數百倍後,程序運行時間是否還是一樣,或者也跟著慢了數百倍,或者變慢了數萬倍。不管數據有多大,程序處理花的時間始終是那麽多的,我們就說這個程序很好,具有O(1)的時間復雜度,也稱常數級復雜度

;數據規模變得有多大,花的時間也跟著變得有多長,這個程序的時間復雜度就是O(n),比如找n個數中的最大值;而像冒泡排序、插入排序等,數據擴大2倍,時間變慢4倍的,屬於O(n^2)的復雜度。還有一些窮舉類的算法,所需時間長度成幾何階數上漲,這就是O(a^n)的指數級復雜度,甚至O(n!)的階乘級復雜度。不會存在O(2*n^2)的復雜度,因為前面的那個“2”是系數,根本不會影響到整個程序的時間增長。同樣地,O (n^3+n^2)的復雜度也就是O(n^3)的復雜度。因此,我們會說,一個O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,盡管在n很小的時候,前者優於後者,但後者時間隨數據規模增長得慢,最終O(n^3)的復雜度將遠遠超過O(n^2)。我們也說,O(n^100)的復雜度小於O(1.01^n)的復雜度。

容易看出,前面的幾類復雜度被分為兩種級別,其中後者的復雜度無論如何都遠遠大於前者:一種是O(1),O(log(n)),O(n^a)等,我們把它叫做多項式級的復雜度,因為它的規模n出現在底數的位置;另一種是O(a^n)和O(n!)型復雜度,它是非多項式級的,其復雜度計算機往往不能承受。當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復雜度,非多項式級的復雜度需要的時間太多,往往會超時,除非是數據規模非常小。

總結來說,多項式復雜度的比指數級復雜度的算法要好很多。


》約化(規約reducibility)

規約就是說一個問題A可以在多項式時間轉化為問題B,然後問題A有解當前僅當轉化後的問題B有解,也就是說只要解決了B那麽就可以解決A,註意這個轉化是單向的,比如你可以用解二次方程的方法解一次方程,但是反過來卻不行。(一元二次方程的二次項系數為0時可用B問題解決方法來求解A問題,即一次方程。)

“問題A可約化為問題B”有一個重要的直觀意義:B的時間復雜度高於或者等於A的時間復雜度。也就是說,問題A不比問題B難。

約化具有一項重要的性質:約化具有傳遞性。如果問題A可約化為問題B,問題B可約化為問題C,則問題A一定可約化為問題C。


》P問題

P是指在多項式時間能由確定型圖靈機解決的問題

如果一個問題可以找到一個能在多項式的時間裏解決它的算法,那麽這個問題就屬於P問題。


》NP問題

NP問題是指在多項式時間內能由非確定型圖靈機解決的問題

NP問題不是非P類問題。NP問題是指可以在多項式的時間裏驗證一個解的問題。NP問題的另一個定義是,可以在多項式的時間裏猜出一個解的問題。

之所以要定義NP問題,是因為通常只有NP問題才可能找到多項式的算法。我們不會指望一個連多項式地驗證一個解都不行的問題存在一個解決它的多項式級的算法。

確定型圖靈機可以理解為就是按照某種固定的算法,一步步求出解的程序,而非確定型圖靈機其實是概念上的,他的理論價值更大一些,他是指某個程序rp非常好,能猜出答案。怎麽叫猜出答案呢,舉個例子比如說哈密頓問題(是說經過圖上的所有點一次且僅一次的路徑),程序猜出了個路徑ACDEFB啥的,然後程序要自己看看這個路徑是不是哈密頓路,驗證了一下,我勒個去,還真是,於是答案就出現了。所以這裏的猜是指給出一個正確的答案,就是不僅猜出了個答案,還要自己驗證一下是不是正確的,所以在有些地方解釋NP就是說能在多項式時間驗證的問題就是NP的,也不能說不對吧。


》提出一個問題P=NP?

所有的P類問題都是NP問題。也就是說,能多項式地解決一個問題,必然能多項式地驗證一個問題的解——既然正解都出來了,驗證任意給定的解也只需要比較一下就可以了。

→關鍵是,人們想知道,是否所有的NP問題都是P類問題?

→普遍趨向於不等於


》NPC問題

有個叫Cook的人發現所有的NP問題都可以規約到一種叫做SAT的問題,也就是說只要SAT能有效的解決,所有問題都能利這種方法經過相應轉化而有效解決,後來人們發現所有的問題能規約到的問題不止一種,而是一大類,有很多個,這類問題就被稱作NP-complete問題,俗稱NP完全問題,就是說這類問題是np裏最難的,所有的NP問題都可以規約到他們。到這裏我們註意到NPC問題是有兩個條件的:

→首先,它得是一個NP問題

→然後,所有的NP問題都可以約化到它

證明一個問題是 NPC問題也很簡單。證明它至少是一個NP問題,證明其中一個已知的NPC問題能約化到它(由約化的傳遞性,則NPC問題定義的第二條也得以滿足;至於第一個NPC問題是怎麽來的,下文將介紹),這樣就可以說它是NPC問題了。

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


》NP-hard問題

NP-Hard問題是這樣一種問題,它滿足NPC問題定義的第二條但不一定要滿足第一條(就是說,NP-Hard問題要比 NPC問題的範圍廣)。NP-Hard問題同樣難以找到多項式的算法,但它不列入我們的研究範圍,因為它不一定是NP問題。即使NPC問題發現了多項式級的算法,NP-Hard問題有可能仍然無法得到多項式級的算法。事實上,由於NP-Hard放寬了限定條件,它將有可能比所有的NPC問題的時間復雜度更高從而更難以解決。

P問題、NP問題、NPC問題