【发布时间】:2016-06-05 17:18:29
【问题描述】:
你如何找到这段代码的渐近时间复杂度?
for i=1 to n do
j=2
while j<i do
j=j*j
在我的笔记中我有答案 O(n*log(logn)) 但没有解释。
【问题讨论】:
标签: algorithm time-complexity nested-loops
你如何找到这段代码的渐近时间复杂度?
for i=1 to n do
j=2
while j<i do
j=j*j
在我的笔记中我有答案 O(n*log(logn)) 但没有解释。
【问题讨论】:
标签: algorithm time-complexity nested-loops
第一个 for 循环运行 n 次。内部循环以正方形进行迭代,因此将采用 O(loglogn) 因此,总复杂度为 O(n*log(logn))。
要了解为什么在正方形中迭代需要O(log(logn)) 时间,请查看以下方式:
假设 n 与 2^16 一样大。
Initially: j = 2
1st step : j = 2^2
2nd step : j = 2^4
3rd step : j = 2^8
4th step : j = 2^16.
因此只需要 4 个步骤,即 loglog(2^16)。
所以现在对于任何n = 2^k,您都从 2 开始,并且每次都在平方。因此,您最多可以进行O(logk) 平方来达到k。由于n = 2^k,所以,k = log(n),因此O(logk) 与O(log(logn)). 相同
【讨论】: