如何计算这个计数算法语句块的频率?

时间:2016-03-30 04:00:52

标签: algorithm for-loop code-complexity

因此,我在算法分析一章中使用了算法第4版中的计数算法,其中它们计算每个循环的频率,if内部循环中的语句和beguinning中的声明。

他们将每个部分分为A,B,C,D和E部分。 他们说每个人都有以下频率:

E  = X (depends on input)
D = (N^3)/6 - (N^2)/2 + N/3
C = (N^2)/2 - N/2
B = N
A = 1

我知道所有这些频率来自部分总和,但我不明白他们是如何得出每个答案的,如果有人能解释我为什么每个频率都是这样的话,我将不胜感激。

public static int count(int[] a)
{
   int N = a.length; // Part A
   int cnt = 0;  // Part A

   for(int i = 0; i < N; i++)  //Part A
      for(int j = i+1; j < N; j++) // Part B
         for(int k = j+1; k < N; k++) // Part C
            if(a[i] + a[j] + a[k] == 0  // Part D
               cnt++; // Part E

   return cnt;
}

1 个答案:

答案 0 :(得分:0)

A部分应该是显而易见的:前三行执行一次。

B部分(外部循环体)对外循环的每次迭代执行一次,共计N次。

C部分(第二个循环的主体)对外循环的每次迭代执行N - i - 1次,其中i从0变为N-1。当您加总和(i = 0 .. N - 1){i}时,您会得到N*(N-1)/2(N^2)/2 - N/2

D部分(第三个循环的主体)对第二个循环的每次迭代执行i - j - 1次,其中i从0变为N-1,并且j从0到i - 1不等。当你添加这个双重总结时,你会得到D的结果。

E部分(if语句的主体)执行从0开始的任何地方(例如,所有a[i]值都是正数)到D次(例如,所有a[i]值都是零)。因此,您可以在X上设置边界,但如果不对输入做出一些假设,就不能说更多。