JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

NP:易於檢查,難於求解?

有些問題感覺就像拼圖:要拼完痛苦萬分,但一旦有人把拼好的遞到你面前,檢查卻易如反掌。求解與檢查之間的這道鴻溝,正是計算機科學中最著名的未解問題的種子。

拼圖的那道鴻溝

在上一階梯你學會了誠實地衡量執行時間——把機器的步數當成輸入大小 n 的函數來計數,取最壞情況,把常數抹平——並把那條頭條界線畫在多項式時間處。P 類恰恰收集了確定型機器能在多項式時間內判定的那些是/否問題,是我們對「可有效求解」的實用代稱。這篇要在那張地圖上開闢一個新區域,而它從一種人人早已熟悉的感受出發:動手做一道難題,與檢查一道做好的題,這兩者之間的差別。

想像一桌倒出來的一千片拼圖。拼湊它是一場漫長而令人挫折的搜尋:你試一塊,退回,再試。但如果一位朋友走進來,手上的拼圖已經拼好,並宣稱它是對的,檢查這個宣稱卻很快——你的目光掃過整幅畫面,確認每一條邊都對齊。求解感覺是指數級的;檢查感覺幾乎免費。這種不對稱並非拼圖獨有。一道數獨要填出來要人命,要驗證卻在一瞬間。一座迷宮要走出來很折磨人,但一旦把路徑畫出,瞄一眼就能確認。這一階梯的整個主題,就是這一類問題:一個解一旦遞到你面前,驗證起來很便宜——即使找出一個解看似得靠殘暴的搜尋。

把「易於檢查」講精確:驗證器

要把那種感受變成數學,我們得釘死「易於檢查」是什麼意思。關鍵的物件是一個驗證器:它不是一台求解問題的機器,而是一台評分某個提議答案的機器。除了輸入之外,驗證器還會拿到一段簡短的提示——一份憑證(也叫見證或證明)——而它唯一的工作,就是確認那段提示是否真的證明了「是」這個答案。拼好的拼圖、填滿的數獨格、畫出的迷宮路徑:每一個都是一份憑證。驗證器不搜尋;它只是檢查別人送給它的那份禮物。

兩個條件讓一個驗證器誠實。第一是完備性:若真正的答案是「是」,則存在某份憑證能讓驗證器接受。第二是健全性:若真正的答案是「否」,則沒有任何憑證——再怎麼狡猾——能騙它接受。而關鍵在於,驗證器必須在輸入大小的多項式時間內執行——檢查是便宜的那部分。一個問題恰好落在 NP 類中,正是當它擁有這樣一個多項式時間的驗證器,搭配一份多項式長度的憑證時。這就是整個定義:NP 是那些「是」答案都附帶一份簡短、可快速檢查的證明的是/否問題所成的集合。

一個乾淨的例子是可滿足性(SAT)。輸入是一個布林公式,例如 (x OR NOT y) AND (y OR z) AND (NOT x OR NOT z);問題是:是否存在某種對變數的真/假指派,使整個公式為真。在 2^n 種可能裡找出這樣一種指派,看起來像在指數級的乾草堆裡搜尋。但把一個候選指派遞給我——比如 x=真、y=假、z=真——我代入後一條子句接一條子句地求值,片刻便完成。那個指派就是憑證;那個代入並求值的過程就是多項式時間的驗證器。SAT 在 NP 中。再次留意那種不對稱:我只替「是」的方向背書。一份憑證能證明一個「是」;它對證明一個「否」毫無幫助。

Is this 3-coloring valid?   (a graph-coloring CERTIFICATE)

  graph:  vertices {1,2,3,4}   edges  1-2  2-3  3-4  4-1  1-3
  claim (the certificate):    1=Red  2=Green  3=Blue  4=Green

  VERIFIER walks each edge, checks the two ends differ:
     1-2  Red  vs Green   ok
     2-3  Green vs Blue    ok
     3-4  Blue  vs Green   ok
     4-1  Green vs Red     ok
     1-3  Red  vs Blue     ok       -> ACCEPT

  5 edge-checks: time grows with the input, not 2^n.
  Finding a coloring is hard; checking one is a quick walk.
驗證器從不搜尋——它只是讀取憑證並加以確認。這裡它走過圖的每一條邊,檢查沒有任何邊連接兩個同色的頂點。檢查很便宜;找出一種著色才是難的部分。

從另一扇門進入同一個類:非確定性

