簡介
計算複雜性理論(Computational complexity theory)是計算理論的一部分,研究計算問題時所需的資源,比如時間和空間,以及如何儘可能的節省這些資源。
計算複雜性理論所研究的資源中最常見的是時間(要通過多少步才能解決問題)和空間(在解決問題時需要多少記憶體)。其他資源亦可考慮,例如在並行計算中,需要多少並行處理器才能解決問題。
時間複雜度是指在計算機科學與工程領域完成一個算法所需要的時間,是衡量一個算法優劣的重要參數。時間複雜度越小,說明該算法效率越高,則該算法越有價值。
空間複雜度是指計算機科學領域完成一個算法所需要占用的存儲空間,一般是輸入參數的函式。它是算法優劣的重要度量指標,一般來說,空間複雜度越小,算法越好。我們假設有一個圖靈機來解決某一類語言的某一問題,設有X個字(word)屬於這個問題,把X放入這個圖靈機的輸入端,這個圖靈機為解決此問題所需要的工作帶格子數總和稱為 空間。
複雜度理論和可計算性理論不同,可計算性理論的重心在於問題能否解決,不管需要多少資源。而複雜性理論作為計算理論的分支,某種程度上被認為和算法理論是一種“矛”與“盾”的關係,即算法理論專注於設計有效的算法,而複雜性理論專注於理解為什麼對於某類問題,不存在有效的算法。
歷史
在20世紀50年代,Trahtenbrot和Rabin的論文被認為是該領域最早的文獻。而一般說來,被公認為奠定了計算複雜性領域基礎的是Hartmanis和Stearns的1960年代的論文On the computational complexity of algorithms。在這篇論文中,作者引入了時間複雜性類TIME(f(n))的概念,並利用對角線法證明了時間層級定理(Time Hierarchy Theorem)。
在此之後,許多研究者對複雜性理論作出了貢獻。期間重要的發現包括:對隨機算法的去隨機化(derandomization)的研究,對近似算法的不可近似性(hardness of approximation)的研究,以及互動式證明系統(Interactive proof system)理論和零知識證明(Zero-knowledge proof)等。特別的複雜性理論對近代密碼學的影響非常顯著,而最近,複雜性理論的研究者又進入了博弈論領域,並創立了“算法博弈論”(algorithmic game theory)這一分支。
基本概念和工具
計算模型與計算資源
計算複雜性理論的研究對象是算法在執行時所需的計算資源,而為了討論這一點,我們必須假設算法是在某個計算模型上運行的。常討論的計算模型包括圖靈機(Turing machine)和電路(circuit),它們分別是一致性(uniform)和非一致性(non-uniform)計算模型的代表。而計算資源與計算模型是相關的,如對圖靈機我們一般討論的是時間、空間和隨機源,而對電路我們一般討論電路的大小。
由邱奇-圖靈論題(Church-Turing thesis),所有的一致的計算模型與圖靈機在多項式時間意義下是等價的。而由於我們一般將多項式時間作為有效算法的標誌,該論題使得我們可以僅僅關注圖靈機而忽略其它的計算模型。
判定型問題和可計算性
我們考慮對一個算法問題,什麼樣的回答是我們所需要的。比如搜尋問題:給定數組A,和一個數s,我們要問s在不在A中(判定性問題,decision problem)。而進一步的,s如果在A中的話,s的位置是什麼(搜尋型問題,search problem)。再比如完美匹配問題(perfect matching):給定一個二分圖G=(V,E),我們問是不是存在邊集E,使得二分圖中每個結點恰好屬於該邊集的一條邊(判定型問題)。而進一步的,E存在的話,E具體是什麼(搜尋型問題)。
自然的,我們會發現對於一般的算法問題A,我們都可以這樣來問:首先,解是不是存在的?其次,如果解存在,這個解具體是什麼?這就是A的判定型問題和A的搜尋型問題(又稱函式型問題)區分來源的直觀解釋。對判定型問題的回答只需是“是”或“否”,而對搜尋型問題,需要返回解的具體形式或者“解不存在”。所以一個對A的搜尋型問題的算法自然的也是對A的判定型問題的算法。反之,給定了一個A的判定型問題的算法,是否存在A的搜尋型問題的算法,在可計算性理論和計算複雜性理論中有著不同的回答,這也是理解計算複雜性理論與它的前身可計算性理論不同的一個基本的觀察。
在可計算性理論中,可以說明,判定型問題和搜尋型問題在可計算性的意義下是等價的(見Decision problem)。而在計算複雜性中,Khuller和Vazirani在1990年代證明了在P≠NP的假設下,平面圖4-著色問題的判定型問題是在P中的,而尋找其字典序第一的著色是NP難的。
所以在可計算性理論中,只關注判定型問題是合理的。在計算複雜性理論中,雖然一些基本的複雜性類(如P,NP和PSPACE),以及一些基本的問題(P和NP關係問題等)是用判定型問題來定義的,但函式型問題複雜性類也被定義(如FP,FNP等),而且一些特別的函式型問題複雜性類,如TFNP,也正在逐漸受到關注。
算法分析
上面提到計算複雜性理論的研究對象是執行一項計算任務所用的資源,特別的,時間和空間是最重要的兩項資源。
我們用時間作例子來討論算法分析的一些基礎知識。如果將輸入的長度(設為n)作為變數,而我們關注的是算法運行時間關於n的函式關係T(n)。因為一個算法在不同的計算模型上實現時T(n)可能會有常數因子的差別(參見可計算性理論),我們使用大O表達式來表示T(n),這使得我們可以忽略在不同計算模型上實現的常數因子。
以搜尋這個計算任務為例。在搜尋問題中,給定了一個具體的數s,和長度為n的數組A(數組中數的位置用1到n作標記),任務是當s在A中時,找到s的位置,而s不在A中時,需要報告"未找到"。這時輸入的長度即為n+1。下面的過程即是一個最簡單的算法:我們依次掃過A中的每個數,並與s進行比較,如果相等即返回當前的位置,如果掃遍所有的數而算法仍未停止,則返回"未找到"。
如果我們假設s在A中每個位置都是等可能的,那么算法在找到s的條件下需要1/n (1+2+...+n)=n(n+1)/2n=(n+1)/2的時間。如果s不在A中,那么需要(n+1)的時間。由大O表達式的知識我們知道算法所需的時間即為O(n)。
而如果我們進一步假設A是已排序的,那么我們有二分查找算法,使得算法的運行時間是O(logn)。可以看出執行一項計算任務,不同的算法在運行時間上是有很大差異的。
複雜性類
將計算問題按照在不同計算模型下所需資源的不同予以分類,從而得到一個對算法問題“難度”的類別,就是複雜性理論中複雜性類概念的來源。例如一個問題如果在確定性圖靈機上所需時間不會超過一個確定的多項式(以輸入的長度為多項式的不定元),那么我們稱這類問題的集合為P(polynomial time Turing machine)。而將前述定義中的“確定性圖靈機”改為“不確定性圖靈機”,那么所得到的問題集合為NP(non-deteministic polynomial time Turing machine)。類似的,設n為輸入的長度,那我們可以定義“在確定性圖靈機上所需空間不超O(logn)的算法問題的集合”(即為L),“存在深度為O(logn),輸入的度(fan-in)為O(1)的電路族(circuit family)的算法問題的集合”(即為NC)等等複雜性類。
定義複雜性類問題的目的是為了將所有的算法問題進行分類,以確定當前算法的難度,和可能的前進方向。這是複雜性理論的一個主線之一:對算法問題進行抽象和分類。例如通過大O表達式,我們可以對忽略因計算模型不同而引入的常數因子。而第二個重要的理論假設,就是將多項式時間作為有效算法的標誌(與之對應的是指數時間)。這樣,複雜性類使得我們可以忽略多項式階的不同而專注於多項式時間和指數時間的差別。(對多項式時間作為有效算法的標誌這一點是有一定爭議的,比如,如果算法的運行時間n,那它也可以看作是緩慢的,見理論與實踐。)在本文的其餘章節,“有效算法”等價於“多項式算法”
歸約
歸約(reduction)是將不同算法問題建立聯繫的主要的技術手段,並且在某種程度上,定義了算法問題的相對難度。簡單來說,假設我們有算法任務A和B,如果我們想說“A比B簡單”(記為A≤B),它應該是什麼意思呢?從歸約的觀點來看,就是說如果我們有了B的有效算法M,那么我們有一個有效算法N,它可以引用M,最終它要解決A問題。
我們以點集覆蓋問題(vertex cover)和獨立集問題(independent set)為例來進行說明。這兩個問題都是圖論中的問題。假設給定了無向圖G=(V, E),和一個自然數k,點集覆蓋問題是要找到V的子集S,使得對∀e∈E,有s∈ S,使得s∈ e,且|S|≤k;而獨立集問題也是要找V的子集S,要求是∀s1, s2∈S,(s1, s2)∉ E,且|S|≤k。
一個簡單的觀察即是:對G=(V, E),一個S⊂V是覆蓋點集,若且唯若S在G的補圖中是獨立點集(而且保持集合大小)。利用這個觀察,假設我們有了解決覆蓋點集問題的算法M,我們設計解決獨立點集的算法N如下:
算法N。輸入:給定無向圖G=(V, E),自然數k;輸出:一個大小≤ k的獨立點集(如果存在,否則返回“不存在”);已知:算法M,輸入為(無向圖G, 自然數k),輸出大小≤ k的覆蓋點集,如果這樣的點集存在。否則返回“不存在”;算法步驟:對G,產生G的補圖G';調用M,輸入為(G', k);如果M返回“不存在”,輸出不存在。如果M返回S⊂V,輸出S。可以看出若產生補圖這一步是有效的,那么如果M有效,N也是有效的。一般的,如果我們有一個B有效的算法M,和利用B作為“神諭”(oracle)的解決A問題的算法N,那么如果N是有效的,則我們有有效的解決A問題的算法N'——只需將N中查詢B的操作換作具體的M算法即可。而這一性質的基本解釋是:將多項式的不定元用另一個多項式代替,那么得到的仍是一個多項式。
所以從歸約的觀點來看,下面的說法可以看作與“A比B簡單”(記為A≤B)等價:
A歸約到B(A reduces to B, or A is reducible to B, or A can be reduced to B);存在通過查詢B問題來解決A問題的算法(there exists an algorithm that asks oracles of B, and solves A)。
NP與P關係問題及相關理論
簡介
計算複雜性理論最成功的成果之一是NP完備理論。通過該理論,我們可以理解為什麼在程式設計與生產實踐中遇到的很多問題至今沒有找到多項式算法。而該理論更為計算複雜性中的核心問題:P與NP的關係問題指明了方向。
NP和P的定義
在上面我們已經知道,NP是指“在非確定性圖靈機上有多項式時間算法的問題”的集合,而P是指“在確定性圖靈機上有多項式時間算法的問題”的集合。這裡我們都考慮的是判定型問題,即考慮一個語言L,我們要判斷一個字元串x是不是在L中。那么,一個等價的理解是:NP是指對在L中的x,有多項式長度的證據w,而且對語言(x,w)是有多項式時間算法的;而P是指對L中的x,有多項式時間算法判斷x在不在L中。
舉個例子,就是考慮完美匹配問題、點集覆蓋問題和圖不同構問題。這三個問題都有圖論背影,問題的描述如下:
完美匹配問題:給定圖G=(V,E),找到邊的子集F⊂E,使得對任意的v∈V,存在唯一的e∈F,v∈e;點集覆蓋問題:給定圖G=(V,E),和自然數k,找到點的子集U⊂V,使得對任意的e∈E,存在v∈U,v∈e,且|U|≤k;圖不同構問題:給定圖G=(V,E),H=(U,F),|G|=|H|。我們說G和H是同構的,是指∃T:V→U,對任意的s, t∈V,滿足E(s,t)=F(T(s),T(t))(這裡我們把邊集E看作V×V→{0,1}的映射)。圖不同構是問對G和H,是不是 不存在這樣的映射。關於這三個問題,它們在複雜性理論中,目前的地位如下:
完美匹配問題:在P中。可以利用艾德蒙德算法得到運行時間的算法;點集覆蓋問題:在NP中,而不知道是否在P中。實際上,它是NP完備問題,給出它的多項式算法將意味著證明NP=P。它在NP中,原因是給定一個點的子集U⊂V,我們可以在多項式時間中驗證這是否是一個滿足|U|≤k的點集覆蓋:U的大小很好驗證。然後只需對每一條邊e,遍歷U中每一個元素v,檢查是否有v∈e即可。運行時間至多為 O( V E);圖不同構問題:在AM中,而不知道是否在NP中。它之所以困難,一個直觀的想法是:給定兩個圖G和H,首先這個問題的“證據”很難定義——不像點集覆蓋問題中,一個解就是一個點集,而且點集大小≤k≤|V|是多項式大小。這裡最直接的證據的定義,是說必須遍歷所有的映射T:V→U,並對所有的映射驗證是否滿足同構的定義。而這樣一個證據是指數大小的。這樣我們有了:在P中、在NP而不知道是不是在P中、在AM中而不知道是不是在NP中的三個問題。
NP與P關係問題
由於在多項式時間可以判斷x在不在L中,蘊含著x本身就是其在L中的證據的含義,所以P⊂NP。這個包含關係是不是嚴格的呢?或者說,是不是有語言L∈NP,使得L∉P?這就是著名的NP與P關係問題。從這個問題在1970年代被正式的提出之後,有NP完備理論賦予了它在實踐上的重要性,有證明複雜性理論賦予了它純數學理論上的重要性,有PCP理論和NP完備理論賦予了它算法理論上的重要性。這些理論或者在根本上依賴於NP和P關係問題的某些假設,或者本身就是試圖去理解NP和P關係問題而發展出來的,這使得它成為了理論計算機科學乃至數學的中心問題之一。在2000年,凱萊數學研究所提出了新世紀的數學中七個中心問題,NP與P關係問題就是其中的一個。
關於NP與P關係問題最早發展出的理論是NP完備理論。
NP完備理論
由上面歸約的知識我們知道,算法問題之間可以根據歸約來定義相對的難度。即對問題A和問題B,我們認為A比B簡單,記為A≤B,就是存在使用B問題解來解決A問題的算法M,且M是多項式時間的。那么,在一個複雜性類中,有沒有可能存在“最難的問題”呢?具體的對NP,就是說是不是存在問題A∈NP,使得對∀B∈NP,有B≤A呢?對這樣的問題,我們稱它是NP完備的。
這個問題乍看起來很不容易把握。因為這需要對所有的NP中的語言L,去找到一個L到A的歸約算法。然而1970年代的由史蒂芬·庫克和列昂尼德·列文分別發現的庫克-列文定理,證明了布爾表達式(Boolean formula)的可滿足性問題(SAT問題)是NP完備的。概括的說,他們證明了,有一個通用的過程對NP中任意語言在非確定性圖靈機上運行歷史用布爾表達式來編碼,使得該布爾表達式是可滿足的,若且唯若該運行歷史是對給定輸入,接受該輸入的。這樣,我們就有了第一個被證明是NP完備的問題。
在庫克給出SAT問題是NP完備之後不久,理察·卡普證明了21個圖論、組合數學中常見的問題都是NP完備的。這賦予了NP完備問題在實踐中的重要性。現在,已經有成千個在實踐中遇到的算法問題被證明是NP完備的(參見NP完備問題列表),特別的有許多問題,如旅行商問題等的最優算法會帶來很大的經濟效益(旅行商問題的最優解可以給出最優的電路布線方案,而SAT的最優算法會促進程式驗證等問題的進步)。由NP完備的定義,我們知道對這其中任何一個問題的多項式算法都將給出所有NP問題,也包括所有NP完備問題的多項式算法。然而儘管實際問題中遇到很多NP完備的問題,而且有很多問題在不同領域有著相當的重要性而被大量研究,至今,仍沒有對NP完備問題的多項式算法,這是一些理論計算機科學家認為NP≠P的理由之一。
對NP和P關係問題,NP完備理論給出了如下的暗示:如果要證明NP=P,一個可能的方向是對NP完備問題給出多項式算法;如果要證明NP≠P,那么必然的一個結果是NP完備問題沒有多項式算法。
電路複雜性
電路複雜性理論在1990年代以前,被眾多研究者認為是解決NP與P關係問題的可能的途徑之一。電路複雜性研究的對象是非一致性的計算模型電路,並考慮計算一個布爾函式所需的最小的電路的深度(depth)和大小(size)等資源。其中,大小為多項式大小的電路族可以計算的布爾函式被記為P/poly。可以證明,P包含在P/poly之中,而卡普-利普頓定理(Karp-Lipton theorem)表明若P/poly在NP之中,則多項式層級(polynomial hierarchy)將會坍縮至第二層,這是一個不大可能的結果。這兩個結果結合起來表明,P/poly可以當作是分離NP與P的一個中間的工具,具體的途徑就是證明任一個NP完全問題的電路大小的下界。在直觀上說,電路複雜性也繞過了NP與P問題的第一個困難:相對化證明困難(relativizing proofs)。
在1980年代,電路複雜性途逕取得了一系列的成功,其中包括奇偶性函式(Parity function)在 A C中的下界為指數,以及團問題(clique problem)在單調性電路(monotone circuit)中的下界為指數。然而在1994年Razborov和Rudich的著名論文自然性證明(Natural proof)中指出,上面所用證明電路下界的方法,在單向函式存在的前提下是不可能分離NP和P的。該結果使很多專家對證明電路下界來分離NP和P的前景表示不樂觀。
其它NP與P關係問題相關的理論
計算複雜性理論的基本的主題之一是算法所需資源的下界。隨著算法理論的發展,如隨機算法、近似算法等算法理論的發現,計算複雜性理論也相應的展開了對隨機算法去隨機化(derandomization)和近似算法不可近似性(hardness of approximation)的研究。有趣的是,這些理論都與NP與P關係問題以及電路複雜性有著密切的聯繫。這裡列表出一些理論計算機科學以NP與P關係問題為基礎發展出的理論,並簡單的介紹它們的研究進展:
互動式證明系統理論;去隨機化理論:包括偽隨機數發生器(pseudorandom generator)和extractor的構造等;不可近似性:以PCP定理為基礎,基於NP≠P和更強的唯一性遊戲假設(Unique game conjecture),可以證明對一些問題不存在某近似比的近似算法。
理論與實踐
計算複雜性的初衷是理解不同算法問題的難度,特別的是一些重要算法問題的困難性。為了確切的描述一個問題的困難性,計算複雜性的第一步抽象是認為多項式時間是有效的,非多項式時間是困難的。這基於指數函式增長速度的“違反直覺”的特性:如果一個算法的時間複雜性為2 ,取輸入的規模是100,在運算速度是10 每秒的情況下,該程式將會運行 年,幾乎是宇宙年齡。這為多項式時間被看作是有效時間提供了直觀上的證據。
然而多項式的指數很大的時候,算法在實踐中也不能看作是有效的。如n 的多項式算法,取問題規模大小為1000,那么幾乎就是2 的大小。另一方面,即便一個問題沒有多項式算法,它可能會有近似比很好的近似算法,或有很好的啟發式算法(heuristics)。啟發式算法的特點是在理論上沒有精確的行為的分析,或者可以表明存在很壞的輸入,在這些輸入上運行很慢。然而在大多數時候,它都能快速解決問題。計算複雜性中對應的理論分析是平均複雜性理論(average-case complexity theory)和光滑分析(smooth analysis)。實際中的例子包括Presburger arithmetic、布爾可滿足性問題和背包問題。