时间复杂度与空间复杂度的概念
算法的时间复杂度反映了程序执行时间随着输入规模增长而增长的量级,能很好的反映出一个算法的优劣。
时间复杂度:评估执行程序所需要的时间。
空间复杂度:评估执行程序所需要的存储空间。
时间复杂度
一个算法所花费的时间与算法中语句的执行次数成正比,执行的次数多,即花费的时间也多。
T(n) = O( f(n) ) (n表示数据规模)
算法复杂度从三种情况考虑,最理想情况、平均情况和最坏情况评估。我们一般考虑最坏的情况。一般用大O表示法。
常见的时间复杂度:
O(1):常数时间阶 O(n):线性时间阶 O(logn):对数时间阶
O(nlogn):线性对数时间阶 O(n^2):平方时间阶 …
O(1)<O(log2n)<O(n)<O(nlogn)<O(n2)<O(n3)<…<O(2^n)<O(n!)
时间复杂度
时间复杂度的求解步骤:
(1)找出算法中的基本语句
算法中执行次数最多的那条语句就是基本语句,通常是内层循环。
(2)计算基本语句的执行次数的数量级
可忽略所有的低次幂和最高次幂的系数,只保留最高的次幂即可。
(3)用大O的渐进表示法表示
将基本语句的执行次数的数量级放入大O记号中。
例:
//时间复杂度为O(1)
int num = 0;
for(i = 0; i < 10; i++)
{
num++;
}
//时间复杂度为O(n)
int num = 0;
for(i = 1; i <= n; i++)
{
num++;
}
//时间复杂度为O(n^2)
int num = 0;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
num++;
}
}
空间复杂度
空间复杂度:指程序运行时所需储存空间大小的度量。
空间复杂度的求解方法:
一般地,算法的空间复杂度指的是辅助空间。一维数组a[n]: 空间复杂度为O(n)
二维数组a[n][m]: 空间复杂度为O(n*m)
例:fibonacci的空间复杂度
//动态开辟了N个空间,空间复杂度为O(N)
long long* Fibonacci(int n)
{
if(n==0)
return NULL:
long long* fibArray = new long long[n+1];
fibArray[0] = 0;
fibArray[1] = 1;
for(int i = 2; i<= n; ++i)
{
fibArray[i] = fibArray[i-1] +fibArray[i-2];
}
return fibArray;
如今计算机的存储容量已经达到了很高的程度,所以我们不需要再特别关注一个算法的空间复杂度,需要更注重时间复杂度,可用空间来换取时间。