定義 NP 還有第二種等價的方式,而它解釋了字母 N 的來歷。回想前面階梯裡的非確定型機器——那台 NFA,面對一個選擇時,在概念上把自己複製出來同時探索每一條分支,只要任一分支接受就接受。把這個想法從有限自動機提升到非確定型圖靈機,並限定它在多項式時間內執行。NP 恰恰就是這樣一台機器所判定的問題類。這台機器靠著朝每一種可能分裂出去來「猜」一份憑證,然後用一次多項式的檢查加以確認——正是你最初在 NFA 那裡遇見的猜測並驗證模式,如今放大到了整個計算。

這兩扇門——帶著憑證的驗證器,與那台會猜測的非確定型機器——通往的是同一個房間。那個猜測就是憑證;那次多項式的檢查就是驗證器。本階梯的第二篇會仔細走過這兩個定義並證明它們重合;現在只要握住這幅圖像:NP 就是那些你能在多項式時間內「先猜後查」其答案的拼圖。從自動機那幾階誠實地帶過來的兩個提醒在這裡同樣適用。非確定性是一種數學裝置,不是一台實體機器:沒有任何真實電腦會把自己複製出來,分支也不是隨機的好運。而且正如 NFA 並不比 DFA 更強大(它只換來了簡潔),這裡的非確定型機器也是一種定義上的方便——它是否真的比確定型機器更快,恰恰就是我們正繞向的那個未解問題。

把一道拼圖翻譯成另一道:歸約

NP 是一個浩大的集合——圖著色、旅行推銷員的路線、塞滿背包、安排考試。令人震驚的發現是,在深處,這當中極大量的問題其實是同一個問題換了戲服。揭露這件事的工具是多項式時間歸約,是你早已用來證明不可判定性的那種歸約的一種精修版。把它想成一位翻譯:一套快速、機械化的程序,把問題 A 的每一個實例改寫成問題 B 的一個實例,使得是/否答案被保留。如果你擁有一台 B 的快速求解器,這位翻譯就會立刻給你一台 A 的快速求解器:翻譯、解 B、回報答案。

歸約的讀法,正是初學者最常讀反的部分,所以大聲說出來:若 A 歸約到 B(寫作 A <=p B),則 B 至少和 A 一樣難。那次翻譯把 A 的難度載了 B。所以一次歸約只在恰好一個方向上證明難度——讀反了就什麼也沒證明。嚐一小口:要把 3-SAT 歸約到團問題,就建一個圖,每個「子句中的一個文字」對應一個頂點,並在兩個頂點位於不同子句且彼此不矛盾時,用一條邊把它們連起來。那麼這個公式可滿足,若且唯若那個圖有一個大小為 k 的團(每個子句各貢獻一個頂點)。一個可滿足的指派變成一個團;一個團變回一個可滿足的指派。第三篇會把這個小裝置一塊一塊地搭起來;現在的重點是:這座橋是可建造的,而且很快。

NP 中最難的問題,與那個百萬美元的問題

歸約讓我們能依難度替問題排序,而那個排序有一座頂峰。一個問題若每一個 NP 中的問題都歸約到它,它就是 NP 難——它至少和 NP 中任何東西一樣難。一個既是 NP 難本身是 NP 成員的問題,就是 NP 完全:NP 之內最難的那一類問題,一道所有其他問題都能被翻譯進去的單一拼圖。里程碑式的 Cook-Levin 定理點燃了引信,它證明了第一個:SAT 是 NP 完全的。一旦你有了一個 NP 完全問題,再多就便宜了——把 SAT 歸約到你的問題,它就入會。那著名的名單正是這樣長出來的:3-SAT、頂點覆蓋漢米爾頓路徑旅行推銷員子集和圖著色。第四與第五篇會證明 Cook-Levin 並巡覽這座動物園。

現在整幅圖像就圍繞著一個問題清晰地對上焦了。我們知道 P 在 NP 之內。我們知道數以千計的自然 NP 完全問題,全被歸約緊緊地串在一起,緊到只要任何一個有了快速演算法,就會為它們全部帶來快速演算法——並會證明 P = NP。然而努力了半個世紀,沒有人找到這樣的演算法,也沒有人證明這樣的演算法不可能存在。P 是否等於 NP 仍未解——這是克雷研究所的百萬美元問題之一,可說是計算機科學中最深刻的未解問題。多數研究者猜想 P 不等於 NP(也就是檢查確實比求解容易),但猜想不是證明。