数据结构——时间复杂度

本文深入解析了算法的时间复杂度概念,包括基本运算的频度、常见渐进时间复杂度及加法规则与乘法规则。并通过两个例题,具体演示了如何计算程序段的时间复杂度。

时间复杂度

一个语句的频度是该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值