Я пытаюсь понять нотацию Big O следующих двух алгоритмов ниже, но у меня проблемы.Расчет большой сложности этих алгоритмов O?
Первый:
public static int fragment3 (int n){
int sum = 0;
for (int i = 1; i <= n*n; i *= 4)
for (int j = 0; j < i*i; j++)
sum++;
return sum;
} //end fragment 3
Ответ должен быть O(n^4)
. Когда я пытаюсь сделать это сам, это то, что я получаю: Я смотрю первый цикл цикла и думаю, что он запускает n^2
logn раз. Затем для внутреннего цикла for он запускает n раз + время выполнения внешнего цикла, которое равно n^3 logn
раз. Я знаю, что это неправильно, но просто не понимаю.
Для фрагмента кода ниже ответ O(n^9)
.
public static int fragment6(int n) {
int sum = 0;
for(int i=0; i < n*n*n; i++) {
if(i%100 == 0) {
for(int j=0; j < i*i; j += 10)
sum++;
} // if
else {
for(int k=0; k <= i; k++)
sum++;
} // else
} // outer loop
return sum;
} // fragment 6
Когда я пытаюсь это я получаю: n^3
для внешнего для цикла. для оператора if я получаю n
, для второго цикла цикла я получаю n +
другой для цикла и если оператор, делая его n^5
. Наконец, я получаю n для финального цикла, и все добавляет до O(n^6)
.
Что я делаю неправильно и каков правильный способ получить его O(n^9)
сложности?