代码的时间在Java中的嵌套for循环中执行

pho*_*sis 1 java algorithm

我最近正在阅读Robert Sedgewick 所着的名为Algorithms的书.我在阅读"算法分析"时遇到了一段代码.代码如下:

public static int count(int a[]) {
    int N = a.length;
    int cnt = 0;
    for (int i = 0; i < N; i++) {

        for (int j = i + 1; j < N; j++) {
            for (int k = j + 1; k < N; k++) {
                if (a[i] + a[j] + a[k] == 0) {  //here 
                    cnt++;
                }
            }
        }
    } 
    return cnt
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是-loop中if-statement for执行了多少次.这本书提供的答案是N(N-1)(N-2)/6.但我不知道为什么,任何人都可以解释.

Vin*_*ele 6

您只需要评估以下总和:

在此输入图像描述

你可以手动完成,但Wolfram Alpha在这方面要好得多.

验证这一点并不难

(N-1)(N-2) = N2 - 3N + 2

它显示了你给出的公式.


对于手动分析:

从内部总和开始,这很容易:

在此输入图像描述

在中间总和中插入这个给出:

在此输入图像描述

如果虚拟变量从0(而不是i+1)开始,则此总和将更容易评估,因此我们应用虚拟变换p = j - i - 1:

在此输入图像描述

最后,这必须插入外部总和:

在此输入图像描述