c++ 演算法複雜度分析
阿新 • • 發佈:2019-01-03
1.案例比較
2.複雜度的漸進表示法
3. 函式時間比較和影象
4.複雜度判斷小竅門
加減法不考慮,只考慮乘除
舉例子:
// 技巧,先找執行次數,然後用t*(每次的複雜度) //O(1)複雜度 int aFunc(void) { printf("Hello, World!\n"); // 需要執行 1 次 return 0; // 需要執行 1 次 } //O(n)複雜度 int aFunc(int n) { for(int i = 0; i<n; i++) { // 需要執行 (n + 1) 次 printf("Hello, World!\n"); // 需要執行 n 次 } return 0; // 需要執行 1 次 } //O(n^2)複雜度 void aFunc(int n) { for(int i = 0; i < n; i++) { // 迴圈次數為 n for(int j = 0; j < n; j++) { // 迴圈次數為 n printf("Hello, World!\n"); // 迴圈體時間複雜度為 O(1) } } } //這個也是O(n^2) T(n)=n+(n-1)+(n-2)+...+1 = n(n+1)/2 void aFunc(int n) { for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { printf("Hello World\n"); } } } // 條件判斷語句,這個是O(n^2) 取最大的 void aFunc(int n) { if (n >= 0) { // 第一條路徑時間複雜度為 O(n^2) for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { printf("輸入資料大於等於零\n"); } } } else { // 第二條路徑時間複雜度為 O(n) for(int j = 0; j < n; j++) { printf("輸入資料小於零\n"); } } } // O(logn)複雜度,設迴圈次數為t,則 2^t<n -> t=log(2)(n) void aFunc(int n) { for (int i = 2; i < n; ;) { i *= 2; printf("%i\n", i); } } // O(2^n) long aFunc(int n) { if (n <= 1) { return 1; } else { return aFunc(n - 1) + aFunc(n - 2); } } 解釋:顯然執行次數,T(0) = T(1) = 1,同時 T(n) = T(n - 1) + T(n - 2) + 1,這裡的 1 是其中的加法算一次執行。 顯然 T(n) = T(n - 1) + T(n - 2) 是一個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 T(n) < (5/3)^n,同時當 n > 4 時 T(n) >= (3/2)^n。 所以該方法的時間複雜度可以表示為 O((5/3)^n),簡化後為 O(2^n)。 可見這個方法所需的執行時間是以指數的速度增長的。如果大家感興趣,可以試下分別用 1,10,100 的輸入大小來測試下演算法的執行時間,相信大家會感受到時間複雜度的無窮魅力
5、級數級別