時間複雜度

计算机科学概念

計算機科學中,算法時間複雜度(time complexity)是一個函數,它定性描述該算法的運行時間。這是一個代表算法輸入值的字符串的長度的函數。時間複雜度常用大O符號表述,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。例如,如果一個算法對於任何大小為 n (必須比 n0 大)的輸入,它至多需要 5n3 + 3n 的時間運行完畢,那麼它的漸近時間複雜度是 O(n3)。

常見函數的時間複雜度

為了計算時間複雜度,我們通常會估計算法的操作單元數量,每個單元執行的時間都是相同的。因此,總運行時間和算法的操作單元數量最多相差一個常量係數。

相同大小的不同輸入值仍可能造成算法的執行時間不同,因此我們通常使用算法的最壞情況複雜度英語Worst-case complexity,記為 T(n) ,定義為任何大小的輸入 n 所需的最大執行時間。另一種較少使用的方法是平均情況複雜度英語average-case complexity,通常有特別指定才會使用。時間複雜度可以用函數 T(n) 的自然特性加以分類,舉例來說,有著 T(n) = O(n) 的算法被稱作「線性時間算法」;而 T(n) = O(Mn) 和 Mn= O(T(n)) ,其中 Mn > 1 的算法被稱作「指數時間算法」。

常見時間複雜度列表

編輯

以下表格統整了一些常用的時間複雜度類別。表中,poly(x) = xO(1),也就是 x 的多項式。

