循环-此算法的Big O分析是什么?
我正在研究数据结构课程,但不确定如何进行此Big 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
没有余数且乘法规则不适用时才会运行。 我的推理在这里正确吗?
user2986376 asked 2020-07-22T04:08:52Z
1个解决方案
50 votes
让我们在此忽略外循环一秒钟,然后根据O(n^4)
对其进行分析。
中间循环运行O(n^4)
次,并且每当n
都调用内部循环,这意味着您在O(n^4)
上运行,并且每次运行直到相关的j
,这意味着内部循环运行时间总和为:
i + 2i + 3i + ... + (i-1)*i = i(1 + 2 + ... + i-1) = i* [i*(i-1)/2]
最后的等式来自算术级数的总和。
以上是O(n^4)
。
对外部循环重复此操作,该循环从O(n^4)
到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)
最后一个方程式来自立方和
上面是O(n^4)
,这是您的复杂性。