帮助解密此代码及其运行时

时间:2010-12-08 03:42:52

标签: syntax big-o

int[][] A = new int [n][];
for (int i=0; i<n; i++) {
    if (i % 2 == 0) // i is a multiple of 2
        A[i] = new int [n];
    else
        A[i] = new int [1];
}

for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++)
        sum = sum + A[i][j];

所以我对阵列的作用感到有些困惑。第一行初始化具有n列的2D数组。第一个for循环查看每列。如果它是偶数列,则将n放在该列的第一行中。现在我对此感到有点困惑,因为即使它应该是一个2D数组,它只被引用一个括号。 double for循环也是如此。 A.length和A [i] .length之间有什么区别?根据我的理解,double for循环遍历数组并获得所有元素的总和。有人可以澄清一下,因为我在语法上有点迷失。

另外,我的直觉说这个代码至少在O(n ^ 2)时间运行,因为for循环是双重的。这看起来是对的吗?

2 个答案:

答案 0 :(得分:1)

如果你认为A不是一个二维数组(我们通常认为是矩形),而是一个整数数组的数组,它可能会有所帮助。外部数组包含n个int数组,每个数组的大小可能不同。

A[i] = new int [n]实际上做的是在数组A的第i个元素中放置一个大小为n的数组。A[i].length是存储在A中位置i的数组的长度。

你对O(n ^ 2)和嵌套for循环的直觉在这里通常是正确的。

答案 1 :(得分:0)

看起来你的算法不完整。

顶部初始化一个2D数组,使得每个偶数顶级数组元素的长度为n,每个奇数顶级数组元素的长度为1。

在下半部分,外部循环遍历所有顶级元素。有这样的元素。对于每个元素,内部for循环对子元素求和。这些元素中有n个和1个交替。

如果这是Java,那么默认情况下每个int []数组元素的内容都是0.如果是,那么最后的总和将是0.你将花费O(n *(n / 2 +) n))= O(n ^ 2)得到答案。