这个执行频率是怎么算的?

发布于 2022-09-03 13:41:18 字数 1014 浏览 15 评论 0

看到一段有关于算法分析的代码,带着注释:

public class ThreeSum
{
    public static int count(int[]a)
    {
        // 统计和为0的元组数量
        int N = a.length;
        int cnt = 0;
        for (int i =0;i<n;i++)    //1
            for(int j=i+1;k<n;j++)  //执行频率N
                for(int k =j+1;k<n;k++) //执行频率略等于n^2/2
                    if(a[i]+a[j]+a[k]==0)//执行频率略等于n^3/6
                        cnt++;
        return cnt;            
    }
    public static void main(String[]args)
    {
        int [] a = In.readInts(args[0]);
        StdOut.println(count(a));
    }
}

代码干的事情就是获取一组数字然后去找三个和为0的元组数量。想问的是这个执行频率是怎么计算的?
拿这部分代码说事:

        for (int i =0;i<n;i++)    //1;这里为什么是1?我觉得应该是N啊
            for(int j=i+1;k<n;j++)  //执行频率N;这里应该是N^2
                for(int k =j+1;k<n;k++) //执行频率略等于N^2/2;这里应该是N^3,话说为什么要/2?
                    if(a[i]+a[j]+a[k]==0)//执行频率略等于N^3/6;无法理解。为什么在这里是N^3/6,而且/6是怎么来的?
                        cnt++;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拥抱影子 2022-09-10 13:41:18
for (int i =0;i<n;i++)    //1
            for(int j=i+1;j<n;j++)  //执行频率N
                for(int k =j+1;k<n;k++) //执行频率略等于n^2/2
      

你可以这样来看,如下:
n=1,第一个for循环执行1次,第二个for循环执行0次,第三个for循环不执行,共执行1次。
n=2,第一个for循环执行2次,第二个for循环执行1次,第三个for循环不执行,共执行3次。
n=3,第一个for循环执行3次,第二个for循环执行2次,第三个for循环执行1次,共执行6次。
.....
依次类推:
你看这个就是前n项和的求和公式嘛:(1+n)*n/2 = n^2/2

赠意 2022-09-10 13:41:18

这注释应该是从外到内求值计算.

for(i=0; i<n; i++)//执行1次,指该循环执行一次
{//循环体内执行n次
}

定理1:
前n项和

clipboard.png
定理2:

clipboard.png
推演通用公式:

clipboard.png

for (int i =0;i<n;i++)    //1指循环体执行一次
    for(int j=i+1;k<n;j++)  //N指该语句执行N次
        for(int k =j+1;k<n;k++) //n^2/2:前N项和的定理1
            if(a[i]+a[j]+a[k]==0)//n^3/6:1/2(n^2)中的n^2的前n项和为n^3/3再乘以1/2
                cnt++;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文