本文是對時間複雜度以及空間複雜度的乙個理解
時間複雜度
由於環境的不同,同樣的**執行所需要的時間是不同的,所以是不能拿來比較的
而函式中執行的次數確實一樣的
所以時間複雜度就是
程式每個迴圈中的語句總共會執行的次數
時間複雜度的表示方法——大o漸進表示法
o(f(n))
這裡的f(n)是什麼呢?
void test(int n)
} for (int k = 0; k < 2 * n; ++k)
int count = 10;
while (count--)
}
上面函式的執行次數可以這樣表示 f(n) = n^2 + 2*n + 10
乙個演算法語句總的執行次數是關於問題規模n的某個函式,記為f(n),n 稱為問題的規模。語句總的執行次數記為t(n),當n不斷變化時,t(n)也 在變化,演算法執行次數的增長速率和f(n)的增長速率相同。則有t(n) = o(f(n)),稱o(f(n))為時間複雜度的o漸進表示法
但 f(n) 這個函式又是多少呢?這裡就需要時間複雜度的演算法了
一般演算法o(n)計算方法:
用常數1取代執行時間中的所有加法常數
在修改後的執行次數函式中,只保留最高端項
去除函式中所有不為次數的常數
例:2*n —> n
所以上面函式的時間複雜度就可以得到了 o(n^2) //由於不會打出n方,只能用n^2表示了,望諒解
空間複雜度
空間複雜度就是函式中建立物件的個數
空間複雜度也是用o 的漸進表示法表示
計算方法可以參考時間複雜度的計算方法,這裡就不寫了
int sum(int n)
空間複雜度位:o(1) —>只建立了乙個臨時變數
下面實現兩個函式
1、實現二分查詢演算法的遞迴及非遞迴。
//非遞迴
int binary_search(int arr, int len, int a)
else if (a > arr[maddle])
else if (a < arr[maddle])
}return -1;
}int main()
; int len = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", binary_search(arr, len, 3));
printf("%d\n", binary_search(arr, len, 10));
return 0;
}//遞迴
//我的這個函式傳的引數比較多
int binary_search(int arr, int len, int a, int left, int right, int maddle)
else
}return maddle;
}int main()
; int len = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = len - 1;
int maddle = maddle = left + (right - left) / 2;
printf("%d\n", binary_search(arr, len, 3, left, right, maddle));
printf("%d\n", binary_search(arr, len, 10, left, right, maddle));
return 0;
}
這裡計算一下時間複雜度與空間複雜度
時間複雜度:
非遞迴 o(logn) 這裡要倒過來理解,乙個數找了三次才找到,一次會去掉一半的數,所以總的個數就是2^3=8
所以這裡的次數就是 logn
遞迴 o(logn)
函式每次執行的時間複雜度為o(1),執行遞迴的次數同非遞迴的二分查詢次數,所以時間複雜度也 是o(logn);
空間複雜度:
非遞迴 o(1)
遞迴 o(1) 都只建立了乙個臨時變數
2、實現斐波那契數列的遞迴及非遞迴
//非遞迴
int recursive(int n)
} }
if (n % 2 == 0)
return a;
else
return b;
}//遞迴
int recursive(int n)
時間複雜度:
非遞迴 o(n)
遞迴 o(2^n)
空間複雜度:
非遞迴 o(1)
遞迴 o(1)
時間複雜度與空間複雜度
空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...
時間複雜度與空間複雜度
本文部分取自搜狗百科 在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。時間複雜度 一般情況下,演算法中基本操作重複執行的次數是問題規模n的...
時間複雜度與空間複雜度
一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f n 演算法的時間度量記 t n o f n 它表示問題規模隨n的增大,演算法執行時間的增長率和f n 的增長率相同,稱做演算法的漸近時間複雜度,簡稱時間複雜度。例如 void test0 int n 總執行次數f n 10 時間複雜...