P/NP 問題、NPC問題、停機問題、N皇后問題

閱讀時間約 10 分鐘

並不是所有問題都能透過程式來解決。在計算機理論(英語:Theory of computation)中,數學家們對各種問題進行分類,其中有許多被定義為非常難解的問題。在程式設計的世界裡,我們有各式各樣的演算法用來解決不同的問題,這些問題也可以根據它們的難度來分類。

本篇文章會帶你了解 P/NP 問題,這是計算理論中非常重要的一個主題。學習了這些概念後,當你聽到工程師們討論「P 問題」或「NP 問題」時,你就能跟上他們的思路,甚至加入討論了!


溫故知新:

演算法 | Big O 複雜度| Pseudocode 偽代碼

相關電影推薦:《模仿遊戲》(英語:The Imitation Game)


在程式設計中,有些問題必須採用「土法煉鋼」的方式來解決,也就是要一一嘗試每個可能性,直到找到正確答案。這樣的方法雖然能解決問題,但通常效率非常低,特別是當可能性很多時。

回溯法(Backtracking)

比土法煉鋼更有效的一種方法是回溯法(Backtracking)。回溯法的策略是列出所有可能性,但只要計算到某個路徑的結果已經確定不可行,就立即「回溯」並停止探索該路徑,轉而嘗試其他可能。這樣可以避免不必要的計算,節省大量時間。經典的回溯法例子就是 N 皇后問題

N-Queens ( N 皇后問題)(Leetcode 51.)

如果有在 Leetcode 上刷題的朋友應該會對這題有印象。

我們先縮小範圍,用 4 乘 4 的棋盤來看。西洋旗的規則中,若要讓兩皇后無法吃掉彼此,則一皇后不能在另一皇后縱向、橫向或對角線。本次的挑戰是把 Q1~ Q4 四個皇后中,並符合西洋棋的規則。

以下圖來說,Q1 是皇后,則另一皇后必不可在打叉的方格子,只有空格可以放。

  1. 先放在 [0,0] 的位置
  2. 再來往第二列 (row 2) 找適合可以擺第二個皇后 Q2 的位置。

(圖片來源:geeksforgeeks)

raw-image
擺放 Q2。看來 Q3 不能再擺了,因為前後橫向、縱向、對角線都會碰到其他皇后。

擺放 Q2。看來 Q3 不能再擺了,因為前後橫向、縱向、對角線都會碰到其他皇后。

  1. 倒帶回去重新放 Q2 的位置,並放在 [1,3]
raw-image

4.看起來可行,繼續往下放 Q3,但 Q4 也沒辦法放。

raw-image
  1. 所以重新調整 Q1 的位置,再填上 Q2。其實應該要先填 [1,0] 這個位置,不過這個也行不通,所以填 [3,1],後續依序填上 Q3 和 Q4。
raw-image
raw-image
raw-image

在介紹 P 問題之前,我們先來了解圖靈機

圖靈機(Turing Machine) 是一個能進行計算的理論模型,可以被視為現代電腦的雛形。它模擬了運算過程中的基本步驟,因此在計算理論中扮演著重要的角色。

DTM(Deterministic Turing Machine,決定性圖靈機)

DTM 的特色在於「下一步只有一種可能」。也就是說,每當圖靈機執行到某個狀態時,它只能按照一個明確的規則來決定下一個動作。現代的電腦就是屬於這種類型,因為它們的運算是決定性的。

決定性(deterministic) 的意思就是「結果是確定的」,就像你按下按鈕,電腦就會確定進行下一步操作。

NTM(Non-deterministic Turing Machine,非決定性圖靈機)

NTM 則有點特別,它的「下一步可以有多種可能性」。換句話說,它可以同時運算多個選擇,就像是在平行宇宙中同時進行多個運算。這並不是現實中的電腦能做到的,但在理論上,我們會用 NTM 來描述一些複雜問題的解法。

舉個簡單的例子:

假設我想飛到越南,面前有三個航班:BR-396、AJ-381、TK1888,但我沒有機票資訊,不知道哪一班飛越南。如果是 DTM 的情境,我只能一班班搭去試,直到找到正確的航班;這就像我一步一步按照確定的順序操作。而 NTM 的情境則像是我有分身,能同時搭上三個航班,瞬間知道哪一班飛越南,或者我超級會猜,直接猜中正確的班機。這就是 NTM 能同時探索多種可能性的特點。


P 問題和 NP 問題

在介紹 P 問題和 NP 問題之前,先了解它們與運算時間複雜度有關。

演算法 | Big O 複雜度| Pseudocode 偽代碼

P 問題(Polynomial Time Problem,多項式時間問題)

P 問題指的是那些能在多項式時間內解決的問題。簡單來說,時間複雜度用 n 來表示輸入的大小,而 P 問題的時間複雜度像是 O(n²)、O(n·log n)、O(n)、O(1) 這樣的形式,n 在底數,這表示隨著輸入的增大,運算時間增加得比較「溫和」,不會成倍爆炸。

這類問題是計算速度較快且可行的。換句話說,我們可以在合理的時間內找到解。

