我正在从事数据结构课程,而且我不确定如何继续进行这项大O分析:
sum = 0;
for(i = 1; i < n; i++)
for(j = 1; j < i*i; j++)
if(j % i == 0)
for(k = 0; k < j; k++)
sum++;
我最初的想法是在减少之后这是O(n ^ 3),因为最内层循环仅在j
/ i
没有余数并且乘法规则不适用时运行。我的推理在这里是否正确?
答案 0 :(得分:50)
让我们在这里忽略外循环一秒钟,让我们用i
来分析它。
mid循环运行i^2
次,每当j%i == 0
调用内循环,这意味着你在i, 2i, 3i, ...,i^2
运行它,并且每次运行直到相关j
1}},这意味着运行时间的内循环总和为:
i + 2i + 3i + ... + (i-1)*i = i(1 + 2 + ... + i-1) = i* [i*(i-1)/2]
最后的平等来自sum of arithmetic progression。
以上是O(i^3)
。
对从1
到n
的外部循环重复此操作,您将获得O(n^4)
的运行时间,因为您实际拥有:
C*1^3 + C*2^3 + ... + C*(n-1)^3 = C*(1^3 + 2^3 + ... + (n-1)^3) =
= C/4 * (n^4 - 2n^3 + n^2)
最后一个等式来自sum of cubes
以上是 O(n^4)
,这是你的复杂性。