Для подсчета многих типов комбинаторных объектов, таких как деревья в данном случае, существуют мощные математические инструменты (символический метод), которые позволяют механически получить такие счетчики из описания того, как строятся комбинаторные объекты. Это включает в себя создание функций.
Отличным примером является аналитическая комбинаторика покойного Филиппа Флажолета и Роберта Седжвика. Это доступно по ссылке выше.
Книга покойной Герберта Уилфа, генерирующая функциональность, является еще одним бесплатным источником.
И, конечно, « Конкретная математика» от GKP - это клад.
Для бинарных деревьев это выглядит так: сначала вам нужно четкое определение дерева.
Бинарное дерево - это корневое дерево, в котором каждый неконечный узел точно имеет степень 2.
Далее мы должны договориться о том, что мы хотим назвать размером дерева.
Слева все узлы равны. В середине мы различаем листья и не листья. Справа у нас есть обрезанное бинарное дерево, листья которого были удалены. Обратите внимание, что у него есть одинарные ветви двух типов (слева и справа)!
Теперь мы должны получить описание того, как эти комбинаторные объекты строятся. В случае бинарных деревьев возможна рекурсивная декомпозиция .
Пусть будет множеством всех двоичных деревьев первого типа, тогда символически мы имеем:
A
Он гласит: «Объект класса двоичных деревьев - это либо узел, либо узел, за которым следуют два двоичных дерева». Это можно записать как уравнение множеств:
A={∙}∪({∙}×A×A)
Вводя производящую функцию которая перечисляет этот класс комбинаторных объектов, мы можем преобразовать заданное уравнение в уравнение, содержащее производящую функцию.A(z)
A(z)=z+zA2(z)
Наш выбор одинаковой обработки всех узлов и определения количества узлов в дереве как понятия его размера выражается «маркировкой» узлов переменной .z
Теперь мы можем решить квадратное уравнение для и получить, как обычно, два решения явной замкнутой формы производящей функции:zA2(z)−A(z)+z=0A(z)
A(z)=1±1−4z2−−−−−−√2z
Теперь нам просто нужна (обобщенная) теорема Ньютона:
(1+x)a=∑k=0∞(ak)xk
с и чтобы разложить замкнутую форму производящей функции обратно в степенной ряд. Мы делаем это потому, что коэффициент в - это просто число комбинаторных объектов размера , обычно записываемых как . Но здесь наше представление о «размере» дерева заставляет нас искать коэффициент при . После небольшого манипулирования с биномами и факториалами мы получаем:a=1/2x=−4z2znn[zn]A(z)z2n+1
[z2n+1]A(z)=1n+1(2nn).
Если мы начнем со второго понятия размера, рекурсивная декомпозиция будет:
Мы получаем другой класс комбинаторных объектов . Он гласит: «Объектом класса двоичных деревьев является либо лист, либо внутренний узел, за которым следуют два двоичных дерева».B
Мы можем использовать тот же подход и превратить в . Только на этот раз переменная отмечает только внутренние узлы, а не листья, потому что здесь определение «размер» отличается. Мы также получаем другую функцию генерации:B={□}∪({∙}×B×B)B=1+zB2(z)z
B(z)=1−1−4z−−−−−√2z
Извлечение коэффициента урожайности
[zn]B(z)=1n+1(2nn).
Классы и согласуются по количеству, потому что бинарное дерево с внутренними узлами имеет лист, таким образом, всего узел.ABnn+12n+1
В последнем случае нам придется работать немного усерднее:
который является описанием непустых сокращенных двоичных попыток. Мы расширяем это до
CD={∙}∪({∙}×C)∪({∙}×C)∪({∙}×C×C)={ϵ}∪({∙}×C×C)
и переписать его с генерирующими функциями
C(z)D(z)=z+2zC(z)+zC2(z)=1+zC2(z)
решить квадратные уравнения
C(z)D(z)=1−2z−1−4z−−−−−√2z=1−1−4z−−−−−√2z
и получить еще раз
[zn]C(z)=1n+1(2nn)n≥1[zn]D(z)=1n+1(2nn)n≥0
Обратите внимание , что функция генерирования Каталонский является
E(z)=1−1−4z−−−−−√2
он перечисляет класс общих деревьев . Это деревья без ограничений на степень узла.
E={∙}×SEQ(E)
Он гласит: «Объект класса общих деревьев - это узел, за которым следует возможная пустая последовательность общих деревьев».
E(z)=z1−E(z)
С формулой обращения Лагранжа-Бюрмана мы получаем
[zn]E(z)=1n+1(2nn)
Итак, мы доказали, что существует столько общих деревьев, сколько существует двоичных деревьев. Неудивительно, что между общим и бинарным деревьями существует биекция. Биекция известна как вращательная корреспонденция (объясненная в конце связанной статьи), которая позволяет нам хранить каждое общее дерево как двоичное дерево.
Обратите внимание, что если мы не различаем левого и правого родного брата в классе мы получаем еще один класс деревьев :CT
одинарные бинарные деревья.
У них тоже есть производящая функция
однако их коэффициент отличается. Вы получаете числа Моцкина
T={∙}×SEQ≤2(T)
T(z)=1−z−1−2z−3z2−−−−−−−−−−√2z
[zn]T(z)=1n∑k(nk)(n−kk−1).
Да, и если вам не нравится генерировать функции, есть множество других доказательств. Смотрите здесь , есть один, где вы можете использовать кодирование бинарных деревьев как слова Дейка и получить рекуррентность из их рекурсивного определения. Тогда решение этого повторения также дает ответ. Однако символический метод избавляет вас от необходимости повторения в первую очередь, поскольку он работает непосредственно с чертежами комбинаторных объектов.