分析执行频率代码

时间:2013-08-12 13:49:21

标签: java algorithm

我试图找出以下代码中某些陈述的执行频率 我想检查给定输入数组执行循环的次数。

为此,我添加了三个变量icntjcntkcnt

public class FreqCounter{

    public static void count1(int[] a){
        int N = a.length;
        int count = 0;
        int icnt = 0;
        int jcnt = 0;
        int kcnt = 0;
        for(int i=0;i<N;i++){
            icnt++;
            for(int j=i+1;j<N;j++){
                jcnt++;
                for(int k=j+1; k<N;k++){
                    kcnt++;
                }
            }
        }

        System.out.printf("i loop=%d times\n",icnt);
        System.out.printf("j loop=%d times\n",jcnt);
        System.out.printf("k loop=%d times\n",kcnt);
    }

    public static void main(String[] args) {
        int N = 100;
        int[] a =  new int[N];
        count1(a);
    }
}

我得到了以下输出

i loop=100 times
j loop=4950 times
k loop=161700 times

我尝试分析如下

  1. 外部for循环(i = 0到&lt; N)

    这会执行N次,因此对于N=100,计数将为100

  2. 内部循环(j = i + 1至&lt; N)

    这相当于找到N个元素的组合,一次取2个

    表示C(N,2) = N! /((N-2)! * 2!) = (N *(N-1))/2 = ((N^2)/2)-(N/2)

    对于N=100,这将是(100*100/2)-50 = 4950

  3. 最内层循环(k = j + 1至&lt; N)

    相当于找到N个元素的组合,一次取3个

    C(N,3) = N!/((N-3)! * 3!) = N*(N-1)*(N-2)/3! = (N^3/6)-(N^2/2)+N/3

    对于N=100,这将是100^3/6 - 100^2/2 + 100/3 = 161700

  4. 我得到了正确的值,但想知道分析(组合的东西)是否合适。(我最近才学习了排列/组合课程。)如果有人可以为此分析添加更多内容,那将会有所帮助

1 个答案:

答案 0 :(得分:1)

你的组合完全正常,你有n个不同的元素,你需要多少可能选择3个元素,顺序无所谓,没有重复。这确实是C(N,3)

(免责声明,我在过去几个月里是一名组合学助教)