一、 概述
算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。
同一个问题可以用不同的算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法,一个算法的评价主要从时间复杂度和空间复杂度来考虑。
二、 时间复杂度
时间频度
算法中语句执行次数,标记T(n)。
- 时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)来表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极值为不等于零的常数,则称f(n)是T(n)的同量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
在算法中,如果语句执行次数是一个常数,则时间复杂度是O(1)。
在不同算法中,时间频度不相同时,时间复杂度可能相同。
3.步骤
(1)、计算执行次数T(n);
(2)、计算T(n)的数量级;
(3)、用大O表示时间复杂度。
4.实例
int num1,num2; //1
for(int i = 0;i < n;i++){ //2
num1 += 1; //3
for(int j = 1;j <= n;j *= 2){ //4
num2 += num1; //5
}
}
(1)、 语句 int num1,num2;int i= 0 频度为1;
(2)、 语句 i<n;i++;int j=1;num1 += 1 频度为n;
(3)、 语句j<=n;j*=2; num2 += num1 频度为n*log2n;
因此:
T(n) = 2+4n+3n*log2n;
f(n) = n*log2n(忽略掉常量、低次幂和最高次幂的系数)
lim(T(n)/f(n))=(2+4n+3n*log2n)/(n*log2n)=2*(1/n)*(1/log2n)+4*(1/log2n)+3,当n趋向于无穷大时,1/n趋向于0,1/log2n趋向于0,所以极限是3。
T(n) = O(n*log2n);
三、 空间复杂度
指算法在计算机内执行时所需存储空间的度量。记作S(n)=O(f(n))。在许多实际问题中,为减少算法所占用的存储空间,通常采用压缩存储技术。
一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
算法的空间复杂度通过计算算法所需的存储空间来实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令,常数,变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现是所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。
参考资料:算法时间复杂度计算 算法复杂度–百度百科