Какова пространственная сложность рекурсивного алгоритма Фибоначчи?

это рекурсивная реализация последовательности Фибоначчи от взлома кодирования интервью (5-е издание)

int fibonacci(int i) {
       if(i == 0) return 0;
       if(i == 1) return 1;
       return fibonacci(i-1) + fibonaci(i-2);
}

после просмотра видео на сложность этого алгоритма Фибоначчи Сложности, теперь я понимаю, почему этот алгоритм работает за O(2n). Однако я борюсь с анализом сложности пространства.

Я посмотрел онлайн и у меня был вопрос по этому поводу.

в этом Quora нить, автор заявляет ,что " в вашем случае у вас есть N кадров стека f(n), f(n-1), f(n-2),..., f (1) и O(1)". Разве у вас не было бы 2n кадров стека? Скажем, для f(n-2) один кадр будет для фактического вызова f(n-2), но не будет ли также вызова f(n-2) из f (n-1)?

3 ответов


вот подсказка. Измените код с помощью инструкции print, как показано в примере ниже:

int fibonacci(int i, int stack) {
    printf("Fib: %d, %d\n", i, stack);
    if (i == 0) return 0;
    if (i == 1) return 1;
    return fibonacci(i - 1, stack + 1) + fibonacci(i - 2, stack + 1);
}

теперь выполните эту строку в main:

Fibonacci(6,1);

какое самое высокое значение для" стека", который распечатывается. Вы увидите, что это "6". Попробуйте другие значения для "i", и вы увидите, что напечатанное значение" stack "никогда не поднимается выше исходного значения" i".

поскольку Fib(i-1) полностью оценивается до Fib (i-2), никогда не будет больше, чем i уровень рекурсии.

Следовательно, O (N).


Если кто-то еще все еще смущен, не забудьте проверить это видео Youtube, в котором обсуждается сложность пространства для генерации последовательности Фибоначчи. Сложность Пространства Фибоначчи

ведущий дал понять, почему сложность пространства равна O (n), высота рекурсивного дерева равна n.


Как я вижу, процесс будет спускаться только по одной из рекурсий за раз. Первый(f (i-1)) создаст N кадров стека, другой(f (i-2)) создаст N/2. Таким образом, самая большая-N. другая ветвь рекурсии не будет использовать больше пространства.

поэтому я бы сказал, что сложность пространства равна N.

Это тот факт, что за один раз оценивается только одна рекурсия, которая позволяет игнорировать f(i-2), поскольку она меньше пространства f(i-1).