2019独角兽企业重金招聘Python工程师标准>>>
在讨论区搜索时间复杂度时看到的,答案其实在评论几位大神里已经给出了,无奈当时看半天愣是没看懂,回家拿笔算了下才算理顺了,这里就把思路记录下。
关于时间复杂度的概念就不说了,不敢说理解透彻,关键语言组织不好,还是看书吧。
代码是这样的:
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)