我想知道以下算法的时间复杂度。乍一看,时间复杂度看起来是O(n ^ 5),这就是我在互联网上看到的大多数网站所提到的。但仔细分析似乎给出了不同的答案,这里是代码:
public void fun(int n)
{
int i,j,k,sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<i*i;j++)
{
if(j%i==0)
{
for(k=0;k<j;k++)
sum++;
}
}
}
}
答案 0 :(得分:2)
请注意,j%i c== 0
将产生true
O(i)
次(对于每个不同的i
) - 因此内部循环将在每个&{重复O(i)
次#34;外&#34;迭代。
因此,复杂性为O(n*n^2 + n*n^3) = O(n^4)
<强>说明:强>
O(n*n^2)
用于&#34;中间循环&#34;无论对if条件的评估如何,它都会重复。它是O(n^3)
,因为您得到:1 + 4 + 9 + 16 + ... + n^2
,这是sum of squares并且是O(n^3)
。
O(n*n^3)
有点棘手:
对于每个i
,每个内循环重复i
次,因此对于每个i
,您得到:
i + 2i + 3i + ... + (i-1)i
完全重复内循环。很容易看出它实际上是i(1 + 2 + ... + i-1)
O(i^3)
。
现在,我们可以看到,因为它发生在每个i
- 总复杂性将是(不是正式的,只是直观的):O(1^3) + O(2^3) + ... + O(n^3)
,O(n^4)
来自sum of cubed series }}
<强>结论:强>
虽然冷分析可能显示O(n^5)
- 因为内循环不会在中间循环的每次迭代中重复 - 总复杂度为O(n^4)