【问题标题】:Big-O of code fragment with nested loops [duplicate]带有嵌套循环的代码片段的大 O [重复]
【发布时间】:2016-04-26 10:00:37
【问题描述】:

我们收到了一段代码来找到它的 big-O:

for(int i = 1;i ≤ n;i = 2 ∗ i)
    for(int j = 1;j ≤ i;j = 2 ∗ j)
        for(int k = 0; k ≤ j; k++)
             //do something elementary

第一行应该是 O(log(n)) 但第二行变得复杂,第三行更复杂。我最初认为第二行也可能是 O(logn) 但上限 j

【问题讨论】:

    标签: java time-complexity big-o asymptotic-complexity


    【解决方案1】:

    这闻起来像家庭作业。没关系,我试试看。

    我的逻辑是第二级是 log(log n),也许是 log(log n)/2。 第三个将是 log(log(log n))。最终结果如下:

    log(n) * log(log(n)) * log(log(log(n)))。

    我会说大 O 是 log(n),因为这是最大的因素。

    为什么:

    第二个循环将迭代多少次。第一次迭代:i = 1,j = 1。它将循环 1 次。最后一次:i = n,它将循环 log(n) 次。平均而言,它将循环 log(n)/2 次。所以我的直觉是错误的……

    编辑:

    第三个循环平均运行 n/2 次。

    因此,总而言之,log(n)*log(n)n = nlog(n)^2。

    但我知道什么!?

    【讨论】:

    • 1.您能否说明第二级是 log(log n) 的原因?我不太明白为什么会这样。 2. log(n) * log(log(n)) 没有 O(log(n))。具有非常数因子的乘法确实计入大 O 因子。 (例如,n*log(n) 不仅仅是 n,因为 n 是最大的因素)
    • 时间不能小于n,因为当i = nj = i时,内循环会运行n次。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多