如果someWork(..)
完成i
次操作,此循环的Big-O是多少?随着someWork(..)
增加,算法 i
会更有效。如何用sigma表示法表示解决方案?
i <--2
while (i < n)
someWork (..)
i <-- power (i,2)
done
首先,i <-- power (i,2)
O(log n)
和someWork (..)
似乎也是O(log n)
,因为随着i
的增加,它会更有效。将这两种复杂性相乘以获得O((log n)²)
。确认?
答案 0 :(得分:3)
在循环的每一轮中,2
的指数将加倍。因此,在k
周期内,数字i
将为22k
。
只要22k < n
成立,循环就会继续,这相当于
k < log log n
。确切地说它是log₂ log₂ n
,但是由于所有logarthms对于常数因子都是相等的,所以我只写log log n
。
如果someWork()
在O(22k)
轮次中进行了k
次操作,您将获得完全复杂的
O( 2 + 22 + 222 + 223 + ... + 22log log n )
这简化为O(2 ⋅ 22log log n ) = O(n)
。
要查看简化,请查看以下内容:
数字2 + 2² + 2⁴ + 2⁸
可以二进制形式写成
100 010 110
。所以你可以看到
2 + 221 + 222 + ... + 22k < 2 ⋅ 22k
成立,因为它等于100 010 110 < 1 000 000 000
。
修改强>: