Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for-loop算法的大O分析_Java_Algorithm_For Loop_Big O - Fatal编程技术网

Java for-loop算法的大O分析

Java for-loop算法的大O分析,java,algorithm,for-loop,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]; for(int i=1;i1都是正的,并且与n成比例。因此,复杂性实际上是O(n) (公式图像取自)我将使用乳胶式符号sum_{k=a}^bf(I)来表示总和f(a)+f(a+1)+f(b),我将写a^b,表示a升到b的次幂 首先,找到正整数p,这样C^

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

for (int i = 1; i < n; i = i * C)
    for (int j = 0; j < i; j++)
        Sum[i] += j * Sum[i];
for(int i=1;i
我知道第一行的复杂性是O(logn)(只要C>1),但让我困惑的是第二行。我相信我了解it的基本情况:

比如说,

如果n=20,内部循环将执行1+2+4+8+16“功”


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

I
将具有以下形式的值:

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

因此,用
C
取代
r
,用
log\u C(n)
取代
n
,我们得到:

(1-C^log_C(n))/(1-C)=(1-n)/(1-C)
,对于任何
C>1
都是正的,并且与
n
成比例。因此,复杂性实际上是
O(n)


(公式图像取自)

我将使用乳胶式符号
sum_{k=a}^bf(I)
来表示总和
f(a)+f(a+1)+f(b)
,我将写
a^b
,表示
a
升到
b
的次幂

首先,找到正整数
p
,这样
C^p


(n-1)/(c-1)如果
n
不是
c
的幂,那么
log\u c(n)
甚至不是整数,因此
i
不会取值
c^log\u c(n)
。如果
n
C
p
次方(即:
n=C^p
),那么for循环将停止在
C^{p-1}
,因为有一个
@AndreyTyukin我同意计算不是最迂腐的,但它足以进行big-o推理。有其他方法也很好。嗯,是的。但也有一种危险,即一个人太快地删除了一些因子,然后以
C^(隐藏因子*log(n))
(多项式)而不是
隐藏因子*n
(线性)结束。在上面的计算中,立即删除系数
C
(这大约是
C^p+1
C^{p+1}
之间的系数)。事实证明,在这种情况下是可以的。但是在另一种情况下,如果总的努力是像
2^{cn}
而不是
2^n
,那将产生很大的不同。
T = C^0 + C^1 + ... + C^p = sum_{k=0}^p C^k = (C^{p + 1} - 1) / (C - 1)
p < log_C(n) <= p+1
log_C(n) - 1 <= p < log_C(n)
(n - 1) / (c - 1) <= (C^{p + 1} - 1) / (C - 1) = T < (Cn - 1) / (c - 1)