NP,NPC,P問題的概念

2021-07-10 08:26:01 字數 2912 閱讀 9870

最近看到演算法導論的中的這些概念就來梳理一下吧

每次看到總是有點暈。。。

p問題:我們以前接觸過的演算法如:圖搜尋問題、最短路徑問題、最小生成樹問題,都是能夠在多項式時間內解決的決策問題,

p類問題的概念:如果乙個問題可以找到乙個能在多項式的時間裡解決它的演算法,那麼這個問題就屬於p問題。p是英文單詞多項式的第乙個字母。

p問題是集合的集合,因為p=,而最短路徑問題又是乙個集合。

np問題:多項式時間內能夠驗證的問題稱為np問題。

驗證(verify)的意思是:給定乙個問題的例項(instance)、證書(certificate,證書就是類似於證據),需要驗證這個證書是這個問題的正確答案。

比如漢密爾頓路徑問題,例項為g=(v,e),證書為頂點序列 ,我們的目的是要驗證這個證書就是這個問題的答案,驗證方法為:先遍歷一遍這個點序列,看看是不是每個點只出現一次,然後對於(vi,vi+1)是否為g的邊,這樣就能夠驗證這個點序列是不是漢密爾頓路徑,很顯然這個驗證過程是多項式時間的,所以漢密爾頓路徑是np問題。

hamilton迴路是np問題,因為驗證一條路是否恰好經過了每乙個頂點非常容易。但我要把問題換成這樣:試問乙個圖中是否不存在hamilton迴路。這樣問題就沒法在多項式的時間裡進行驗證了,因為除非你試過所有的路。

(1)p問題是不是np問題呢?

很顯然是,因為我們如果要驗證乙個p問題,只需要給乙個例項和乙個空的證書(即不需要給證書),直接求解p問題即可,所以也是多項式時間能驗證的。

(2)p是不是等於np呢?

目前的答案是「不是」,但是還不能證明,因為np中還有一類npc問題,如果我們能夠證明npc是p問題,則np=p。

npc問題:目前不能用多項式時間解決的問題,但是我們還不能證明這個問題不能用多項式解決,我們這次的目標是研究這個問題。

npc的定義:

np難問題:如果乙個問題不滿足npc的第乙個條件,只滿足npc的第二個條件,則稱為np難問題。

規約(reduction):如果我們要證明乙個問題a是npc問題,則只需要首先證明他是np問題,然後只要找乙個你所知道的npc問題規約到a即可。

如果a到b規約成功,則說明:b至少比a要難,即只要有乙個解決b的黑盒子演算法,則就能解決a問題。

規約類似於函式呼叫,比如要將a規約到b,則只要:

function a(....)

//一系列變換

b(....);

因此我們在證明乙個問題是npc問題時,如果掌握的已知npc問題越多,對於你的規約越有利。

一般來說證明b是npc的過程如下:

1.證明b是np問題。

2.知道乙個已知的npc問題a。

3.給出乙個規約過程,並證明此規約過程是多項式時間的。

對於a中的任意乙個例項:

4.如果a有乙個真的例項,則b也有乙個真的例項。

5.如果b有乙個真的例項,則a也有乙個真的例項。

接下來的文章也是按照這個方式來證明的。

總結一下p、np、npc的關係如下:

之所以要定義np問題,是因為通常只有np問題才可能找到多項式的演算法。我們不會指望乙個連多項式地驗證乙個解都不行的問題存在乙個解決它的多項式級的演算法。相信讀者很快明白,資訊學中的號稱最困難的問題——「np問題」,實際上是在**np問題與p類問題的關係。

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

這是個較簡單的邏輯電路,當輸入1、輸入2、輸入3分別為true、true、false或false、true、false時,輸出為true。

有輸出無論如何都不可能為true的邏輯電路嗎?有。下面就是乙個簡單的例子。

上面這個邏輯電路中,無論輸入是什麼,輸出都是false。我們就說,這個邏輯電路不存在使輸出為true的一組輸入。

回到上文,給定乙個邏輯電路,問是否存在一種輸入使輸出為true,這即邏輯電路問題。

邏輯電路問題屬於npc問題。這是有嚴格證明的。它顯然屬於np問題,並且可以直接證明所有的np問題都可以約化到它(不要以為np問題有無窮多個將給證明造成不可逾越的困難)。證明過程相當複雜,其大概意思是說任意乙個np問題的輸入和輸出都可以轉換成邏輯電路的輸入和輸出(想想計算機內部也不過是一些0和1的運算),因此對於乙個np問題來說,問題轉化為了求出滿足結果為true的乙個輸入(即乙個可行解)。

有了第乙個npc問題後,一大堆npc問題就出現了,因為再證明乙個新的npc問題只需要將乙個已知的npc問題約化到它就行了。後來,hamilton迴路成了npc問題,tsp問題也成了npc問題。現在被證明是npc問題的有很多,任何乙個找到了多項式演算法的話所有的np問題都可以完美解決了。因此說,正是因為npc問題的存在,p=np變得難以置信。p=np問題還有許多有趣的東西,有待大家自己進一步的挖掘。攀登這個資訊學的巔峰是我們這一代的終極目標。現在我們需要做的,至少是不要把概念弄混淆了。

澄清P問題 NP問題 NPC問題的概念

這是個較簡單的邏輯電路,當輸入1 輸入2 輸入3分別為true true false或false true false時,輸出為true。有輸出無論如何都不可能為true的邏輯電路嗎?有。下面就是乙個簡單的例子。上面這個邏輯電路中,無論輸入是什麼,輸出都是false。我們就說,這個邏輯電路不存在使輸...

近來被困擾的概念問題

近來總是被一些概念和實際問題困擾,讓我很不理解。經過查閱文件和自己動手操作,自己將他們整理歸納了一下。高可用,負載均衡,分布式的概念 高可用 一台伺服器宕機後,服務可以繼續使用以及不丟失資料。主要目的就是穩定,其核心就是冗餘 故障轉移。負載均衡 負載均衡演算法 輪詢,隨機,雜湊,權重等 來分發請求到...

常見前端問題概念

使用者輸入url位址 瀏覽器解析url解析出主機名 瀏覽器將主機名轉換成伺服器ip位址 瀏覽器先查詢本地dns快取列表 沒有的話 再向瀏覽器預設的dns伺服器傳送查詢請求 同時快取 瀏覽器將埠號從url中解析出來 瀏覽器建立一條與目標web伺服器的tcp連線 三次握手 瀏覽器向伺服器傳送一條http...