Доброго времени суток!
Я новичок в оценке алгоритмов и хотел бы разобраться что к чему. Пусть есть код, написанный на Java:
Код:
for (int i = 1; i < k; i++) {
for (int j = (n-k)/(k-1); j >= 0; j=j-2) {
List<Task> tasks = new ArrayList<Task>();
initTheList(tasks, j); // fills the list with j tasks
someFunction(tasks);
}
}
private void someFunction(List<Task> tasks) {
...
Collections.sort(tasks, new ConstantTimeComparator());
...
}
Как видите, тут 2 цикла: внутренний и внешний. Во внутреннем цикле создается список объектов Task и заполняется этими объектами случайно. Важно, что длина этого списка равна
. Кроме того, во внутреннем цикле присутствует функция someFunction(), самой трудоемкой (и важной) частью которой является сортировка (по умолчанию в Java применяется сортировка слиянием), вычислительная сложность которой
, где
- размер входного массива.
1) Верно ли, что если
, где
- некоторая константа, то общая вычислительная сложность алгоритма равна
?
Я рассуждал так: раз
выражается через
, то выражение
равно
, аналогично, внутренний цикл даст
, и, наконец, внешний цикл даст
2) Верно ли, что если
- константа, то общая сложность алгоритма -
, где
Рассуждение такое: внешний цикл даст
, внутренний цикл -
, а функция someFunction() даст
, где
.
Не могли бы вы проверить рассуждения, и, если неправильно, объяснить где ошибка, и как правильно нужно было вести рассуждение? Заранее спасибо.