共找到2條詞條名為複雜性理論的結果 展開
- 出版物
- 理論
複雜性理論
理論
複雜性理論(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)的研究,以及互動式證明系統理論和零知識證明(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的覆蓋點集,如果這樣的點集存在。否則返回“不存在”;
• 演演算法步驟:
1.
對G,產生G的補圖G';
2.
調用M,輸入為(G', k);
3.
如果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(reduces A 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)。
計算複雜性的初衷是理解不同演演算法問題的難度,特別的是一些重要演演算法問題的困難性。為了確切的描述一個問題的困難性,計算複雜性的第一步抽象是認為多項式時間是有效的,非多項式時間是困難的。這基於指數函數增長速度的“違反直覺”的特性:如果一個演演算法的時間複雜性為2的n次方,取輸入的規模是100,在運算速度是10的12次方每秒(關於CPU速度,參見Instructions per second,其中報告截止2009年,主流個人電腦的運算速度可以看作是4X10的10次方每秒)的情況下,該程序將會運行4X10的10次方年,幾乎是宇宙年齡。這為多項式時間被看作是有效時間提供了直觀上的證據。
然而多項式的指數很大的時候,演演算法在實踐中也不能看作是有效的。如n的10次方的多項式演演算法,取問題規模大小為1000,那麼幾乎就是2的100次方的大小。另一方面,即便一個問題沒有多項式演演算法,它可能會有近似比很好的近似演演算法(參見近似演演算法),或有很好的啟髮式演演算法(heuristics)。啟髮式演演算法的特點是在理論上沒有精確的行為的分析,或者可以表明存在很壞的輸入,在這些輸入上運行很慢。然而在大多數時候,它都能快速解決問題。計算複雜性中對應的理論分析是平均複雜性理論(average-case complexity theory)和光滑分析(smooth analysis)。實際中的例子包括en:Presburger arithmetic、布爾可滿足性問題(參見SAT solver)和背包問題。