NP問題

介紹

相信大部分人在閱讀論文或者求解問題過程中都會看到,這不就是NP問題之類的話。然後便去google什麼是NP問題,之後仍是一頭霧水,本人最開始也深受困擾,之後決心搞懂這類問題的真正含義,經過一番探究之後,纔不由感慨數學的精妙。在這裏感謝 Matrix67 這位博主,能夠將這麼複雜的問題解釋的如此條理清晰與明確,學習之後深受啓發!本文主要目的更多爲進行的知識整理和鞏固,方便日後複習。

時間複雜度的概念

在進行NP問題介紹之前,先對時間複雜度這個概念進行概括

時間複雜度是指執行算法所需要的計算工作量,即當問題規模擴大後,程序需要的時間長度增長得有多快。
也就是說,對於高速處理數據的計算機來說,處理某一個特定數據的效率不能衡量一個程序的好壞,而應該看當這個數據的規模變大到數百倍後,程序運行時間是否還是一樣,或者也跟着慢了數百倍,或者變慢了數萬倍。

不管數據有多大,程序處理花的時間始終是那麼多的,我們就說這個程序很好,具有O(1)的時間複雜度,也稱常數級複雜度;
數據規模變得有多大,花的時間也跟着變得有多長,這個程序的時間複雜度就是O(n),比如找n個數中的最大值;
而像冒泡排序、插入排序等,數據擴大2倍,時間變慢4倍的,屬於O(n^2)的複雜度。
還有一些窮舉類的算法,所需時間長度成幾何階數上漲,這就是O(a^n)的指數級複雜度,甚至O(n!)的階乘級複雜度。

容易看出,幾類複雜度被分爲兩種級別:

  1. 一種是O(1),O(log(n)),O(n^a)等,我們把它叫做 多項式級的複雜度,因爲它的規模n出現在底數的位置;
  2. 另一種是O(a^n)和O(n!)型複雜度,它是非多項式級的複雜度,其複雜度計算機往往不能承受。

當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的複雜度,非多項式級的複雜度需要的時間太多,往往會超時,除非是數據規模非常小。

問題:會不會所有的問題都可以找到複雜度爲多項式級的算法呢?
NO!
如問題:輸出從1到n這n個數的全排列。
無論你如何輸出,輸出的複雜度都是n!
當然,有人說,這樣的“問題”不是一個“正規”的問題,正規的問題是讓程序解決一個問題,輸出一個“YES”或“NO”(這被稱爲判定性問題),或者一個什麼什麼的最優值(這被稱爲最優化問題)。

如Hamilton迴路 問題:

給你一個圖,問你能否找到一條經過每個頂點一次且恰好一次(不遺漏也不重複)最後又走回來的路(滿足這個條件的路徑叫做Hamilton迴路)。
這個問題現在還沒有找到多項式級的算法。

P問題

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

NP問題

NP並不意味着非P類問題

NP問題是指這樣一類問題:在多項式的時間裏求一個解很難,但在多項式的時間裏驗證一個解很容易。
即,在一個題中,找一個解很困難,但驗證一個解很容易。
當然也有不是NP問題的問題,即你猜到了解但是沒用,因爲你不能在多項式的時間裏去驗證它。

下面我要舉的例子是一個經典的例子,它指出了一個目前還沒有辦法在多項式的時間裏驗證一個解的問題。很顯然,前面所說的Hamilton迴路是NP問題,因爲驗證一條路是否恰好經過了每一個頂點非常容易。但我要把問題換成這樣:試問一個圖中是否不存在Hamilton迴路。這樣問題就沒法在多項式的時間裏進行驗證了,因爲除非你試過所有的路,否則你不敢斷定它“沒有Hamilton迴路”。

很顯然,所有的P類問題都是NP問題。也就是說,能多項式地解決一個問題,必然能多項式地驗證一個問題的解——既然正解都出來了,驗證任意給定的解也只需要比較一下就可以了。關鍵是,人們想知道,是否所有的NP問題都是P類問題。即P=NP?

NP-完全問題

首先介紹 約化 的概念:一個問題A可以約化爲問題B的含義即是,可以用問題B的解法解決問題A

比如說,現在有兩個問題:求解一個一元一次方程和求解一個一元二次方程。那麼我們說,前者可以約化爲後者,意即知道如何解一個一元二次方程那麼一定能解出一元一次方程。
這個規則即是:兩個方程的對應項係數不變,一元二次方程的二次項係數爲0。按照這個規則把前一個問題轉換成後一個問題,兩個問題就等價了。

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

從約化的定義中我們看到,一個問題約化爲另一個問題,時間複雜度增加了,問題的應用範圍也增大了。通過對某些問題的不斷約化,我們能夠不斷尋找複雜度更高,但應用範圍更廣的算法來代替複雜度雖然低,但只能用於很小的一類問題的算法。

再回想前面講的P和NP問題,聯想起約化的傳遞性,自然地,我們會想問,如果不斷地約化上去,不斷找到能“通吃”若干小NP問題的一個稍複雜的大NP問題,那麼最後是否有可能找到一個時間複雜度最高,並且能“通吃”所有的 NP問題的這樣一個超級NP問題? 答案當然是肯定的。

換句話說,只要解決了這個問題,那麼所有的NP問題都解決了。這種問題的存在難以置信,並且更加不可思議的是,這種問題不只一個,它有很多個,它是一類問題。這一類問題就是傳說中的NPC 問題,也就是NP-完全問題。

NPC問題的出現使整個NP問題的研究得到了飛躍式的發展。我們有理由相信,NPC問題是最複雜的問題。

NPC問題的定義非常簡單。同時滿足下面兩個條件的問題就是NPC問題。
首先,它得是一個NP問題; 然後,所有的NP問題都可以約化到它

證明一個問題是 NPC問題也很簡單。先證明它至少是一個NP問題,再證明其中一個已知的NPC問題能約化到它

現在被證明是NPC問題的有很多,任何一個找到了多項式算法的話所有的NP問題都可以完美解決了。因此說,正是因爲NPC問題的存在,P=NP變得難以置信。

NP-Hard問題

順便講一下 NP-Hard問題
NP-Hard問題是這樣一種問題,它滿足NPC問題定義的第二條 所有的NP問題都可以約化到它 ,但不一定要滿足第一條(就是說,NP-Hard問題要比 NPC問題的範圍廣)。
NP-Hard問題同樣難以找到多項式的算法,但它不一定是NP問題。即使NPC問題發現了多項式級的算法,NP-Hard問題有可能仍然無法得到多項式級的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章