NP 問題(Non-deterministic Polynomial Time Problem,非決定性多項式時間問題)

NP 問題則是在 DTM 中需要用超多項式時間解的問題,n會在指數,例如O(2ⁿ)、O(nⁿ)理論上可以用 NTM 來解決的問題,但時間複雜度比 P 問題高很多。這類問題的解法通常被形容為「土法煉鋼」,因為解決這些問題需要非常多的嘗試。

白話文來說,NP 問題就是那些解起來超難、時間超長的問題。經典的例子之一就是「八皇后問題」,你得一個一個位置嘗試,直到找到所有皇后都不互相攻擊的位置。

raw-image


NP 完全(NP-Complete, NPC)

NP 完全問題(NPC) 是 NP 類別中最難的一群問題。這類問題有一個特性,就是 NP 中的其他問題都可以「化約(reduce)」成 NPC 問題。換句話說,如果你能夠解決某個 NPC 問題,代表你可以解決 NP 中的所有問題。

更具體的說明

假設我們有兩個問題:A 問題 和 A+ 問題。其中,A+ 問題比 A 問題更難(時間複雜度高)。如果你能把 A 問題「化約」成 A+ 問題,那麼你就能用解 A+ 問題的方法來解決 A 問題。但反過來,更難的問題 A+ 不能被降級成 A 問題,也就是說,解決更難的問題並不會直接幫助你解決比較簡單的問題。

總結一下,如果你能解決 NP 完全問題(A+),那麼你一定能解決 NP 問題(A)。一旦找到能有效解決 NPC 問題的演算法,那麼 NP 中的所有問題都能被高效解決!

raw-image



是否存在更高效率的演算法,可使確定型圖靈機以多項式時間求 NP 問題的解?

這個是千禧年大獎難題之一,到 2024 都還沒有人證明的出來,依然是懸案。

有兩種可能:

  1. 用 DTM (目前電腦)解 NP 問題只能用暴力法,更有效率的演算法並不存在,所以P≠NP。
  2. 用 DTM 處理 NP 問題的更高效率演算法其實存在,只是目前還沒被找到, 所以P=NP。

「沒找到」並不等於「不存在」,如果能夠證明 P=NP,就代表人類有一天一定可以找到更高效率的演算法處理 N皇后的問題。

停機問題(Halting Problem)

有一個著名的大獎難題,被證明為「不可能」由電腦解決,那就是停機問題

停機問題的定義

問題是這樣的:

有沒有一個程式,可以判斷輸入的程式碼是會一直運行下去,還是最終會停止(中止)?

答案是:沒有

我一開始對於這個問題感到困惑,有什麼好問的?但其實這是個深奧的問題。數學家艾倫·圖靈(Alan Turing)早在 1936 年就證明了這個問題無法被解決,這個理論限制了電腦能夠解決的問題範圍。

假設有一個能解決停機問題的程式

假設有個神奇的程式,叫 opposite(相反),這個程式可以檢測其他程式是否會停止。如果 opposite 偵測到輸入的程式會停止,它就回傳「中止」;如果它偵測到程式會無限運行,它就回傳「持續運行」(running)。

聽起來還不錯?但接下來,我們要進一步思考:如果我們把 opposite 程式自己當作輸入,會發生什麼?

矛盾產生

現在,假設我們把 opposite 程式自己輸入給自己,也就是把「判斷程式」拿來判斷自己。會發生什麼情況呢?

  1. 如果 opposite 判斷自己會停止,根據它的設計,它應該回傳「持續運行」——這和它本來應該回傳的「停止」相矛盾。
  2. 如果 opposite 判斷自己會無限運行,它應該回傳「中止」,但這又和它的檢測結果(持續運行)矛盾。

這樣就形成了邏輯上的悖論,也就是說,這個程式無法正確地判斷自己會不會停下來。

結論

因此,無論這個程式多麼聰明,當你問它關於它自己的運行狀況時,它都會陷入邏輯矛盾,無法正確回答。這就是圖靈所證明的停機問題的核心:對於所有可能的程式,我們無法設計出一個可以總是正確判斷它們是否會停下來的程式

推薦參考以下這兩個影片會更容易了解:

The Halting Problem: The Unsolvable Problem

Understanding the Halting Problem



