因此,我在算法分析一章中使用了算法第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;
}
答案 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上设置边界,但如果不对输入做出一些假设,就不能说更多。