Я изо всех сил, чтобы найти временную сложность этой функции:Найти временную сложность функции «Foo»
void foo(int n) {
int i, m = 1;
for (i = 0; i < n; i++) {
m *= n; // (m = n^n) ??
}
while (m > 1) {
m /= 3;
}
}
Ну, первое для итерации явно O(n^n)
, объяснение к нему потому что m started with value 1
, и умножает себя n
раз.
Теперь мы начинаем цикл while с m = n^n
, и каждый раз мы делим его на 3
. это означает, (думаю), log(n^n)
.
Предполагая, что я понял это до сих пор, я не уверен, нужно ли мне суммировать или умножать, но моя логика говорит, что мне нужно их суммировать, потому что они являются «странными» друг для друга.
Так что мое предположение: O(n^n) + O(log(n^n)) = O(n^n)
Потому что, если n довольно велико, мы можем просто воздержаться от O(log(n^n))
.
Ну, я действительно сделал много предположений здесь, и я надеюсь, что это имеет смысл. Мне бы хотелось услышать ваше мнение о временной сложности этой функции.
Но цикл все еще продолжается п раз в первом, так что O (п) –
Btw, 'т * = п;' = 'т = т * n; ' – pzaenger
@ camel-man Oh right, и btw, O (n)> O (log (n^n))? если да, то почему? –