Чтобы понять сложность кода в Big-O, вам нужно спросить себя, «сколько выполнено итераций»?
Проблема, конечно, в том, что не всегда легко понять это из самого кода, иногда просто лучше взглянуть на общую картину и вычислить количество выполненных операций.
Примеры:
For (i = 0 ; i < n ; i++ ) {
//Do stuff
}
Это сложность
For (i = n ; i > 0 ; i= i/2 ) {
//Do stuff
}
Это сложность ... Потому что в каждой итерации я делюсь пополам.
void Mess (int n) {
for (i = 0 ; i < n ; i++) {
//Do stuff
Mess(n-1);
}
}
Теперь это выглядит как простой цикл, псих, потому что он вызывает себя с помощью рекурсии, на самом деле это просто беспорядок ... Каждая итерация вызывает себя n раз с n-1.
Так что тут было бы легче думать с конца. Если n == 1, есть 1 итерация. Если n == 2, то он вызывает предыдущий сценарий дважды.
Поэтому, если мы вызовем функцию , мы увидим, что получим это рекурсивно:
Что в итоге, конечно, даст нам n!
Итог, это не всегда тривиально.