对于以下每个程序片段,请对运行时间进行Big-Oh分析。我有两个问题,我不是100%肯定,如果有的话,有人可以帮助我
片段1:
for( int i = 0; i < n; i++ )
for( int j = 0; j < n * n; j++ )
for( int k = 0; k < j; k++ )
sum++;
答案:O(n ^ 5)不确定n * n ??
片段2:
for( int i = 1; i <= n; i++ )
for( int j = 1; j <= i * i; j++ )
if (j % i == 0)
for( int k = 0; k < j; k++)
sum++;
答案:为O(n ^ 4)
答案 0 :(得分:0)
每个循环分解问题空间。从最外层循环开始。真正的循环是什么?
对于第一个问题,我们有以下模式。
以下是求和的实际情况。
那么,这会转化为什么?你必须展开总和。但是,它不会是O(n 5 )。
对于第二个问题,我们有以下模式。
j % i == 0
的条件下,最里面的循环运行到 j 次。这意味着最里面的循环不是每隔时间执行。我会留下这个问题让你解决。你必须采取展开总和并将它们减少到代数对应物的方法。
答案 1 :(得分:-1)
:
lets say m = n^2
Sigma(i=0...n) m Sigma(j=0.....m) j
=> n * (m(m+1)/2)
=> n ^ 5
答案:O(n ^ 5)
片段2的:
last loop runs for i-1 times ...
Sigma(i=0...n) Sigma(j=0.....i-1) Sigma(k=0.....j) k
approximately its Sigma(i=0...n) i^2
~=> n^3
答案:为O(n ^ 3)