NP-Completeness理解

今天大年初一,哪裏也沒去,在家裏從新看了下IOA的NP問題。感受看明白了。算法

首先定義下:app

所謂P問題是指全部能在多項式複雜度解決的問題,好比排序算法,n*n複雜度解決問題。函數

有些問題目前沒有多項式複雜度的解決方案,可是若是你給我一個解決方案,我能夠在多項式時間內驗證該算法是否正確。好比說bool表達式的可知足性問題,給我一個表達式,雖然我不能在多項式時間內判斷它是否可知足,可是若是你給我一個答案,我能判斷這個答案的正確性。這類問題就是NP問題。優化

P屬於NP。這是很明顯的。ui

那麼P是否等於NP呢?目前看,不等於。由於存在一類NP徹底的問題。排序

NP徹底問題是NP中的一類問題,若是知足如下兩個條件,那麼咱們說L是NP徹底的:L是NP問題;全部的NP問題均可以「多項式歸結」爲L。內存

----------------------------------------------------ci

先定義什麼是問題?問題就是一個映射,把「instance」(輸入)映射到「solution」(輸出)。it

各類問題的輸出千差萬別,不便於討論,統一下,都輸出true和false。這就是斷定型問題,decision problem。其餘那些尋找最優解的叫優化類問題。全部優化類問題均可以轉變成斷定型問題。io

接着是語言。既然一個問題P輸出都是true或者false,若是集合L中的全部instance都讓P輸出true,那麼咱們說P 接受L。這裏有一個很重要的轉變,就是把一個抽象的問題,變成了一個instance的集合。兩個問題是難以相等或者轉換的,可是兩個集合是能夠的,mapping。基於這個mapping就能夠定義多項式歸結。

----------------------------------------------------

什麼是多項式歸結?也有兩層含義:

給定兩個算法,A和B。x是A輸入,f是一個映射函數,能把x映射成B的輸入。含義1:A(x)==B(f(x));含義2:f(x)是多項式複雜度。

-------------------------------------------------------------

而後咱們要尋找一個NP徹底問題,這個問題就是Circuit-SAT。它的意思是給任意一個集成電路,判斷該電路是否會輸出1.咱們知道集成電路都是有若干管腳做爲輸入,幾個管家做爲輸出的。這裏簡單起見,只有一個輸出。若是咱們發現一個電路只能輸出0,那麼咱們可能發現了一個bug,或者簡單的把它替換成常數。

怎麼證實呢,從定義出發,先證實它是NP的,再證實全部的NP問題均可以歸結到它(任意一個算法的輸入實例均可以在多項式時間裏變成一個集成電路)。

-------------

它是NP的,就是要證實存在算法A,給輸入x(某個集成電路),y(某種輸入方式),能夠判斷y是否知足x。這個複雜度是線性的,知足多項式複雜度的要求。

-----------

全部的NP問題都能歸結到Circuit-SAT的問題嗎?這又要解決兩個問題:

1. 是否存在一個映射函數F,使得任意算法的輸入x都能變成等價的一個集成電路C;

2.F是不是多項式的複雜度;

先看第一個問題,可否找到這樣的F呢。下面的描述就是爲了構造這個F。假定咱們要把算法W歸結到Circuit-SAT。W算法的驗證算法是A,給定x和y,能夠判斷輸入爲x時,y是不是一個正確的答案。舉個例子,W是要判斷圖中是否存在長度爲K的路徑,x表明圖的數據結果,y表明最長路徑的各條邊,那麼A是驗證的算法。

若是咱們把系統內存當成一個變量,那麼每條指令的執行都會將一個內存快照(conf)變成另一個(conf),咱們能夠認爲這個映射是一個circuit完成的。

因爲A(x,y)是多項式複雜度,因此conf的個數是多項式個。咱們把這全部的集成電路組合起來,造成一個新的集成電路C。這樣咱們就把x變成了C。

也就是說,對於W而言,驗證算法A(x,y)=1,當且僅當B(C,y)=1.其中B是驗證集成電路的可知足性算法。

-------------

F已經找到了,那麼F是不是多項式複雜度的呢?首先x是多項式的,內存大小是多項式的,集成電路個數等於執行的指令數,也是多項式的,多項式組合在一塊兒,仍是多項式的。

--------------

這就證實了全部NP問題都能歸結到circuit-sat問題。

其實這裏還有一個language的問題,我貌似還沒看懂。

------------------------------------------------------------

如何判斷一個問題是NP-hard的呢,若是一個NP徹底的問題可以歸結到該問題,(無論他是否是NP問題),它都是NP-hard。

因爲咱們已經找到了一個NP徹底問題circuit-sat,對於目標問題W,只須要把circuit-sat問題歸結到W的輸入便可證實W是NP-hard的問題。這就很容易證實不少算法都是NP的。好比說Boolean表達式的可知足性。後續將會繼續討論。

 

首先

相關文章
相關標籤/搜索