Time complexity 3个循环的硬大O复杂度
我试图计算这段代码的大O复杂度,但我总是失败 我尝试nest SUM’s或获得每个案例的步骤数,如: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++)
- 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)