名稱 複雜度類 運行時間(  運行時間舉例 算法舉例
常數時間   10 判斷一個二進制數的奇偶
阿克曼時間   併查集的單個操作的平攤時間
迭代對數時間   分散式圓環著色問題
對數對數時間   有界優先隊列的單個操作[1]
對數時間 DLOGTIME      二分搜索
冪對數時間    
(小於1次)冪時間  ,其中     K-d樹的搜索操作
線性時間     無序數組的搜索
線性迭代對數時間   萊姆德·賽德爾英語Raimund Seidel三角分割多邊形英語Polygon triangulation算法
線性對數時間      最快的比較排序
二次時間     冒泡排序插入排序
三次時間     矩陣乘法的基本實現,計算部分相關性英語Partial correlation
多項式時間 P       線性規劃中的卡馬卡演算法英語Karmarkar's algorithmAKS質數測試
准多項式時間 QP   關於有向斯坦納樹問題英語Steiner tree problem最著名的 近似算法
次指數時間(第一定義) SUBEXP  ,對任意的ε > 0   假設複雜性理論推測,BPP 包含在 SUBEXP 中。[2]
次指數時間(第二定義) 2o(n 2n1/3 用於整數分解圖形同構問題英語Graph isomorphism problem的著名演算法
指數時間 E 2O(n) 1.1n, 10n 使用動態規劃解決旅行推銷員問題
階乘時間 O(n!) n! 通過暴力搜索解決旅行推銷員問題
指數時間 EXPTIME 2poly(n) 2n, 2n2
雙重指數時間 2-EXPTIME 22poly(n) 22n 預膨脹算術英語Presburger arithmetic中決定一個給定描述的真實性

常數時間

編輯

若對於一個算法, 的上界與輸入大小無關,則稱其具有常數時間,記作 時間。一個例子是訪問數組中的單個元素,因為訪問它只需要一條指令。但是,找到無序數組中的最小元素則不是,因為這需要遍歷所有元素來找出最小值。這是一項線性時間的操作,或稱 時間。但如果預先知道元素的數量並假設數量保持不變,則該操作也可被稱為具有常數時間。

雖然被稱為「常數時間」,運行時間本身不須與問題規模無關,但它的上界必須是與問題規模無關的確定值。舉例,「如果a > b則交換a、b的值」這項操作,儘管具體時間會取決於條件「a > b」是否滿足,但它依然是常數時間,因為存在一個常量t使得所需時間總不超過t。

以下是一個常數時間的代碼片段:

int index = 5;
int item = list[index];
if (condition true) then
   perform some operation that runs in constant time
else
   perform some other operation that runs in constant time
for i = 1 to 100
   for j = 1 to 200
      perform some operation that runs in constant time

如果 ,其中 是一個常數,這記法等價於標準記法 

對數時間

編輯

若算法的T(n) = O(log n),則稱其具有對數時間。計算機使用二進制的記數系統,對數常常以2為底(即log2 n,有時寫作lg n)。然而,由對數的換底公式,loga n和logb n只有一個常數因子不同,這個因子在大O記法中被丟棄。因此記作O(log n),而不論對數的底是多少,是對數時間算法的標準記法。

常見的具有對數時間的算法有二叉樹的相關操作和二分搜索

對數時間的算法是非常有效的,因為每增加一個輸入,其所需要的額外計算時間會變小。

遞歸地將字符串砍半並且輸出是這個類別函數的一個簡單例子。它需要O(log n)的時間因為每次輸出之前我們都將字符串砍半。 這意味着,如果我們想增加輸出的次數,我們需要將字符串長度加倍。

// 递归输出一个字符串的右半部分
var right = function(str)
{
    var length = str.length;

    // 辅助函数
    var help = function(index)
    {

        // 递归情况:输出右半部分
        if(index < length){

            // 输出从index到数组末尾的部分
            console.log(str.substring(index, length));

            // 递归调用:调用辅助函数,将右半部分作为参数传入
            help(Math.ceil((length + index)/2));
        }

        // 基本情况:什么也不做
    }
    help(0);
}

冪對數時間

編輯

對於某個常數k,若算法的T(n) = O((log n)k),則稱其具有冪對數時間。例如,矩陣鏈排序可以通過一個PRAM模型.[3]被在冪對數時間內解決。

次線性時間

編輯

對於一個演算法,若其符合T(n) = o(n),則其時間複雜度為次線性時間sub-linear timesublinear time)。實際上除了符合以上定義的演算法,其他一些演算法也擁有次線性時間的時間複雜度。例如有O(n½) 葛羅佛搜尋英語Grover's algorithm演算法。

常見的非合次線性時間演算法都採用了諸如平行處理(就像NC1 matrix行列式計算那樣)、非古典處理(如同葛羅佛搜尋那樣),又或者選擇性地對有保證的輸入結構作出假設(如冪對數時間的二分搜尋)。不過,一些情況,例如在頭 log(n) 位元中每個字串有一個位元作為索引的字串組就可能依賴於輸入的每個位元,但又符合次線性時間的條件。

「次線性時間演算法」通常指那些不符合前一段的描述的演算法。它們通常運行於傳統電腦架構系列並且不容許任何對輸入的事先假設。[4]但是它們可以是隨機化算法,而且必須是真隨機算法除了特殊情況。

線性時間

編輯

如果一個算法的時間複雜度為O(n),則稱這個算法具有線性時間,或O(n)時間。非正式地說,這意味着對於足夠大的輸入,運行時間增加的大小與輸入成線性關係。例如,一個計算列表所有元素的和的程序,需要的時間與列表的長度成正比。這個描述是稍微不準確的,因為運行時間可能顯著偏離一個精確的比例,尤其是對於較小的n。

線性對數(準線性)時間

編輯

若一個算法時間複雜度T(n) = O(nlog n),則稱這個算法具有線性對數時間。因此,從其表達式我們也可以看到,線性對數時間增長得比線性時間要快,但是對於任何含有n,且n的冪指數大於1的多項式時間來說,線性對數時間卻增長得慢。

多項式時間

編輯

強多項式時間與弱多項式時間

編輯

複雜度類

編輯

多項式時間的概念出發,在計算複雜度理論中可以得到一些複雜度類。以下是一些重要的例子。

  • P:包含可以使用確定型圖靈機在多項式時間內解決的決定性問題
  • NP:包含可以使用非確定型圖靈機在多項式時間內解決的決定性問題。
  • ZPP:包含可以使用概率圖靈機在多項式時間內零錯誤解決的決定性問題。
  • RP:包含可以使用概率圖靈機在多項式時間內解決的決定性問題,但它給出的兩種答案中(是或否)只有一種答案是一定正確的,另一種則有幾率不正確。
  • BPP:包含可以使用概率圖靈機在多項式時間內解決的決定性問題,它給出的答案有錯誤的概率在某個小於0.5的常數之內。
  • BQP:包含可以使用量子圖靈機在多項式時間內解決的決定性問題,它給出的答案有錯誤的概率在某個小於0.5的常數之內。

在機器模型可變的情況下,P在確定性機器上是最小的時間複雜度類。例如,將單帶圖靈機換成多帶圖靈機可以使算法運行速度以二次階提升,但所有具有多項式時間的算法依然會以多項式時間運行。一種特定的抽象機器會有自己特定的複雜度類分類。

超越多項式時間

編輯

如果一個算法的時間 T(n) 沒有任何多項式上界,則稱這個算法具有超越多項式(superpolynomial)時間。在這種情況下,對於所有常數 c 我們都有 T(n) = ω(nc),其中 n 是輸入參數,通常是輸入的數據量(比特數)。指數時間顯然屬於超越多項式時間,但是有些算法僅僅是很弱的超越多項式算法。例如,Adleman-Pomerance-Rumely 質數測試英語Adleman–Pomerance–Rumely primality test對於 n 比特的輸入需要運行 nO(log log n) 時間;對於足夠大的 n,這時間比任何多項式都快;但是輸入要大得不切實際,時間才能真正超過低階的多項式。

准多項式時間

編輯

準多項式時間演算法是運算慢於多項式時間的演算法,但不會像指數時間那麼慢。對一些固定的  ,準多項式時間演算法的最壞情況運行時間是  。如果準多項式時間演算法定義中的常數「c」等於1,則得到多項式時間演算法;如果小於1,則得到一個次線性時間算法。

次指數時間

編輯

術語次指數時間用於表示某些演算法的運算時間可能比任何多項式增長得快,但仍明顯小於指數。在這種狀況下,具有次指數時間演算法的問題比那些僅具有指數演算法的問題更容易處理。「次指數」的確切定義並沒有得到普遍的認同,[5]我們列出了以下兩個最廣泛使用的。

第一定義

編輯

如果一個問題解決的運算時間的對數值比任何多項式增長得慢,則可以稱其為次指數時間。更準確地說,如果對於每個 ε> 0,存在一個能於時間 O(2nε) 內解決問題的演算法,則該問題為次指數時間。所有這些問題的集合是複雜性SUBEXP,可以按照 DTIME 的方式定義如下。[2][6][7][8]

 

第二定義

編輯

一些作者將次指數時間定義為 2o(n) 的運算時間。[9][10][11]該定義允許比次指數時間的第一個定義更多的運算時間。這種次指數時間演算法的一個例子,是用於整數因式分解的最著名古典演算法——普通數域篩選法,其運算時間約為  ,其中輸入的長度為 n。另一個例子是圖形同構問題英語Graph isomorphism problem的最著名演算法,其運算時間為  

指數時間

編輯

T(n) 是以 2poly(n)為上界,其中 poly(n) 是 n 的多項式,則演算法被稱為指數時間。更正規的講法是:若 T(n) 對某些常數 k是由 O(2nk) 所界定,則演算法被稱為指數時間。在確定性圖靈機上認定為指數時間演算法的問題,形成稱為EXP的複雜性級別。

 

有時侯,指數時間用來指稱具有 T(n) = 2O(n) 的演算法,其中指數最多為 n 的線性函數。這引起複雜性等級 E

 

雙重指數時間

編輯

T(n) 是以 22poly(n) 為上界,其中 poly(n) 是 n 的多項式,則演算法被稱為雙重指數時間。這種演算法屬於複雜性等級 2-EXPTIME

 

眾所周知的雙重指數時間演算法包括:

參見

編輯

參考資料

編輯
  1. ^ Mehlhorn, Kurt; Naher, Stefan. Bounded ordered dictionaries in O(log log N) time and O(n) space. Information Processing Letters. 1990, 35 (4): 183. doi:10.1016/0020-0190(90)90022-P. 
  2. ^ 2.0 2.1 Babai, László; Fortnow, Lance; Nisan, N.; Wigderson, Avi. BPP has subexponential time simulations unless EXPTIME has publishable proofs. Computational Complexity (Berlin, New York: Springer-Verlag). 1993, 3 (4): 307–318. doi:10.1007/BF01275486. 
  3. ^ Bradford, Phillip G.; Rawlins, Gregory J. E.; Shannon, Gregory E. Efficient Matrix Chain Ordering in Polylog Time. SIAM Journal on Computing (Philadelphia: Society for Industrial and Applied Mathematics). 1998, 27 (2): 466–490. ISSN 1095-7111. doi:10.1137/S0097539794270698. 
  4. ^ Kumar, Ravi; Rubinfeld, Ronitt. Sublinear time algorithms (PDF). SIGACT News. 2003, 34 (4): 57–67 [2013-05-01]. (原始內容存檔 (PDF)於2016-03-03). 
  5. ^ Aaronson, Scott. A not-quite-exponential dilemma. Shtetl-Optimized. 5 April 2009 [2 December 2009]. (原始內容存檔於2019-05-25). 
  6. ^ Complexity Zoo: Class SUBEXP: Deterministic Subexponential-Time
  7. ^ Moser, P. Baire's Categories on Small Complexity Classes. Lecture Notes in Computer Science (Berlin, New York: Springer-Verlag). 2003: 333–342. ISSN 0302-9743. 
  8. ^ Miltersen, P.B. DERANDOMIZING COMPLEXITY CLASSES. Handbook of Randomized Computing (Kluwer Academic Pub). 2001: 843. 
  9. ^ Impagliazzo, Russell; Paturi, Ramamohan. On the complexity of k-SAT (PDF). Journal of Computer and System Sciences. 2001, 62 (2): 367–375 [2021-08-12]. MR 1820597. doi:10.1006/jcss.2000.1727 . (原始內容存檔 (PDF)於2021-07-10). 
  10. ^ Kuperberg, Greg. A Subexponential-Time Quantum Algorithm for the Dihedral Hidden Subgroup Problem. SIAM Journal on Computing (Philadelphia: Society for Industrial and Applied Mathematics). 2005, 35 (1): 188. ISSN 1095-7111. doi:10.1137/s0097539703436345. 
  11. ^ Oded Regev. A Subexponential Time Algorithm for the Dihedral Hidden Subgroup Problem with Polynomial Space. 2004. arXiv:quant-ph/0406151v1 . 
  12. ^ Mayr,E. & Mayer,A.: The Complexity of the Word Problem for Commutative Semi-groups and Polynomial Ideals. Adv. in Math. 46(1982) pp. 305-329
  13. ^ J.H. Davenport & J. Heintz: Real Quantifier Elimination is Doubly Exponential. J. Symbolic Comp. 5(1988) pp. 29-35.
  14. ^ G.E. Collins: Quantifier Elimination for Real Closed Fields by Cylindrical Algebraic Decomposition. Proc. 2nd. GI Conference Automata Theory & Formal Languages (Springer Lecture Notes in Computer Science 33) pp. 134-183