Algorithm 包含条件的代码的时间复杂度 foo(int n) { int s=0; 对于(inti=1;i
来说,复杂性是Algorithm 包含条件的代码的时间复杂度 foo(int n) { int s=0; 对于(inti=1;i,algorithm,time-complexity,Algorithm,Time Complexity,来说,复杂性是O(n^4) 最里面的循环将为每个i执行i次(i在0..i*i内i的倍数) 这就像内部循环将运行 foo(int n) { int s=0; for(int i=1;i<=n;i++) for(int j=1;j<=i*i;j++) if(j%i==0) for(k=1;k<=j;k++) s++; } 这些x表示复杂度j的最内层for循环的执行。其余时间未触及该循环,仅完成测试,
O(n^4)
最里面的循环将为每个i
执行i
次(i
在0..i*i
内i
的倍数)
这就像内部循环将运行
foo(int n)
{
int s=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=i*i;j++)
if(j%i==0)
for(k=1;k<=j;k++)
s++;
}
这些x
表示复杂度j
的最内层for循环的执行。其余时间未触及该循环,仅完成测试,结果失败
现在检查一下,这些\-/
有i*j
(j=1,2,3…i)
循环和i
检查
现在我们精确地执行i
次
j = 0 1 2...i i+1 ...2*i ....3*i .... 4*i .... 5*i... i*i
x x x x x x
\------/\--------/\-------/ \------/
对于外部循环,它将是n^4
这是什么意思?整个作品可以这样划分
So total work = i*(1+1+1+...1) + i*(1+2+3+..i)
= i*i+ i*i*(i+1)/2 ~ i^3
现在,如果我们迭代j
,那么它将具有复杂性O(n^3)
通过添加外部循环,它将是
O(n^4)
您的函数计算四维金字塔数()。可以使用以下公式计算到s
的增量数:
O(i*j+i)
^^^ ^
| The other cases when it simply skips
The innermost loop executed
因此,函数的复杂性为O(n4)
它不是O(n5)的原因是if(j%i==0)
仅对i
的倍数进行“有效载荷”循环,其中我们在所有j
中有i
,范围从1
到i2,包括在内
因此,我们添加一个最外循环,一个用于中间的循环,一个用于最内层循环,因为它迭代到I2,总共为4。
为什么中间(j)只有一个?它运行到i2,对吗 如果我们重写代码以排除该条件,可能会更容易看到:a(n) = n*(1+n)*(2+n)*(1+3*n)/24
ints=0;
对于(int i=1;i关于j循环呢?它将被执行i*i次。@Zephyr.:是的……等待将在一段时间内尝试解释更多。那么求和表达式将像(从i=1到n){((i^2-i)+(从k=1到i)(ki))}@Zephyr.:是的。这就是解释的。为什么中间(j)只有一个它运行到$i ^ 2 $右边?@ ZePHR是正确的,即使中间的循环上升到<代码> n^ 2 < /代码>,它也不会做任何事情,除非<代码> i <代码>分割<代码> j>代码>,这对于<代码>(n^ 2-n)< /代码> < <代码> j>代码>是正确的。仅对j
的n
值执行。因此求和表达式将类似于(从i=1到n){((i^2-i)+(从k=1到i)(ki))}
int s=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
for(int k=1;k<=i*j;k++)
s++;
return s;