留言0
查看全部
發表第一個留言支持創作者!
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
上回提到,演算法是一種解決問題的方法。光是簡單的將數字有小排到大就有很多種不同的排序演算法可以選擇。這次,我們來介紹幾個常見的排序演算法,看看它們是怎麼運作的。
演算法是一種解決問題的虛擬邏輯,他不像 C 語言有直接的程式碼,而是一種虛擬的問題解決方式。 想像一下,今天要在字典裡面找到 Zoo,有幾種方法: 逐頁查找:如果字典有 1000 頁,最糟情況下需要翻 1000 次 才能找到。 兩頁兩頁找:這樣的話,1000 頁最多要翻 500 次。 二分查
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
程式並不是寫完就可以自動運行,還需要經過「編譯」的階段。此篇文章會介紹編譯的四個階段,更貼近電腦科學。另外,也說明「陣列」的資料儲存模式跟實際的運用,提供優化程式的建議,最後再分享三個除錯的技巧。
本文深入探討程式設計中的迴圈概念,介紹三種常見的迴圈使用方式:for、while 和 do...while。透過實例如計算 1 到 100 的總和以及九九乘法表,讓讀者能夠理解這些迴圈的應用場景及其運作邏輯。文章強調掌握迴圈及函數的重要性,並提供了避免常見錯誤的提示,非常適合初學者。
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
上回提到,演算法是一種解決問題的方法。光是簡單的將數字有小排到大就有很多種不同的排序演算法可以選擇。這次,我們來介紹幾個常見的排序演算法,看看它們是怎麼運作的。
演算法是一種解決問題的虛擬邏輯,他不像 C 語言有直接的程式碼,而是一種虛擬的問題解決方式。 想像一下,今天要在字典裡面找到 Zoo,有幾種方法: 逐頁查找:如果字典有 1000 頁,最糟情況下需要翻 1000 次 才能找到。 兩頁兩頁找:這樣的話,1000 頁最多要翻 500 次。 二分查
在上一篇文章中,我們介紹了「陣列」的基本使用方式。本篇將帶你深入探討 C 語言中字串的運作原理,了解如何以陣列形式儲存字串。此外,我們還會介紹如何將英文字母透過 ASCII 表轉換成數值,並說明其在電腦中的實際應用。最後,解析 Command Line Argument(命令列參數)的使用方法。
程式並不是寫完就可以自動運行,還需要經過「編譯」的階段。此篇文章會介紹編譯的四個階段,更貼近電腦科學。另外,也說明「陣列」的資料儲存模式跟實際的運用,提供優化程式的建議,最後再分享三個除錯的技巧。
本文深入探討程式設計中的迴圈概念,介紹三種常見的迴圈使用方式:for、while 和 do...while。透過實例如計算 1 到 100 的總和以及九九乘法表,讓讀者能夠理解這些迴圈的應用場景及其運作邏輯。文章強調掌握迴圈及函數的重要性,並提供了避免常見錯誤的提示,非常適合初學者。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
如果是來自比較數學與理論的學科, 尤其研究對象是人群的學科, 幾乎不可能自己重做一次實驗, 看看這些數學理論「是不是實際上好用」。 我那時候就體會到, 數學只是一種空中樓閣, 我們還需要有具體的實驗數據, 來把數學與世界接地。 而什麼領域既能有數學理論,
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 一 上節是對語構範疇理論的簡介。 1922年,列希涅夫斯基提出了語構範疇概念,以此取代人工化的型論,並引入到他的三個形式系統中66,以圖避免羅素悖論及其它集論悖論的出現。 艾杜
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 一 函數概念的發展不可能終結,踏入公元廿一世紀,數學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 三 1755年,歐拉改變了主意,在《微分學原理》(Institutiones calculi differen
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  三 有些讀者大概都知道,微積分學有兩個分科﹕一為微分學 (differential calculus),一為積分學 (integ
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  二 前面說過,牛頓關心的不是抽象的數學問題,他要解決的是天體運動的問題。他知道,假如他擁有該天體在任何一刻的瞬速數據,他便能夠從質量
Thumbnail
《底層邏輯》在【超閱讀觀點83】有介紹過,西恩之所以要把《底層邏輯2》再隔兩本介紹,主要原因在於,這本書是以許多人聞之色變的「數學」出發,把我們會遇到的「現象」用數學解釋,所以基本上,相較於《底層邏輯》的高易讀性,《底層邏輯2》顯然沒辦法讀那麼快,且更需要思考,不過能得到的收穫也更多。 《底層邏輯
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
如果是來自比較數學與理論的學科, 尤其研究對象是人群的學科, 幾乎不可能自己重做一次實驗, 看看這些數學理論「是不是實際上好用」。 我那時候就體會到, 數學只是一種空中樓閣, 我們還需要有具體的實驗數據, 來把數學與世界接地。 而什麼領域既能有數學理論,
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 一 上節是對語構範疇理論的簡介。 1922年,列希涅夫斯基提出了語構範疇概念,以此取代人工化的型論,並引入到他的三個形式系統中66,以圖避免羅素悖論及其它集論悖論的出現。 艾杜
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 一 函數概念的發展不可能終結,踏入公元廿一世紀,數學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 三 1755年,歐拉改變了主意,在《微分學原理》(Institutiones calculi differen
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  三 有些讀者大概都知道,微積分學有兩個分科﹕一為微分學 (differential calculus),一為積分學 (integ
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  二 前面說過,牛頓關心的不是抽象的數學問題,他要解決的是天體運動的問題。他知道,假如他擁有該天體在任何一刻的瞬速數據,他便能夠從質量
Thumbnail
《底層邏輯》在【超閱讀觀點83】有介紹過,西恩之所以要把《底層邏輯2》再隔兩本介紹,主要原因在於,這本書是以許多人聞之色變的「數學」出發,把我們會遇到的「現象」用數學解釋,所以基本上,相較於《底層邏輯》的高易讀性,《底層邏輯2》顯然沒辦法讀那麼快,且更需要思考,不過能得到的收穫也更多。 《底層邏輯