Time complexity 3个循环的硬大O复杂度

Time complexity 3个循环的硬大O复杂度,time-complexity,big-o,complexity-theory,nested-loops,code-analysis,Time Complexity,Big O,Complexity Theory,Nested Loops,Code Analysis,我试图计算这段代码的大O复杂度,但我总是失败 我尝试nest SUM’s或获得每个案例的步骤数,如: i=1 j=1 k=1(1步) i=2 j=1,2 k=1,2,3,4(4步) i=n(我说n=2^(logn)j=1,2,4,8,16,…,nk=1,2,3,4 然后把所有步骤加起来,我需要帮助 for (int i=1; i<=n; i*=2) for (int j=1; j<=i; j*=2) for(int k=1; k<=j*j; k++)

我试图计算这段代码的大O复杂度,但我总是失败

我尝试nest SUM’s或获得每个案例的步骤数,如:

  • i=1 j=1 k=1(1步)
  • i=2 j=1,2 k=1,2,3,4(4步)
  • i=n(我说n=2^(logn)j=1,2,4,8,16,…,nk=1,2,3,4
然后把所有步骤加起来,我需要帮助

for (int i=1; i<=n; i*=2)

   for (int j=1; j<=i; j*=2)

      for(int k=1; k<=j*j; k++)

           //code line with complexity code O(1)
for(int i=1;i

如果我们可以用'n'来表示最大的界,那么最里面的循环就是一个微不足道的循环。
和{1,2,3,4,…}}1,k中的{k

如果我们可以用'n'来表示最大的界,那么最里面的循环就是一个微不足道的循环。

让我们看一下内部循环运行的次数:
j2
。但是
j
以2的幂次前进到
i
i
依次以2到
n的幂次前进。所以让我们“画图”用一个简单的图表来表示总的迭代次数:

以下是Wolfram Alpha对求和的看法:

C1n2-C2log(n)-C3 去掉所有不太重要的项和常数,结果是

O(n2) O(n2)
让我们看一下内部循环运行的次数:
j2
。但是
j
以2的幂到
i
依次以2的幂到
n
的幂进行步进。因此,让我们“绘制”一个关于求和的小图形,它将给出总迭代次数:

以下是Wolfram Alpha对求和的看法:

C1n2-C2log(n)-C3 去掉所有不太重要的项和常数,结果是

O(n2) O(n2)
我投票结束这个问题,因为它不是关于实际编程,而是属于实际编程。我不认为这是O(1)。只有外两个循环是nlogn@MadPhysicistOP的意思是最里面的循环中的代码是任意的,复杂度为O(1)@BenJones关于O(1)你是对的我把它放在那里,而不是一个与O(1)相等的代码行complexity@Ben.明白了。答案通过小编辑保持不变。我投票将这个问题作为离题结束,因为它不是关于实用编程的,而是属于实际编程。我不认为这是O(1).只有外面的两个环是nlogn@MadPhysicistOP是说最里面的循环中的代码是任意的,复杂度为O(1)@BenJones关于O(1)你是对的,我把它放在那里,而不是一个与O(1)相等的代码行 complexity@Ben.明白了。答案只需稍加修改即可。我已经用更令人信服的答案替换了我的答案。这是一个上界,但如果@madpysicast的推理是正确的(看起来是正确的),那么这就不是我们能得到的最严格的上界了。@BenJones,我有一天会花时间的(不是今天)使用西格玛符号进行严格的分析,找出最紧的渐近界。我用更令人信服的答案代替了我的答案。这是一个上界,但如果@MadPhysicast的推理是正确的(似乎是正确的),那么这就不是我们能得到的最紧的上界。@BenJones,总有一天我会花时间的(不是今天)使用西格玛符号进行严格的分析,以找到实际上最紧的渐近界。
To touch base, only the outermost and second outermost
have now been reduced to

  sum_{I in {0, 1, ... }}^{log n} sum_{J in {0, 1, ...}}^{I} ...

Which is (if there would be no innermost loop) O((log n)^2)
Innermost loop is a trivial one if we can express the largest bound in terms of `n`.

  sum_{k in {1, 2, 3, 4, ...}} 1, k <= j^2 (+)

As above, let 2^J = j and note that j^2 = 2^(2J)

  sum_{k in {1, 2, 3, 4, ...}} 1, k <= 2^(2J)

Thus, k is bounded by 2^(2 max(J)) = 2^(2 max(I)) = 2^(2 log(n) ) = 2n^2                (***)
---- 1 ^ 1 4 | 1 4 16
log2(n)
... | 1 4 16 ... n2/16 v 1 4 16 ... n2/16 n2/4 ---- 1 4 16 ... n2/16 n2/4 n2 |<------
log2(n)
------>| log2(n) Σ 22z(log2(n) + 1 - z) z = 1 C1n2 - C2log(n) - C3 O(n2)