Итак, у меня есть этот счетный алгоритм из книги Алгоритмы 4-го издания, которые используются в главе анализа алгоритмов, в которых они вычисляют частоту каждого цикла, если утверждение во внутреннем цикле и из объявлений в начале.как рассчитать частоту этих блоков алгоритма счетного счета?
Каждая часть они делят его в части А, В, С, D и Е. Они сказали, что каждый из них имеет следующую частоту:
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;
}
@TedHoop Можете ли вы объяснить, как вы вычислили частичную сумму второго цикла и пришли к ответу? – ravelinx
@ravelinx - Вы имеете в виду 'N * (N-1)/2'? Это классическая сумма арифметической серии. Рассмотрим 0 + 1 + 2 + ... + '(N-1)'. Существуют термины «N», и если вы группируете числа парами с обоих концов (0 и «(N-1)»; 1 и «(N-2)» и т. Д.), То легко видеть, что среднее значение каждая пара является точно '(N-1)/2'. (Вы должны убедить себя, что это работает как для четного, так и для нечетного «N».) Так как существуют значения «N» со средним значением «(N-1)/2', то сумма должна быть« N * (N- 1)/2'. Предположительно, это рассуждение заключается в том, как Карл Гаусс установил формулу арифметических рядов, когда ему было 9 лет. –
@TedHoop да Я понимаю N * (N-1)/2, но тот, который я не понимаю, является (N^3)/6 - (N^2)/2 + N/3, что для цикла isnt сумма от суммы внутренней частоты петли? – ravelinx