演算法的時間複雜度(Time Complexity)
阿新 • • 發佈:2022-03-20
時間複雜度(Time Complexity)不是度量具體一個演算法具體的耗時是多少。時間複雜度通常用大O表示法,它不包括這個函式的低階項和首項係數,可以表示為T[n]=O(f(n)),稱函式T(n)以f(n)為界或者稱T(n)受限於f(n)。 如果一個問題的規模是n,解這一問題的某一演算法所需要的時間為T(n)。大O表示法給出的是一個上界,而非一個上確界。
大O符號是由德國數論學家保羅·巴赫曼(Paul Bachmann)在其1892年的著作《解析數論》(Analytische Zahlentheorie)首先引入的。
常見的時間複雜度量級有:
- 常數階O(1)
- 對數階O(logN)
- 線性階O(n)
- 線性對數階O(nlogN)
- 平方階O(n²)
- 立方階O(n³)
- K次方階O(n^k)
- 指數階(2^n)
常數階O(1)
// 無論程式碼有多少行,只要沒有迴圈等結構,那麼時間複雜度就是O(1)。 int x = 13; x = x + 1; x = x + 1; x = x + 1; x = x + 1; x = x + 1; x = x + 1; x = x + 1; x = x + 1; x = x + 1;
對數階O(logN)
public void main() { int i = 1; while(i<n) { // i在每個迴圈都將乘以2,假設迴圈x次之後,i就大於n,迴圈退出,程式結束,那麼2^x=n => x=log2(n),所以時間複雜度為:O(logN)i = i * 2; } }
線性階O(n)
public void main() { int i = 1; while(i<n) { // 執行迴圈x次後,程式退出,那麼x=n => O(n)。 // 如果i=i+2,時間複雜度同樣是O(n),因為2x=n => O(n/2) => O(n),因為當n接近於無窮大的時候,常量可以忽略。 i = i + 1; } }
線性對數階O(nlogN)
public void main() { int i = 1;while(i<n) { for(int j=1;j<n;j++) j = j*2; } }
平方階O(n²)
public void main() { for(int i=1;i<n;i++) for(int j=1;j<n;j++) j = j+1; } }
立方階O(n³)
public void main() { for(int i=1;i<n;i++) for(int j=1;j<n;j++) for(int k=1;k<n;k++) k = k+1; } }
K次方階O(n^k)
與立方階O(n³)類似,多層迴圈。
指數階(2^n)
比如,旅行商問題(Travelling Salesman Problem,簡稱TSP)