时间复杂度:
在进行算法分析时,语句总的执行次数T(n)
是关于问题规模n
的函数,进而分析T(n)
随n
的变化情况并确定T(n)
的数量级。
算法的时间复杂度,也就是算法的时间量度,记做T(n)=O(f(n))
。
他表示随问题规模n的增大,算法执行时间的增长率和f(n)
的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中,f(n)
是问题的规模n的某个函数。
这样用大写字母O
来体现算法时间复杂度的记法,常称之为大O记法
。
如何推导时间复杂度:
- 用常数1来取代运行时间中所有加法常数,如:1+2+3 = 1,记为
O(1)
- 在修改后的运行次数函数中,只保留最高阶项,如:n+n^2 = n^2,记为
O(n^2)
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数,如:3n^2 = n^2,记为
O(n^2)
计算下面程序的时间复杂度:
例题1:
int a = 0;
int b = 0;
int c = a + b;
printf("hello world");
答案:O(1)
例题2:
for (int i = 0 ; i < 100; i++) {
}
答案:O(n)
例题3:
for (int i = 0 ; i < 100; i++) {
for (int j = 0 ; j < 100; j++) {
}
}
答案:O(n^2)
例题4平方阶:
for (int i = 0 ; i < 100; i++) {
for (int j = i ; j < i; j++) {
}
}
//分析:执行次数 = n + (n-1) + (n-2) +...+1 = n * (n + 1) / 2 = (n^2) / 2 + n / 2
答案:O(n^2)
例题5对数阶:
int i = 1, n = 100;
while (i < n) {
i = i * 2;
}
//分析:退出条件是2*x == n,可以得到x = log(2)n -- 以2为底,n的对数
答案:O(logn)
空间复杂度:
算法的空间复杂度:通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记为:S(n) = O(f(n))
,其中,n
为问题的规模,f(n)
为语句关于n所占存储空间的函数。