Первый фрагмент - O(n^5)
.
Top Loop = 0 - O(n) = O(n) iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
Inner Loop = 0 - O(n^2) = O(n^2) iterations
Total = O(n^5)
Вот решение первого фрагмента в замкнутой форме: (вычислено с помощью Mathematica)
sum = -(1/10)*n + (1/4)*n^2 - (1/4)*n^4 + (1/10)*n^5
Это полином 5-го порядка, поэтому он: O(n^5)
Второй фрагмент выглядит как O(n^4)
.
Top Loop = 0 - O(n) = O(n) iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
If statement enters: O(1 / n) times
Inner Loop = 0 - O(n^2) = O(n^2) iterations
Total = O(n^4)
Вот решение второго фрагмента в замкнутой форме: (вычислено с помощью Mathematica)
sum = -(1/12)*n + (3/8)*n^2 - (5/12)*n^3 + (1/8)*n^4
Это полином 4-го порядка, поэтому он: O(n^4)
Дальнейшее объяснение влияния оператора if:
Средний цикл повторяется от 0 до i*i
. Оператор if проверяет, делится ли j
на i
. Но это возможно только тогда, когда j
кратно i
.
Сколько раз j
кратно i
, если 0 <= j < i*i
? Точно i
раз. Следовательно, только 1/i
итераций среднего цикла попадет в самый внутренний цикл.