Прошло много времени с тех пор, как я выполнил некоторые упражнения по приближению сложности во время выполнения, и я пытался обернуть голову вокруг следующих примеров, которые можно найти в Интернете (комментарии мои) :
Пример 1:
for ( int i = 1 ; i <= n ; i++) { //n
for ( int j = 1; j <= i*i ; j++) { // 1+2^2+3^2+...+n^2
if ( j % i == 0) {
for ( int k = 0 ; k < j ; k++ ){ // 1+2^2+3^2+...+n^2
sum++;
}
}
}
}
В листе решения говорится, что это O (n ^ 4), но я его не вижу.Я уверен, что что-то упустил, потому что в своих комментариях я подсчитал, что в худшем случае это O (n ^ 5).
Пример 2:
i = 1 ;
L2 = -1;
while ( i <= n ) {
i = i*2 ; // 2 + 2^2 + 2^3+ ...+ 2^n
L2++;
}
Упомянутое решение - O (log n).Я полагал, что в худшем случае я получу что-то вроде 2 ^ n <= n, таким образом, n <= log n.Здесь было более интуитивно понятно применить типичное определение функции верхней границы (т.е. f (n) <= O (g (x))) </p>
Мне в основном интересно, что я пропустил, и какие шаги / рекомендацииМне нужно было найти правильную сложность больших О для обоих случаев (особенно 1-й пример).Я прошу прощения за любые неясные детали, и я рад добавить больше разъяснений.Заранее спасибо, и я ценю любые идеи!