时间复杂度
一个语句的频度是该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n)。T(n)是该算法问题规模n的函数,而时间复杂度主要分析T(n)的数量级。算法中基本运算(最深层循环内的语句)的频度与T(n)同数量级,因此通过采用算法中基本运算的频度f(n)来分析算法的时间复杂度。因此记为
T(n) = O(f(n))
我们一般讨论的是最坏时间复杂度,因为最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,分析最坏的情况以估算算法指向时间的一个上界。
常见的渐进时间复杂度
O(1)<O(log_2(n))<O(n)<O(n log_2(n))<O(n ^2)<O( n ^3)<O(2 ^n)<O(n!)<O(n ^n)
两条规则
加法规则
T(n) = T_1(n) + T_2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))
乘法规则
T(n) = T_1(n) * T_2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n))
例题1
count = 0;
for (k = 1 ; k <= n ;k *= 2)
for (j = 1 ; j <= n ; j++)
count++;
(2014年)上面程序段的时间复杂度为( )
A.O(log_2(n))
B.O(n)
C.O(n log_2(n))
D.O(n ^2)
内层循环条件j<=n与外层循环的变量无关,各自独立,每执行一次j增1,所以每次内层循环都执行n次,所以内层循环的时间复杂度为O(n)。外层循环条件是k<=n,增量定义为k*=2,可知循环次数t满足k= 2^t <= n,即t <= log_2(n),所以外层循环的时间复杂度为O(log_2(n)),根据乘法规则,该程序段的时间复杂度为O(n log_2(n)),所以正确答案为C。
例题2
int func(int n){
int i = 0 , sum = 0;
while(sum < n) sum += ++i;
return i;
}
(2017年)上列函数的时间复杂度为( )
A.O(log n)
B.O(√n)
C.O(n)
D.O(n log n)
基本运算sum += ++i,它等价于++i;sum = sum + i,每执行一次 i 自增1。i=1时,sum=0+1;i=2时,sum=0+1+2;i=3时,sum=0+1+2+3;一次类推sum=0+1+2+3+…+i=(1+i)*i/2,可知循环次数t满足(1+t)*t/2<n,此函数的时间复杂度为O(√n),故选B。
本人菜鸟一只,也仅仅给自己提醒,求各位勿喷,有问题的地方请求各方大佬斧正。我看到这个写得很好很详细,推荐大家。
链接: https://blog.csdn.net/zolalad/article/details/11848739.
本文深入解析了算法的时间复杂度概念,包括基本运算的频度、常见渐进时间复杂度及加法规则与乘法规则。并通过两个例题,具体演示了如何计算程序段的时间复杂度。

2万+

被折叠的 条评论
为什么被折叠?



