Рассмотрим следующую C-функцию:

double foo (int n) {
 int i; 
 double sum; 
 if (n == 0) return 1.0; 
 else { 
        sum = 0.0; 
        for (i = 0; i < n; i++) 
            sum + = foo (i); 
        return sum; 
      }
}

Пространственная сложность вышеуказанной функции равна

1)  O(1)
2)  O(n)
3)  O(n!)
4)  O(n^n)

В приведенном выше вопросе, по моему мнению, ответ должен быть (2), но ответ дан как вариант (3). Хотя это рекурсивная функция, но стек никогда не будет иметь глубины стека более O (n). Может ли кто-нибудь объяснить мне, почему этот ответ (3) и где я ошибаюсь?

3
POOJA GUPTA 13 Янв 2014 в 18:55

3 ответа

Лучший ответ

Если вам нужна временная сложность, то это, конечно, не O(N!), как многие предлагают, а гораздо меньше, чем O(2^N).

Доказательство:-

T(N) = T(N-1) + T(N-2) + T(N-3) + T(N-4)........T(1)

Кроме того по формуле выше

T(N-1) = T(N-2) + T(N-3)...... T(1)

Следовательно, T(N) = T(N-1) + T(N-1) = 2*T(N-1)

Решение выше дает T(N) = O(2^N)

В то время как, если вам нужна сложность пространства, то для рекурсивного функционального пространства сложность рассчитывается по максимальному количеству пространства стека, занимаемого им в данный момент, и которое в этом случае не может превышать O(N)

Но в любом случае ответ - не O(N!), потому что многие вычисления вообще не выполняются, так как стек может занимать столько места.

Примечание. - Попробуйте запустить функцию для n = 20, если она не вызывает переполнения памяти, тогда ответ в тексте будет 20! который больше, чем любая память, но я думаю, что он будет работать через O(2^20) время без переполнения стека.

3
Vikram Bhat 13 Янв 2014 в 19:09

Сложность пространства - O (N). в любой момент времени используемое пространство ограничено: N*sizeof_function_call_which_is_a_constant.

1
egur 13 Янв 2014 в 15:20

Подумайте об этом так:

Чтобы вычислить foo (n) . Программа должна вычислить: foo (0) + foo (1) + foo (2) ... foo (n-1):

Аналогично для foo (n-1). Программа должна рекурсивно вычислить: foo (0) + foo (1) + ... foo (n-2).

В основном у вас будет O (foo (n)) = n! + (п-1)! + (п-2)! + ... 1! = O (п!).

Надеюсь, это ясно.

1
Bernhard Barker 13 Янв 2014 в 15:22