我正在阅读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?它背后的逻辑是什么?
任何帮助将不胜感激!
如果您能理解该N(N-1)(N-2)部分,则有以下想法:
N(N-1)(N-2)
取3个数字的组合,即i,j,k,无论这3个数字属于哪个范围,0 <= i,j,k < N并且彼此不同(这在代码中也要小心,这就是为什么公式N(N-1)(N-2)不是的原因N^3。
0 <= i,j,k < N
N^3
现在,让我们说数字是13、17、42。它们的轮回数字并不重要。您可以采用几种方式排列它们?
13-17-42 13-42-17 17-13-42 17-42-13 42-13-17 42-17-13
六!
这些方式中有多少种可以出现在代码中?只有一个!(这是照顾中的initializaton j和k)。
j
k
因此,的总数N(N-1)(N-2)应除以6。
6