关于一个时间复度的看法

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

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

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

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

且对于上式 2 i 2^i 2i<n<= 2 i + 1 2^{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的值为 2 t 2^t 2t
2 t 2^t 2t<=n,那么t<= log ⁡ 2 n \log_2n log2n,那么总的时间复杂度为O( log ⁡ 2 n \log_2n log2n).

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值