java - 具有嵌套循环的代码片段的 Big-O

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

<分区>

我们收到了一段代码来找到它的大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 < i 可能会对此提出异议。 任何帮助和解释将不胜感激!

最佳答案

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

我的逻辑是第二级是 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。

但我知道什么!?

关于java - 具有嵌套循环的代码片段的 Big-O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36861580/

相关文章:

java - Java8 中使用多个键对映射列表进行排序

performance - 在无限长的排序数组中查找一个元素

algorithm - 四叉树 O(N) 的最坏情况复杂度如何?

javascript - 在 JavaScript 中将 O(n^3) 更改为 O(n^2)

algorithm - 您将如何找到该算法的复杂性?

java - 执行yardstick-ignite框架时发生权限错误

java - 在什么情况下遗留 Java 代码无法在新版本上编译

algorithm - 第 K 个最大的数,为什么它的运行时间是 O(n) 而不是 O(nlogn)

algorithm - "Multiplying a function by some constant doesn' 的含义 t 改变它的渐近行为”

java - 使用接口(interface)和实现实例化类