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吗?
非常感谢任何正确方向的指导,谢谢!
答案 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个数字的乘积。你能找到他们吗?