3个嵌套for循环的大O?

时间:2017-09-13 22:26:02

标签: java big-o complexity-theory

public int Loop(int[] array1) {
        int result = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1.length; j++) {
                for (int k = 1; k < array1.length; k = k * 2) {
                    result += j * j * array1[k] + array1[i] + array1[j];
                }
            }
        }
        return result;
    }

我正在尝试找到计算算术运算次数的复杂度函数。我知道复杂性类是O(n ^ 3),但是我在计算步骤时遇到了一些麻烦。

到目前为止,我的理由是计算算术运算的数量是8,复杂函数的数量是8n ^ 3吗?

非常感谢任何正确方向的指导,谢谢!

3 个答案:

答案 0 :(得分:7)

第一个循环将运行n次,第二个循环将运行n次,但第三个循环将运行log(n)次(基数2)。因为每次反向操作将采用日志时,k乘以2。乘以我们O(n^2 log(n))

答案 1 :(得分:2)

如果我们同意以下是一大步: result += j * j * array1[k] + array1[i] + array1[j] 然后让我们称之为 incrementResult

在这里调用 incrementResult 多少次? (log n)

for (int k = 1; k < array1.length; k = k * 2) {
  // incrementResult 
}

让我们称之为 loop3 。那么在这里调用 loop3 多少次? (n)的

for (int j = 0; j < array1.length; j++) {
  // loop 3
}

让我们称之为 loop2 。那么,在这里调用 loop2 多少次? (n)的

for (int i = 0; i < array1.length; i++) {
  // loop 2
}

将所有这些相乘,你就会得到答案:)

答案 2 :(得分:1)

这取决于循环。例如:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 10; k++) {
            sum += i * j * k;
        }
    }
}

具有复杂度O(1),因为迭代次数完全不依赖于输入。

或者这个:

for (int i = 0; i < n*n*n*n*n*n; i++) {
    sum += i;
}

是O(n ^ 6),即使只有一个循环。

真正重要的是每个循环产生多少次迭代。

在您的情况下,很容易看出最内层循环的每次迭代都是O(1)。有多少次迭代?在你到达n之前,你需要将一个数字翻倍?如果x是迭代次数,我们将在第一个x处退出循环,使得k = 2 ^ x&gt; ñ。你能解决这个问题吗?

第二个循环的每次迭代都会这样做,因此第二个循环的成本是迭代次数(这次更容易计算)乘以内循环的成本。

第一个循环的每次迭代都会执行此操作,因此第一个循环的成本是迭代次数(也很容易计算)乘以第二个循环的成本。

总的来说,运行时是3个数字的乘积。你能找到他们吗?