Каков наилучший способ расчета сложности выполнения для любого метода? Это легко сделать, что для не рекурсивных методов, как BubbleSortСложность выполнения Runtime
outer-for loop
{
inner-for loop
{
compare and exchange
}
}
Чтобы проверить, лучший способ это поставить счетчик в внутрипартийной большей петле. Но, когда этот метод является рекурсивным, где я должен поставить счетчик, например, сортировка слиянием,
sort(int[] array){
left = first-half
right = second-half
sort(left);
sort(right);
ret merge(left, right);
}
merge(int[] left, right)
{
count = length(left + right);
int[] result;
loop-count-times
{
compare and put in result;
}
return result;
}
Поскольку это сортировка слиянием, большой (о) о (п § п), так что массив 100 ints должны возвращать большое значение o 200 точно. Куда идет счетчик? Если я положил его в начало сортировки (..), я получаю в среднем 250, 280, 300, что должно быть неправильно. Какое лучшее место для этого счетчика?
ссылки: http://en.wikipedia.org/wiki/Mergesort
Спасибо.
Я согласен с обоими этими ответами, однако, согласно Википедии (ссылка на статью), наихудший случай для сортировки слияния - это n * log n. Я предполагаю, что каждый случай приведет к сложности n * log n.С другой стороны, Quicksort может варьироваться между n * log n и n^2 (наихудший случай), однако Merge Sort не делает этого. – iamseiko
Если функция f (n) равна O (n log n), то время, затраченное на f (n), меньше или равно (k * n * log n), где k - постоянная. Вы не рассматривали эту константу k в своем анализе. – Deepu
О да, это хороший момент. Я забыл об этом, сложность выглядит прямо сейчас. – iamseiko