【问题标题】:How do you find the asymptotic time complexity of these loops?你如何找到这些循环的渐近时间复杂度?
【发布时间】: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


    【解决方案1】:

    第一个 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)). 相同

    【讨论】:

    • 但是你能更详细地解释一下为什么内部循环需要 O(logn*logn) 时间吗?
    • @DaMike :用解释更新了答案
    • 谢谢,我想我明白了!
    • 还有,你一开始就打错了lognlogn,但它不允许我编辑它(编辑必须至少10个字符或其他东西)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多