1. 程式人生 > >p問題、np問題、npc問題、np難問題的理解(純屬個人見解)

p問題、np問題、npc問題、np難問題的理解(純屬個人見解)

最近因為要證明np問題,所以找了一系列概念去理解這4個問題。理解的時候看到好多人給出了不同的答案,我下面會借鑑別人的答案來總結出一份對於我自己來說,最容易理解這4個問題的說法。

預備知識瞭解:

時間複雜度

表明問題規模擴大後,程式需要的時間長度增長得有多快。程式的時間複雜度一般可以分為兩種級別:

(個人感想:這個對於程式設計師或者學數學或其他的來說不陌生,從程式的角度出發,就是一個程式執行所需要的時間和輸入size存在的一個關於時間上的關係。)

- 多項式級的複雜度,如O(1),O(log(n))、O(n^a)等,

- 非多項式級的,如O(a^n)、O(n!)等。後者的複雜度計算機往往不能承受。

約化(Reducibility)

(個人感想:這個理解是我看過那麼多概念覺得最能理解的,最簡潔的。約化是這4個問題之間相互轉換的關鍵)

簡單的說,一個問題A可以約化為問題B的含義是,可以用問題B的解法解決問題A。(個人感覺也就是說,問題A是B的一種特殊情況。)標準化的定義是,如果能找到一個變化法則,對任意一個A程式的輸入,都能按照這個法則變換成B程式的輸入,使兩程式的輸出相同,那麼我們說,問題A可以約化為問題B。

例如求解一元一次方程這個問題可以約化為求解一元二次方程,即可以令對應項係數不變,二次項的係數為0,將A的問題的輸入引數帶入到B問題的求解程式去求解。

另外,約化還具有傳遞性,A可以化約為B,B可以約化為C,那麼A也可以約化為C。

多項式時間內找出這個解&多項式時間內驗證這個解

(個人感想:這個概念也是很重要的,我覺得對於理解是不可忽視的一個概念)

比如說著名的揹包問題Knapsack problem,你要在多項式的時間內找出這個解釋很困難的,但是如果有人給了一個解給你,你來驗證這個解(看一下每個揹包是否可以裝得下這個解分配的物品),這個是可以在有效時間內驗證的,畢竟對於這個揹包問題來說,它的驗證十分簡單。

p問題、np問題、npc問題、np難問題的概念:

(個人感想:這個stackoverflow上面最高票的答案的說法是我覺得,沒有能夠比擬的,還有一個不錯的是一個斯坦福的TA在quora上的回答,下面我會貼上stackoverflow上最高票的這個答案,如果第一遍讀了不能理解,那就讀第二遍,直到讀懂為止。)

P

P is a complexity class that represents the set of all decision problems that can be solved in polynomial time.

That is, given an instance of the problem, the answer yes or no can be decided in polynomial time.

Example

Given a connected graph G, can its vertices be coloured using two colours so that no edge is monochromatic?

Algorithm: start with an arbitrary vertex, color it red and all of its neighbours blue and continue. Stop when you run out of vertices or you are forced to make an edge have both of its endpoints be the same color.

NP

NP is a complexity class that represents the set of all decision problems for which the instances where the answer is "yes" have proofs that can be verified in polynomial time.

This means that if someone gives us an instance of the problem and a certificate (sometimes called a witness) to the answer being yes, we can check that it is correct in polynomial time.

Example

Integer factorisation is in NP. This is the problem that given integers n and m, is there an integer f with 1 < f < m, such that f divides n (f is a small factor of n)?

This is a decision problem because the answers are yes or no. If someone hands us an instance of the problem (so they hand us integers n and m) and an integer f with 1 < f < m, and claim that f is a factor of n (the certificate), we can check the answer in polynomial time by performing the division n / f.

NP-Complete

NP-Complete is a complexity class which represents the set of all problems X in NP for which it is possible to reduce any other NP problem Y to X in polynomial time.

Intuitively this means that we can solve Y quickly if we know how to solve X quickly. Precisely, Yis reducible to X, if there is a polynomial time algorithm f to transform instances y of Y to instances x = f(y) of X in polynomial time, with the property that the answer to y is yes, if and only if the answer to f(y) is yes.

Example

3-SAT. This is the problem wherein we are given a conjunction (ANDs) of 3-clause disjunctions (ORs), statements of the form

(x_v11 OR x_v21 OR x_v31) AND 
(x_v12 OR x_v22 OR x_v32) AND 
...                       AND 
(x_v1n OR x_v2n OR x_v3n)

where each x_vij is a boolean variable or the negation of a variable from a finite predefined list (x_1, x_2, ... x_n).

It can be shown that every NP problem can be reduced to 3-SAT. The proof of this is technical and requires use of the technical definition of NP (based on non-deterministic Turing machines). This is known as Cook's theorem.

What makes NP-complete problems important is that if a deterministic polynomial time algorithm can be found to solve one of them, every NP problem is solvable in polynomial time (one problem to rule them all).

NP-hard

Intuitively, these are the problems that are at least as hard as the NP-complete problems. Note that NP-hard problems do not have to be in NP, and they do not have to be decision problems.

The precise definition here is that a problem X is NP-hard, if there is an NP-complete problem Y, such that Y is reducible to X in polynomial time.

But since any NP-complete problem can be reduced to any other NP-complete problem in polynomial time, all NP-complete problems can be reduced to any NP-hard problem in polynomial time. Then, if there is a solution to one NP-hard problem in polynomial time, there is a solution to all NP problems in polynomial time.

Example

The halting problem is an NP-hard problem. This is the problem that given a program P and input I, will it halt? This is a decision problem but it is not in NP. It is clear that any NP-complete problem can be reduced to this one. As another example, any NP-complete problem is NP-hard.

My favorite NP-complete problem is the Minesweeper problem.

P = NP

This one is the most famous problem in computer science, and one of the most important outstanding questions in the mathematical sciences. In fact, the Clay Institute is offering one million dollars for a solution to the problem (Stephen Cook's writeup on the Clay website is quite good).

It's clear that P is a subset of NP. The open question is whether or not NP problems have deterministic polynomial time solutions. It is largely believed that they do not. Here is an outstanding recent article on the latest (and the importance) of the P = NP problem: The Status of the P versus NP problem.

The best book on the subject is Computers and Intractability by Garey and Johnson.

個人對這4個np問題的小總結:

1. p問題只是np問題的一個子類。

2. 所有的np問題都可以歸約為npc問題(這就是為什麼說如果能在解決了npc問題,即在多項式時間內找出npc問題的解,就可以得出np=p。因為在多項式時間內找出npc問題的解,那麼肯定可以在在多項式時間內找出np問題的解,即np=p)。

3. 所有的npc問題之間都可以相互轉換。

4. 所有的npc問題都可以歸約為np-hard問題(這就是為什麼說如果能在解決了np-hard問題,即在多項式時間內找出np-hard問題的解,就可以得出np=p。因為在多項式時間內找出np-hard問題的解,那麼肯定可以在在多項式時間內找出npc問題的解,最後結果就是在在多項式時間內找出np問題的解,即np=p)。

所以實質上np、npc、np-hard只是科學家在為解決np問題上將問題進一步簡化,將很多個np問題用一個npc問題去解決,接著將很多個npc問題用一個np-hard問題去解決。但是我還是有點不太理解npc是np和np-hard的交集這個說法,我承認npc是np裡面的一個子類,也能理解有的問題是as hard as npc but could not prove it in in polynomial time。但這個交集的說法我時而理解時而不理解,也希望有好心人能給我解答一下。這個交集是指這個問題的難度嗎?

經典的npc問題SAT

暫時還沒看,大概是關於圖靈的轉換機,是cook提出並且證實了SAT是第一個npc問題,即可以在polynomial time驗證這個解,但這個問題還沒有被解決。

經典的np-hard問題:停機問題

我滴媽,我真的看了好久這個啊,最終看了好幾個才理解。這個我最終覺得有點像一個問題:到底是有雞先還是有蛋先

首先大家可以先理解一下經典的理髮師問題

預備知識: 理髮師悖論

克里克島的一座小城裡有位理髮師, 有一天他做出一項規定: 他給並且只給那些不給自己理髮的人理髮. 理髮師的這個規定似乎很有道理, 既然有人自己給自己理髮了, 那麼我就不用"多此一舉", 我再給這個人理髮.

最初, 這個規定並沒什麼問題, 後來, 隨著這個理髮師自己的頭髮越來越長, 他發現他陷入了一個兩難的境地: 他該不該給自己理髮?

  • 如果他為自己理髮. 那麼他就成為了他規定中那個"自己給自己理髮的人", 那麼他就不應該為自己理髮;
  • 如果他不為自己理髮, 那麼他不是他規定中那個"自己給自己理髮的人", 那麼他就應該為自己理髮.

綜合以上兩種情況, "他為自己理髮"當且僅當"他不為自己理髮", 這成為了一個悖論.

理髮師悖論在很多領域有重要的應用, 比如羅素利用理髮師悖論發現了集合論的缺陷, 在當時學術界引起了極大震動. 在這裡, 我們要用理髮師悖論分析停機問題.

停機問題:

(個人感想:用程式來理解是最好的,下面這個程式碼的解釋我是參考知乎上面的一個回答,出處在答案的低端,我覺得這個答案是比較簡潔明瞭的)

1.首先定義一個檢測程式

boolean detect(P) //輸入引數為函式P 結果返回是否停機 停機true 否則 false

2.定義一個程式,根據detect返回的結果來決定自身是 無限迴圈 還是 停機

其中 T 為test函式本身

boolean test(T){

if(detect(test(T))){ //檢測是否停機

loop() // 無限迴圈

}else{

return //返回 程式停止

}

}

很顯然,當判定程式 detect(test(T)) 檢測結果為 true時,即停機的時候,test(T)進入 loop 即無限迴圈中,此處存在矛盾。反之,當檢測結果為false時,即沒有停機,test(T) 程式結束,也是有矛盾的。


作者:知乎使用者
連結:https://www.zhihu.com/question/20081359/answer/279950224
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

有點小意思的文章:

(個人感想:為什麼說解決了np-hard這個停機問題,所有的npc問題都能解決了呢?我覺得下面這篇文章也給了大家一個很好的理解方法去理解這4個問題之間。)

文章連結

最後的最後

這個是維基百科的common npc problems,我覺得很有用,大家如果想要證明自己的問題,可以規約為npc