我刚开始学习复杂性, 我找到了这段代码, 这段代码的复杂性是什么?是O(n!)?
public static int func(int[][] mat)
{
int sum = 0;
for(int i = 0; i < mat.Length; i++)
{
for(int j = 0; j <= i; j++)
{
sum += mat[i][j];
}
}
return sum;
}
答案 0 :(得分:1)
有两种类型的复杂性,即时间和内存复杂性。我想在这里你想知道时间的复杂性。
在您的示例中,我假设您的数组大小为NxN。为了计算时间复杂度,您可以计算步数。所以,如果我们从1开始第一次for
循环:
i = 0, with the second loop 1 addition.
i = 1, with the second loop 2 additions.
...
i = n, with the second loop n + 1 additions.
总步数为1 + 2 + ... + n +(n + 1)=(n + 1)*(n + 2)/ 2
这就是为什么这个例子的时间复杂度 O(n ^ 2)。
答案 1 :(得分:1)
不,不是O(n!)
。您可以通过尝试考虑i
的每个值发生的事情来轻松找出复杂性:
所以总的来说我们必须计算以下总和
1+2+3+...+ n+1 = (n+1)(n+2)/2 = (n^2+3n+2)/2
上述总和显然是O(n^2)
。
答案 2 :(得分:1)
不,答案不是O(n!)。
最简单的方法是为“i”变量设置一个值,通过这项工作,您可以理解其复杂性。
我会告诉你如何找到代码的复杂性:
声明的复杂性是1.如果我想展示你的代码示例,我可以指出:
int sum = 0;
和for循环: (see image) Complexity description
T(n)=(n + 1)+ n *(n + 2)+ n *(n + 1) T(n)= 2n ^ 2 + 4n + 1
==&GT; O(n ^ 2)。
我希望我的描述有所帮助。