Я пытаюсь понять время выполнения подсчета сортировки. В своих записях он говорит, если предположить, что размер массива А равен п, а к есть число раз каждое число встречается,Продолжительность подсчета сортировки
Counting-Sort(A,k) {
for (i=1; i <= k; i++) // initialize number counters to 0
times[i] = 0;
for (j=1; j <= length[A]; j++) // decide how many times each
times[A[j]]++; // number appears in the input
// form the sorted array
m=1;
for (i=1; i <= k; i++) // consider each number in the range
for (j=1; j <= times[ i ]; j++) { // generate that number in
A[m]=i; // the output as many times as
m++; // it occurs in the input
}
}
Пусть T я обозначает число раз внутренний цикл итерации для каждого i. Когда мы смотрим на вложенные циклы в нижней части кода, обратите внимание, что каждый раз, когда внутренний цикл повторяется, мы помещаем новый номер в его правильное место в выходном массиве. Следовательно: сумма t i (от i = 1 до k) = n.
Я не понимаю, почему эта сумма равна n. Внешний цикл выполняет итерацию k раз, а внутренний цикл может повторяться не более n раз, поэтому он должен быть O (nk). Может кто-нибудь объяснить? Спасибо
Создайте маленький пример массив и заполнить 'times' вручную или с помощью программы, и это должно быть ясно, что внутрипартийная наиболее цикл будет выполняется не более, чем 'n' раз, а не' nk' раз. – Dukeling
Это фактически занимает 2n + k time, O (n + k), check: http://en.wikipedia.org/wiki/Counting_sort –