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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


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

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

代码是这样的:

for(int i=2;i<=n;i*=i)
    for(int j=0;j
主要是两个循环的复杂度*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

你可能感兴趣的:(python)