Какова будет временная сложность следующего рекурсивного алгоритма? - PullRequest
0 голосов
/ 07 декабря 2018

Какова будет сложность следующего рекурсивного алгоритма?

void rec(n){
 if(n<=0)
    return;
 else
    rec(n/3)+rec(n/2); 
}

1 Ответ

0 голосов
/ 07 декабря 2018

Временная сложность вышеуказанной программы составляет O(2 ^ k), где k - глубина рекурсии.Здесь 2 вытекает из того факта, что в каждом рекурсивном вызове мы выполняем вызовы на 2 других рекурсивных вызова.Теперь давайте проанализируем самую глубокую глубину рекурсии (k).

enter image description here

На рисунке выше рекурсивный путь, деленный на 2 на каждом шаге, будетзаймет больше времени, чтобы достичь его значения меньше 1 (что является базовым случаем), и, следовательно, это будет самая глубокая глубина рекурсии.Поскольку каждый раз мы делим n на 2.Для достижения менее чем 1 потребуется выполнить шаги журнала.Хотя мы также делим n на 3.Разделение n на 2 займет больше времени и, следовательно, ответственно как решающий фактор для самой глубокой рекурсии.Для деталей:

При вызове 1st мы уменьшаем n на n / 2.
При вызове 2nd мы уменьшаем n на (n / 2) / 2 =n / 4 = n / 2 ^ 2.
Следовательно, на шаге Kth мы уменьшаем n на: n / 2 ^ k = 1.
Итак, n = 2 ^ k.

Взятие базы 2 с обеих сторон,

log2 n = log2 (2 ^ k)
log2 n = k log2 (2)
log2 n = k * 1 [поскольку log2 (2) равно 1]

Следовательно, при самой глубокой рекурсии нам нужно k = log(n) шагов для достижения n = 1 и еще одногошаг для достижения n <= 0. Но общая глубина рекурсии будет в диапазоне от <code>log3 n до log2 n.

Таким образом, общая сложность времени составляет O(2 ^ log n) в худшем случае.Но, поскольку мы также делим n на 3, и, следовательно, вся глубина рекурсивного пути, начиная с верхнего до конечного узла, не будет такой же, как у log n.Следовательно, мы можем заключить, что сложность времени равна O(2 ^ k), где k - глубина рекурсии.

...