![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SNhJzN3AjN4Q2M5M2NhJjM1UmMzkzMmZmZxMGNzgjN18CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
前言
算法的效率主要取決于時間複雜度和空間複雜度,我們一步一步來搞懂算法時間複雜度。
定義
在計算機科學中,算法的時間複雜度(Time complexity)是一個函數,它定性描述該算法的運作時間。這是一個代表算法輸入值的字元串的長度的函數。時間複雜度常用大O符号表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。——維基百科
有點沒搞懂?我們來用
C++
簡單舉例來說明。
執行個體
include<iostream>
using namespace std;
int main()
{
int n = 10;
for (int k = 0; k < n; k++) {
cout<<"Hello World"<<endl;
}
return 0;
}
機關運作時間
為了計算時間複雜度,我們通常會估計算法的操作單元數量,每個單元運作的時間都是相同的。——維基百科
這段代碼包括了5條語句,分别是
int n = 10
、
int k = 0
、
k < n
、
k++
、
cout<<"Hello World"
。
前面已經講了,時間複雜度是描述程式運作時間的,那我們就約定指派語句
int n = 10
每執行一次消耗的時間為
1
個機關時間。由于判斷語句
n < k
總共要進行
n+1
次,是以消耗時間為
n+1
。同理可以得出:
在程式運作完後,總時間
T = 3*n+3
。
時間複雜度是一個函數
算法的時間複雜度(Time complexity)是一個函數,它定性描述該算法的運作時間。這是一個代表算法輸入值的字元串的長度的函數。——維基百科
由于
T = 3*n+3
,是以T(n)可以看作是關于
n
的一個函數。
n
可以認為是輸入的字元數量,即自變量。
時間複雜度常用大O符号表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。——維基百科
但大多數程式的算法可沒有那麼簡單,是以就要對函數進行簡化。,這裡涉及到一點極限思想。當輸入值(可認為是輸入的字元數量)是無窮的時候,我們
隻需要定性的描述,不考慮函數的較低階項和最高項系數,是以函數就變為
T(n)=n
。我們用大
O
來表示這種關系,即
O(n)
。
常見時間複雜度
時間複雜度可以用函數 T(n) 的自然特性加以分類,比如有着
T(n) = O(n)
的算法被稱作“線性時間算法”
複雜度比較: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)
時間複雜度的計算
暫未更新...
聲明
文章首發于 算法(1)之時間複雜度
本文參考了 維基百科-時間複雜度