Как определить высоту дерева рекурсии из рекуррентного отношения?

Как определить высоту рекурсивного дерева, построенного при работе с повторяющимися средами выполнения? Чем он отличается от определения высоты обычного дерева?

http://homepages.ius.edu/rwisman/C455/html/notes/Chapter4/ch4-9.gif

edit: извините, я хотел добавить, как получить высоту дерева рекурсии из рекуррентного отношения.


person Chris    schedule 28.08.2009    source источник
comment
Стреляю из своего бомжа здесь, но я не вижу разницы. Почему вы решили, что есть разница? Абстрактно они оба деревья...   -  person Paul Nathan    schedule 28.08.2009
comment
см. мой ответ здесь: stackoverflow .com/questions/2307283/   -  person 2cupsOfTech    schedule 27.10.2012


Ответы (5)


Если рекуррентность представлена ​​в виде T(n) = aT(n/b) + f(n), то глубина дерева равна логарифмической базе b числа n.

Например, повторение 2T (n/2) + n будет иметь дерево глубины lg (n) (логарифмическое основание 2 от n).

person ejel    schedule 25.09.2009
comment
предположим, что у меня есть повторение с T (n) = T (n-2) + n ^ 2, как мне применить глубину = логарифмическую базу b для n, поскольку b не определено? - person Danh Vo; 08.06.2021

Во-первых, если это вопрос домашнего задания, отметьте его как таковой. Изображения, на которые вы ссылаетесь, подразумевают, что вы находитесь в CS 455 с профессором Висманом. :)

Главный совет, который я дам, таков: высота дерева, очевидно, определяется тем, когда вы добираетесь до «листьев». Листья дерева, моделирующие рекуррентное отношение функции, являются базовым случаем. Таким образом, я бы посмотрел, как «быстро» N может сжаться до базового случая.

person agorenst    schedule 29.08.2009
comment
Это не домашнее задание :) Личное изучение. Изображение, на которое я ссылался, было наиболее релевантным на изображениях Google. Надо было уточнить это заранее, извините! - person Chris; 29.08.2009
comment
Извините, слишком рано добавил комментарий. Ваш ответ определенно имеет смысл. Однако, как правило, вы не можете следовать за листьями полностью вниз. Создание первых нескольких ветвей тривиально. Отсюда я немного запутался :) - person Chris; 29.08.2009

Глубина любого дерева — это наименьшее количество ребер от узла до корневого узла дерева. Глубина корневого узла равна 0.

Рассмотрим рекурсию T(n)=aT(n/b). Это приводит к следующему дереву рекурсии

введите здесь описание изображения

Ясно, что глубина дерева равна $\log_b n$ Глубина равна высоте дерева.

person user471651    schedule 04.06.2018

Высота дерева рекурсии зависит от рассматриваемого рекурсивного алгоритма. Не все алгоритмы «разделяй и властвуй» имеют деревья одинаковой высоты, как и не все древовидные структуры имеют одинаковую высоту. Если вы не можете определить максимально возможную высоту алгоритма или вам нужно вычислить фактическую высоту дерева во время выполнения, вы можете использовать глобальную переменную для рекурсивной функции, увеличивать ее при входе в функцию и уменьшать это при выходе из функции. Эта переменная будет указывать текущий уровень рекурсивной процедуры. При необходимости вы можете сохранить максимальное значение этой переменной во второй переменной.

person xpda    schedule 28.08.2009

Что, для вас неочевидно? ;) Это отличный вопрос хотя бы по той причине, что людям нравится махать на него руками. Впрочем, с практикой все становится ясно.

Вот объяснение, основанное на примере из Введения в алгоритмы Кормена и др., Раздел 4.4.

Рассмотрим T(n) = 3T(n/4) + cn^2. Отношение сообщает временную сложность задачи (например, массива) размером n. Важно помнить, что представляет собой n. Поскольку сложность T определяется в терминах T, это рекуррентное соотношение.

