一段代码的时间复杂度计算

本文详细解析了一个包含特殊递增方式的双重循环的时间复杂度计算过程,通过数学推导得出最终的时间复杂度为O(n)。

在讨论区搜索时间复杂度时看到的,答案其实在评论几位大神里已经给出了,无奈当时看半天愣是没看懂,回家拿笔算了下才算理顺了,这里就把思路记录下。

关于时间复杂度的概念就不说了,不敢说理解透彻,关键语言组织不好,还是看书吧。

代码是这样的:

for(int i=2;i<=n;i*=i)
    for(int j=0;j<i/2;j++)
        foo();
主要是两个循环的复杂度*foo()的复杂度。

内循环是常见的累加,复杂度与i有关。如果外循环也是一个简单的累加的话,那个时间复杂度就很简单是

O(n+n+n+......+n) = O(n^2)

然而现在外循环的步长不是1,i是以i*=i的形式递增的。

i = i, i^2, i^4, i^8, i^16, ......, i^2^x

i<=n   ==>>   2^2^x=n   ==>> x=loglogn

其实计算方式还是一样的,说的简单粗暴点,个人理解算时间就是循环内语句块执行的次数。于是foo()执行的次数就是:

S    = 2^2^0 , 2^2^1, 2^2^2, 2^2^3, 2^2^4, ......, 2^2^x

      = 2^1, 2^2, 2^4, 2^8, ......, 2^y                       (y=2^x)

2S  =         2^2, 2^4, 2^8, ......, 2^y, 2^(y+1)

2S-S=S=2^(y+1)-2^1 = 2^y = 2^2^(loglogn)=n

所以时间复杂度就是O(s)=O(n)


转载于:https://my.oschina.net/zhudibrian/blog/168121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值