关于一个时间复度的看法

	int sum=0;
	for(int i =1;i<n;i*=2)
		for(int j=0;j<i;j++)
		sum++;

问怎么求这个代码的时间复杂度。

对于以往的题目来说,直接看最大循环的次数就好,但是外层循环和内层循环的次数不是固定的,那么我们需要根据循环内部的判定条件来判定时间复杂度。

对于外层循环可能的情况为:1 2 4 8 … … 2i2^i2i 并且 2i2^i2i<n<=2i+12^{i+1}2i+1
然后对于内部循环的情况比较清楚,是直接加了外层循环的次数即i
那么总的时间复杂度为 1+2+4+…+2i2^i2i=2i+1−12^{i+1}-12i+11(代入二进制数算也可以得到)

且对于上式2i2^i2i<n<=2i+12^{i+1}2i+1 我们可以得到
(总时间)T>=n-1且
T<=2n-1

那么总的时间复杂度为O(n) 。

再换一个例子

	int i =1;
	while(i<=n)
	i=i*2;

对于这个代码,设操作的次数为t,那么每操作一个i的值都会乘2,那么i的值为2t2^t2t
2t2^t2t<=n,那么t<=log⁡2n\log_2nlog2n,那么总的时间复杂度为O(log⁡2n\log_2nlog2n).

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值