時間複雜度

常見函數的時間複雜度
在計算機科學中，算法的時間複雜度（time complexity）是一個函數，它定性描述該算法的運行時間。這是一個代表算法輸入值的字符串的長度的函數。時間複雜度常用大O符號表述，不包括這個函數的低階項和首項係數。使用這種方式時，時間複雜度可被稱為是漸近的，亦即考察輸入值大小趨近無窮時的情況。例如，如果一個算法對於任何大小為 n （必須比 n0 大）的輸入，它至多需要 1=5n3 + 3n 的時間運行完畢，那麼它的漸近時間複雜度是 O(n3)。
為了計算時間複雜度，我們通常會估計算法的操作單元數量，每個單元執行的時間都是相同的。因此，總運行時間和算法的操作單元數量最多相差一個常量係數。
相同大小的不同輸入值仍可能造成算法的執行時間不同，因此我們通常使用算法的最壞情況複雜度，記為 T(n) ，定義為任何大小的輸入  n 所需的最大執行時間。另一種較少使用的方法是平均情況複雜度，通常有特別指定才會使用。時間複雜度可以用函數 T(n) 的自然特性加以分類，舉例來說，有著 T(n) = O(n) 的算法被稱作「線性時間算法」；而 T(n) = O(Mn) 和 Mn= O(T(n)) ，其中 M ≥ n > 1 的算法被稱作「指數時間算法」。

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

**常數時間**
若對於一個算法，的上界與輸入大小無關，則稱其具有常數時間，記作時間。一個例子是訪問數組中的單個元素，因為訪問它只需要一條指令。但是，找到無序數組中的最小元素則不是，因為這需要遍歷所有元素來找出最小值。這是一項線性時間的操作，或稱時間。但如果預先知道元素的數量並假設數量保持不變，則該操作也可被稱為具有常數時間。
雖然被稱為「常數時間」，運行時間本身不須與問題規模無關，但它的上界必須是與問題規模無關的確定值。舉例，「如果a > b則交換a、b的值」這項操作，儘管具體時間會取決於條件「a > b」是否滿足，但它依然是常數時間，因為存在一個常量t使得所需時間總不超過t。
以下是一個常數時間的代碼片段：
int index = 5;
int item = listindex;
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），而不論對數的底是多少，是對數時間算法的標準記法。
常見的具有對數時間的算法有二叉樹的相關操作和二分搜索。
對數時間的算法是非常有效的，因為每增加一個輸入，其所需要的額外計算時間會變小。
快速冪 就是一個經典例子。要計算n次方只需要O(log n)的時間。
long long power(long long p, long long n)
{
	long long ans = 1;
	while (n)
	{
		if (n & 1) ans = (ans * p) % Mod;
		p = p * p % Mod;
		n >>= 1;
	}
	return ans;
}

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

**次線性時間**
對於一個演算法，若其符合T(n) = o(n)，則其時間複雜度為次線性時間（sub-linear time或sublinear time）。實際上除了符合以上定義的演算法，其他一些演算法也擁有次線性時間的時間複雜度。例如有O(n½) 葛羅佛搜尋演算法。
常見的非合次線性時間演算法都採用了諸如平行處理（就像NC1 matrix行列式計算那樣）、非古典處理（如同葛羅佛搜尋那樣），又或者選擇性地對有保證的輸入結構作出假設（如冪對數時間的二分搜尋）。不過，一些情況，例如在頭 log(n) 位元中每個字串有一個位元作為索引的字串組就可能依賴於輸入的每個位元，但又符合次線性時間的條件。
「次線性時間演算法」通常指那些不符合前一段的描述的演算法。它們通常運行於傳統電腦架構系列並且不容許任何對輸入的事先假設。但是它們可以是隨機化算法，而且必須是真隨機算法除了特殊情況。

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

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

**多項式時間**

**強多項式時間與弱多項式時間**
一個演算法如果執行時間是 輸入數值的大小（而非僅僅是輸入長度）的多項式函數，則它運行於弱多項式時間。例:標準動態規劃求解「0-1 揹包問題」。
如果一個演算法的時間複雜度僅依賴輸入的長度（bit 數），且不受輸入數值大小影響，那麼它是強多項式時間。例: 高斯消去法，只依賴於資料長度，不依賴於數字大小。

**複雜度類**
從多項式時間的概念出發，在計算複雜度理論中可以得到一些複雜度類。以下是一些重要的例子。- P：包含可以使用確定型圖靈機在多項式時間內解決的決定性問題。- NP：包含可以使用非確定型圖靈機在多項式時間內解決的決定性問題。- ZPP：包含可以使用概率圖靈機在多項式時間內零錯誤解決的決定性問題。- RP：包含可以使用概率圖靈機在多項式時間內解決的決定性問題，但它給出的兩種答案中（是或否）只有一種答案是一定正確的，另一種則有幾率不正確。- BPP：包含可以使用概率圖靈機在多項式時間內解決的決定性問題，它給出的答案有錯誤的概率在某個小於0.5的常數之內。- BQP：包含可以使用量子圖靈機在多項式時間內解決的決定性問題，它給出的答案有錯誤的概率在某個小於0.5的常數之內。
在機器模型可變的情況下，P在確定性機器上是最小的時間複雜度類。例如，將單帶圖靈機換成多帶圖靈機可以使算法運行速度以二次階提升，但所有具有多項式時間的算法依然會以多項式時間運行。一種特定的抽象機器會有自己特定的複雜度類分類。

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

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

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

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


**第二定義**
一些作者將次指數時間定義為 2o(n) 的運算時間。該定義允許比次指數時間的第一個定義更多的運算時間。這種次指數時間演算法的一個例子，是用於整數因式分解的最著名古典演算法——普通數域篩選法，其運算時間約為 ，其中輸入的長度為 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。

眾所周知的雙重指數時間演算法包括：- Presburger arithmetic的決策程序- 計算Gröbner basis（在最差狀況）- 實封閉體的量詞消去至少耗費雙重指數時間，而且可以在這樣的時間內完成。

**參見**
 L符號
*博弈複雜度
*計算複雜性理論- 零一律- 柯爾莫哥洛夫空間- 柯氏複雜性- 空間複雜度

**參考資料==