这个简短代码的运行时复杂性是多少?

时间:2017-09-11 21:07:50

标签: algorithm asymptotic-complexity

我在编程实践网站上找到了这个解决方案,它说复杂性是O(N)。但是,它看起来更像是O(N ^ 2)。有人可以告诉我为什么这是O(N)?

public static void transposeMatrix(int[][] matrix) {
    int n = matrix.length - 1;
    int temp = 0;
    for(int i = 0; i <= n; i++){
        for(int j = i+1; j <= n; j++){
            temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

3 个答案:

答案 0 :(得分:6)

什么是N

如果Nmax(matrix.length, matrix[0].length),则算法为O(N ^ 2),正如您所说。

如果N 矩阵的总大小,则算法为O(N)。

确切地定义大{O}符号中的N是非常重要的。在学习Big-O时,大多数讨论围绕着单维输入,人们认为你不必定义N。在现实世界中,事物很脏,我们处理多维输入,你必须非常清楚N是什么。

答案 1 :(得分:1)

不是O(n)。它是O(n ^ 2)。具体来说,它将执行0≤i≤n的n-i交换。因此它将执行0 + 1 + 2 + ... + n swaps = n(n + 1)/ 2个交换,即O(n ^ 2)。

答案 2 :(得分:0)

  

n = matrix.length - 1;

时间复杂度:O(N ^ 2)

空间复杂度:O(1)

  

说明:在第一个for循环中,我将从(0 --- N)开始。并在   第二个for循环,j将从(i + 1 --- N)开始。对于i = 0,您进行迭代   N-1个元素。对于i = 1,您迭代N-2个元素。同样,For i =   N-1,你迭代最后一个元素

In total, T  = (N-1) + (N-2) + (N-3) + ... + 2 + 1

T ~ N * (1+2+3+...+N)

T ~ O(N^2)