Шаг 11.
Сложность алгоритма.
Число бинарных деревьев

    На этом шаге мы рассмотрим число бинарных деревьев.

    Число бинарных деревьев определяется, исходя из рекурсивного определения бинарного дерева: число деревьев с n вершинами определяется как сумма чисел возможных комбинаций левых и правых поддеревьев. Это дает возможность составить уравнения, решение которых и дает искомое число.

    Обозначим tn - число различных бинарных деревьев, содержащих n вершин. Под различными деревьями мы понимаем в том числе учет свойства вершины быть левым или правым потомком. Таким образом, симметричные деревья, изоморфные с точки зрения теории графов, являются различными. Например, вырожденные деревья, представляющие собой цепи левых и правых потомков - различны с нашей точки зрения, хотя и изоморфны. Имеет место формула:

которую можно объяснить следующим образом.

    Пусть tk обозначает количество возможных левых поддеревьев, содержащих k вершин, tn-k-1- количество соответствующих правых поддеревьев, содержащих n-k-1 вершину (k вершин в левом поддереве и одна вершина - корень). Левое поддерево может быть пустым, разумеется, существует только один вариант пустого дерева, т. е. t0=1. При этом в правом поддереве n-1 вершина и имеется tn способ построить такое дерево. Общее количество способов построить дерево, сохраняя заданное соотношение количеств вершин в левом и правом поддеревьях k и n-k-1, равно tktn-k-1. Суммируя по всем возможным значениям k, получаем количество tn деревьев с n вершинами.

    Приведенное равенство можно использовать для итерационного вычисления количества деревьев, начиная с деревьев, содержащих одну вершину:

  t1 = t0 = 1,
  t2 = t1t0 + t0t1 = 2,
  t3 = t0t2 + t1t1 + t2t0 = 5   и т.д.

    В частности, t4 = 14, t5 = 42, t6 = 132, t7 = 429. Таким способом можно вычислить количество бинарных деревьев с любым числом вершин, но сложность и громоздкость вычислений возрастают с ростом n. Хотелось бы получить результат в виде явной зависимости tn от параметра n без использования значений tn-i.

    Для этого используется производящая функция членов последовательности {tn}, где z - некая формальная переменная. Отыскивается она следующим образом. Вместо суммы для tn запишем сумму для tn+1:

    Правая часть принимает классический вид свертки двух последовательностей (в данном случае - это свертка последовательности {tn} с самой собой) и ее производящая функция равна Т1(z) в соответствии с теорией z-преобразований. Левая часть задает член последовательности {tn+1}, сдвинутой относительно последовательности {tn} на одну позицию и ее производящая функция по правилам z-преобразований может быть определена как (T(z) - t0)z. Получили уравнение:

  (T(z)-t0) z-1 =T2(z)

для определения неизвестной функции T(z), которое имеет решение:

    Разложение его в ряд по степеням z в районе точки z = 0 имеет вид:

    Таким образом,

    На следующем шаге мы рассмотрим число вырожденных деревьев.




Предыдущий шаг Содержание Следующий шаг