java - for循环算法的Big-O分析

标签 java algorithm for-loop big-o

我在分析以下 for 循环算法时遇到问题:

for (int i = 1; i < n; i = i * C)
    for (int j = 0; j < i; j++)
        Sum[i] += j * Sum[i];

我知道第一行的复杂度为 O(logn)(只要 C > 1),但让我难过的是第二行。我相信我了解它正在发生的事情的基础知识:

例如,

if n=20, the inner loop will do 1+2+4+8+16 "work".

但是我不知道怎么写出来。我几乎可以肯定循环中完成的总工作量是 O(n),第一行是 O(logn),但我如何更具体地指定中间行的作用?

最佳答案

i 将具有以下形式的值:

C^0, C^1, C^2, ...., C^ log_c(n)

因此内部循环将运行 C^0 + C^1 + C^2 + ... + C^log_c(n) 次。这是一个几何级数,总结为:

enter image description here

所以用 C 代替 r,用 log_c(n) 代替 n 我们得到:

(1-C^log_c(n))/(1-C) = (1-n)/(1-C),对于任何 C > 1 都是正的 并与 n 成正比。因此,复杂度确实是 O(n)

(公式图片取自Wikipedia)

关于java - for循环算法的Big-O分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466483/

相关文章:

java - 按后退按钮或 F5 时如何调用托管 bean 上的方法?

java - 通过连续自然数的加法或减法获得一个数

c++ - 回溯算法卡住了

java - android ImageView 内存不足错误

java - 了解递归流程

java - $Proxy0(来源不明)jboss

algorithm - 证明一台共享机器和一台具有无限并行容量的调度算法

for-loop - 打印星号的三角形图案

excel - 如果 cell.value A = x,则 cell.value N = 公式

javascript - 如何将数组中的值放入 td 元素中