-
一个好的算法要保证效率和低存储量需求。其中效率为算法的执行时间,存储量需求是指算法执行过程中所需要的最大存储空间。也就是算法效率的度量是通过时间复杂度和空间复杂度来描述。
-
一个语句的频度是指该语句在算法中的执行次数,而时间复杂度就是分析所有语句频度之和的数量级。
-
n为该算法的问题规模,时间复杂度与n有关。
-
那么,为什么要事先计算算法的时间复杂度呢?有些问题不能事后计算,比如导弹控制算法。并且有其他几种原因影响时间开销:①机器性能。②编程语言(越高级的语言执行效率越低)。③编译程序产生的机器指令质量。所以不能让算法先运行,再统计时间开销。
-
计算时间复杂度的例子
void LoveYou{
int i = 1;
while(i<=n){
i++;
printf(“I love you %d\n”,i);
}
printf(“i love you more than %d\n”,i);
}
该算法的时间复杂度最原始的方法就是判断每条语句执行的次数。显然为1+(n+1)+(n)+(n)+1=3n+3【加括号是为了分清是哪个语句的执行次数】 -
上面的算法过于简单,可以用一条一条语句计算的方法。而往往在开发的过程中会面临几千行几万行的代码,那么应该怎么计算呢?
分析程序时间复杂度时有以下两条规则
①加法规则:多项相加,只保留最高项,且系数变为1。T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
②乘法规则:多项相乘都保留
T(n)=T1(n)xT2(n)=O(f(n))+O(g(n))=O(f(n)xg(n))
比较数量级的方法,一般而言:
O(1)<O(log2n)<O(n)<O(nlong2n)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)【常对幂指阶】 -
通过以上推论,可知常数项是可以忽略的,而顺序执行的代码只执行一次,生成的也是常数项。所以计算时间复杂度只需挑一个循环的基本操作来分析。另外在程序里加入一段代码(无任何循环)并不影响时间复杂度。假如有多层循环,则只需关注最深层。
-
有些事件并不能一次计算时间复杂度,需要分别判断最好情况和最坏情况以及平均情况。
-
关于时间复杂度计算的步骤:①找一个基本操作(最深层的循环)。②分析该基本操作的执行次数t与问题规模n的关系,得出t=f(n)。③比较数量级,去掉常数项以及系数,即求出时间复杂度O(n)。
-
空间复杂度:算法所耗费的存储空间。
S(n) =O(g(n)) -
一个程序执行时需要存放本身所用的指令、常数、变量、和输入数据、对数据的操作的工作单元等。所以输入数据所占空间属于问题本身,与算法无关,所以空间复杂度只需分析除输入和程序之外的额外空间。空间复杂度依然遵循加法规则和乘法规则。
408考研笔记之数据结构(一):时间复杂度与空间复杂度问题
猜你喜欢
转载自blog.csdn.net/qq_38652677/article/details/105188050
今日推荐
周排行