这个矩阵求和代码的复杂性是多少?

时间:2017-10-28 06:48:19

标签: c# complexity-theory

我刚开始学习复杂性, 我找到了这段代码, 这段代码的复杂性是什么?是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;
}

3 个答案:

答案 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的每个值发生的事情来轻松找出复杂性:

  • 对于i = 0,内部循环将执行一次。
  • 对于i = 1,内部循环将执行两次。
  • 对于i = 2,内部循环将被执行三次。
  • ...
  • 对于i = k,内部循环将执行k + 1次。

所以总的来说我们必须计算以下总和

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)。

我希望我的描述有所帮助。