常見時間複雜度的比較
當算法的時間複雜度爲 O(2n)(n爲指數),O(n!),或O(nn)(n爲指數)時,即便n的值很小,實際的程序運行時間也是不可接收的。ios
意義:當算法在最壞狀況下仍然能知足需求時,能夠推斷,算法的最好狀況和平均狀況都能知足需求。面試
算法分析示例
int find(int a[], int n, int v) { int ret = -1; for (int i=0; i<n; ++i) { if (a[i] == v) { ret = i; break; } } return ret; } int main() { int arr[5] = {1,2,3,4,5}; int min = find(arr, 5, 1); // 最好狀況,執行1次循環,O(1) int max = find(arr, 5, 5); // 最壞狀況,執行n次循環,O(n) }
注意:數據結構課程中,在沒有特殊說明時,所分析算法的時間複雜度都是指最壞時間複雜度。算法
定義: S(n) = S(f(n))數組
- n 爲算法的問題規模
- f(n) 爲空間使用函數,與n相關
推導時間複雜度的方法一樣適用於空間複雜度。
例如:
當算法所須要的空間是常數時,空間複雜度爲S(1)數據結構
long sum1(int n) // 1 { long ret = 0; // 1 int *array = new int[n]; // n for (int i=0; i<n; ++i) // 1 { array[i] = i + 1; } for (int i=0; i<n; ++i) // 1 { ret += array[i]; } delete[] array; return ret; }
所需的單元內存: n + 4
空間複雜度:S(n+4) = S(n)函數
- 多數狀況下,算法的時間複雜度更使人關注
- 若是有必要,能夠經過增長額外空間下降時間複雜度
- 同理,能夠經過增長算法的耗時下降空間複雜度
以上策略的依據:當前硬件的發展速度超過了軟件的發展速度spa
/* 問題: 在一個由天然數1-1000中某些數字所組成的數組中,每一個數字可能出現零次或者屢次。 設計一個算法,找出出現次數最多的數字。 */ #include <iostream> using namespace std; void search(int a[], int len) // O(n) { int sp[1000] = {0}; int max = 0; for(int i=0; i<len; i++) { sp[a[i] - 1]++; } for(int i=0; i<1000; i++) { if( max < sp[i] ) { max = sp[i]; } } for(int i=0; i<1000; i++) { if( max == sp[i] ) { cout << i + 1 << endl; } } } int main(int argc, char* argv[]) { int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3}; search(a, sizeof(a)/sizeof(*a)); return 0; }
輸出:設計
3 6
當兩個算法的大O表示法相同時,是否意味着兩個算法的效率徹底相同?
答:只能說效率同等級別,不能說徹底相同。由於大O表示法只關注操做數量的最高次項。3d
- 通常而言,工程中使用的算法,時間複雜度不超過O(n3)(3爲指數)
- 算法分析與設計時,重點考慮最壞狀況下的時間複雜度
- 數據結構課程終重點關注算法的時間複雜度
- 大O表示法一樣適用於空間複雜度
空間換時間是工程中經常使用的策略
以上內容參考狄泰軟件學院系列課程,請你們保護原創!code