跳至內容

時間複雜度

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
常見函數的時間複雜度

電腦科學中,演算法時間複雜度(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