Java for-loop算法的大O分析
我在分析以下for循环算法时遇到问题: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 (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)