我正在阅读Sedgewick和Wayne的“算法 - 第四版”一书,我必须承认“算法分析”一章中的某些部分让我很困惑!这可能是由于我缺乏数学知识......无论如何!
本书的某处,有一个程序的例子,其中内循环被称为完全执行N(N-1)(N-2)/ 6次。这是:
public static int count(int[] a) {
int count = 0;
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; i < a.length; j++) {
for (int k = j + 1; k < a.length; k++) {
if (a[i] + a[j] + a[k] == 0) {
count++;
}
}
}
}
return count;
}
我熟悉大O符号,但是当计算循环中的确切运算次数时,我迷失了。我理解N(N-1)(N-2)部分,但为什么我们必须除以6?它背后的逻辑是什么?
非常感谢任何帮助!
答案 0 :(得分:5)
如果你能理解N(N-1)(N-2)
部分,这里有一个想法:
结合使用3个数字,i,j,k,无论3个属于0 <= i,j,k < N
范围内的哪个和另一个不同(这在代码中也要小心,这就是为什么公式为{{ 1}}而不是N(N-1)(N-2)
。
现在,我们可以说这些数字是13,17,42。它们的数字并不重要。您可以通过多少种方式将它们排成一行?
N^3
六!
这些方法中有多少可以出现在代码中?只有一个! (在13-17-42
13-42-17
17-13-42
17-42-13
42-13-17
42-17-13
和j
的初始化时要小心。
因此,k
的总数应除以N(N-1)(N-2)
。
答案 1 :(得分:4)
您可以使用Sigma表示法,并了解如何提出书中提到的公式:
答案 2 :(得分:1)
我们知道......
1 + 2 + 3 + 4 ... + N =&gt; N(N-1)/ 2
同样,最里面的循环就像
一样1.n + 2(N-1)+3(N-2)+ ... N.1 =&gt; N(N-1)(N-2)/ 6
这是proof。
答案 3 :(得分:1)
6来自3! (三个因子来自三个循环)。
考虑最外面的循环,例如,一个包含5个元素的数组。对于等式的那一部分,你计算N = 5,但是你只能在值i = 0,i = 1或i = 2的情况下到达你的内环。类似地,你用(N-1)表示下一个循环,但是你只能到达你的内部循环中的值j = 1,j = 2或j = 3而不是由(N-1)暗示的四个值)。
除以6(对于三个循环)补偿在到达最内层循环之前数组中的值将耗尽的值。