Если высота не очевидна, мы можем последовать совету Polya и попытаться использовать прямой рассуждения, нарисовать картину или решить какую-то связанную проблему. Мы можем использовать прямые рассуждения, просто подставляя правое выражение для T везде, где появляется T,

T(n) = 3T(n/4) + cn^2
     = 3[3T( (n/4)/4 ) + c(n/4)^2] + cn^2
     = 9T(n/16) + c(n/4)^2 + cn^2
     = 9[3T( (n/16)/4 ) + c(n/16)^2] + c(n/4)^2 + cn^2
     = 27T(n/64) + c(n/16)^2 + c(n/4)^2 + cn^2
     ...

Нарисовав изображение, мы получим дерево. Каждая рекурсия создает три ветви для каждого потомка:

Initial pass
                   ____cn^2____
                  /      |     \
                 /       |      \
            T(n/4)    T(n/4)    T(n/4)


First recursion                 
                   ____cn^2____
                  /      |     \
                 /       |      \
          cn(n/4)^2  cn(n/4)^2  cn(n/4)^2
          /   |   \  /   |   \  /   |   \
       T(n/16)          ...            T(n/16)
                         .
...on down             
                   ____cn^2____
                  /      |     \
                 /       |      \
          cn(n/4)^2  cn(n/4)^2  cn(n/4)^2
          /   |   \  /   |   \  /   |   \
       T(n/16)          ...            T(n/16)
                         .
                         .
                         .
    T(1) ...                            ...  T(1)

На что?

Помните, что n – это размер исходной задачи (например, количество элементов в массиве)1. Это ограничивает количество возможных рекурсий. Граничные условия будут зависеть от ситуации, в которой произошла рекурсия. Для массива вы можете представить себе рекурсию, продолжающуюся до тех пор, пока не останется только один элемент. Это произойдет в Т(1).

Как граница может быть связана с высотой?

Для меня великим открытием является осознание того, что высота дерева равна уровню, на котором проходит граница. Это та родственная проблема, о которой говорит Поля. Мы можем переформулировать вопрос так:

На каком уровне дерево достигает граничного условия?

Глядя на отношение или дерево, обратите внимание, как n/4 неоднократно подключается к последовательным рекурсиям. Это означает, что размер подзадачи (где n — исходный размер задачи) равен n/4^i на i уровне. На границе размер подзадачи равен 1:

                n/4^i = 1
         log_4(n/4^i) = log_4(1)
log_4(n) - log_4(4^i) = 0
             log_4(n) = log_4(4^i)
             log_4(n) = i

Последнее уравнение говорит нам, что дерево достигает граничного условия, когда i = log_4(n). Поскольку высота дерева — это уровень, на котором выполняется граничное условие, дерево имеет высоту log_4(n).

Отсюда нужно только обобщить, чтобы прийти к выводу, который @ejel дает, что

Если T(n) = aT(n/b) + f(n), то глубина дерева равна логарифмической базе b числа n.

Как указывает @xpda, высота дерева рекурсии будет зависеть от алгоритма. Один вывод, который, вероятно, обобщает, заключается в рассмотрении того, как алгоритм ведет себя на своих границах.


1 Слово «проблема» может использоваться по-разному. В первую очередь это может означать стоящую перед вами задачу, например, найти высоту дерева рекурсии. Однако, поскольку дерево возникает в результате рекурсии, проблема снова появляется в аналогичной форме (т. Е. Поддеревьях), так что проблема означает размер обрабатываемого множества, например количество элементов в массиве.

person Lorem Ipsum    schedule 27.09.2020
comment
Я немного запутался, у меня есть задача, в которой T(n) = 2T(n/2) + nc. Рекурсия остановится, если (n == 0). Если (n == 0) он вернет 1. У меня есть путаница, когда он будет идти от n....n/2.....n/4.....n/8.... ..n/16 тогда вот так n станет 0 только на бесконечности, тогда как найти TC? Связано ли это с тем, что 1/2 даст минимальную стоимость? - person ; 20.01.2021