1. 程式人生 > 實用技巧 >漸進時間複雜度分析

漸進時間複雜度分析

1.時間複雜度與漸進時間複雜度

https://blog.csdn.net/mingyuli/article/details/82380107

演算法時間複雜度的本質是演算法的執行時間,也就是演算法中所有語句的頻度之和。

當問題規模很大時,精確的計算是很難實現而且也是沒有必要的,引入了漸進時間複雜度作為時間效能分析的依據。

漸進時間複雜度可以簡稱為時間複雜度,記為T(n)=O(f(n))。

2.估計漸進

https://zhuanlan.zhihu.com/p/132396715,這個博文寫的不錯。

通常,在評估時間複雜度的時候,我們會忽略掉兩個部分,一個部分是低階,另一個部分是常數階

  • O 漸進符號定義了一個演算法的上限,也就是我們說的最壞時間複雜度。例如,插入排序,最佳的情況下的時間複雜度是 O(n),而最壞的情況是 O(n²),所以我們可以說插入排序的事件複雜度是 O(n²)
  • Θ 漸進符號表示的是一個演算法從上限到下限的時間複雜度。如果使用Θ表示插入排序的事件複雜度,則需要如下:
      1. 插入排序的最壞時間複雜度為 Θ(n²)
      2. 插入排序的最佳時間複雜度為 Θ(n)

    Ω 漸進符號表示一個演算法的下限,也就是我們說的最佳時間複雜度。這個符號使用的最少。

3.以for迴圈為例說明幾種漸進

轉自上面知乎專欄

O(1):

int c = 100;
for (int i = 1; i <= c; i++){
 // 執行 O(1) 的迴圈體
}

O(n):

for (int i = 0; i < n; i = i+c){
 // do O(1)
}

O(n^2):

// n 表示使用者輸入;c 表示常數
for (int i = 1; i <= n; i += c) { for (int k = 1; k <= n; k += c) { // do O(1) } }

O(logn):

// n 表示使用者輸入;c 表示常數
for (int i = 0; i <= n; i *= c) {
 // do O(1)
}

O(LogLogn):

// n 表示使用者輸入;c 表示常數
// pow 表示 i^c
for (int i = 2; i < n; i = Math.pow(i, c)) {
 // do O(1)
}

O(nLogn):

public
void fun(int n) { for (int i = 0; i < n; i++ ){ for (int k = 1; k < n; k = k*2){ // do O(1) } } }

4.常見漸進總結

按數量級遞增排列,常見的時間複雜度有:

常數階O(1)、對數階O(log2n)、線性階O(n)、線性對數階O(nlog2n)、平方階O(n2),立方階O(n3)、k次方階O(nk)、指數階O(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

https://www.bilibili.com/read/cv5788376/