Деревянная задача
2009-04-12 14:29Возможно, что это классическая комбинаторная задача, но что-то никак не припомню, кто бы ее рассматривал. Меня некоторое время назад спросили об этом; ответа у меня не было. С тех пор я над ней думал время от времени.
Вопрос: сколько различных бинарных деревьев с n листьями можно построить? Обозначим число возможных деревьев как T(n).

Видно, что T(2)=1, T(3)=2, T(4)=5. А в общем виде? Лучше в закрытой форме, чем в рекуррентной, конечно.
Если просто помните решение, пока не говорите, но пообсуждать было бы очень интересно. Не уверен, что мой способ решения достаточно красив.
Вопрос: сколько различных бинарных деревьев с n листьями можно построить? Обозначим число возможных деревьев как T(n).
Видно, что T(2)=1, T(3)=2, T(4)=5. А в общем виде? Лучше в закрытой форме, чем в рекуррентной, конечно.
Если просто помните решение, пока не говорите, но пообсуждать было бы очень интересно. Не уверен, что мой способ решения достаточно красив.
Tags:
(no subject)
2009-04-12 23:18 (UTC)Число правильных скобочных выражений.
Числа Каталана.
(no subject)
2009-04-12 23:21 (UTC)На первый взгляд...
2009-04-12 23:52 (UTC)Если n > 2^(m-1) и n = 2^m - k, то количество деревьев это количество способов выбрать k из 2^m. Т.е. C-из-2^m-по-k
Re: На первый взгляд...
2009-04-12 23:56 (UTC)Да, вот уже тут я не прав.
Re: На первый взгляд...
2009-04-13 00:00 (UTC)Catalan numbers
2009-04-13 05:29 (UTC)Удобнее в качестве параметра брать не число листьев, а число "кареток", то есть "ветвлений". Если таких "кареток" n, то "листьев" будет n+1. У Вас поэтому получается (n-1)-е число Каталана, обозначаемое c_{n-1}.
Для c_n общей формулой будет (2n)!/(n!(n+1))!; соответственно, в Вашем случае получается T(n)=(2n-2)!/((n-1)!n!) -- уже отсюда видно, что n удобнее изменить на единицу.
Доказательств у этой формулы также имеется очень много. Одно из них, имеющее скорее "фольклорное" происхождение, я как-то излагал на страницах математического сообщества:
http://community.livejournal.com/ru_math/382992.html
То, что там написано в Добавлении, можно перевести на геометрический язык. В Ваших обозначениях, если совсем коротко, получается следующее. Берём множество деревьев с n листами, у которых один из листов помечен. Мощность этого множества равна nT(n). Стянем в точку ту "каретку", которой принадлежит отмеченный лист, получая дерево с n-1 листом, у которого отметим ту вершину (уже не обязательно лист), которая осталась от стянутой "каретки". То множество, в которое мы отображаем, имеет мощность (2n-3)T(n-1) -- это множество деревьев с n-1 листом, у которых отмечена произвольная вершина.
Далее можно проверить, что у любого элемента при этом отображении имеется ровно 2 прообраза. Строятся они так: в том месте, где помечена вершина, делаем "расклейку", и одним из двух способов вставляем туда каретку, помечая у неё одну из концевых вершин, являющихся "листом". Это приводит к формуле nT(n)=2(2n-3)T(n-1), и далее итоговый результат получается уже чисто "арифметически".
(no subject)
2009-04-13 09:57 (UTC)Тут хорошо видно, что он сверху ограничен, по меньшей мере, 4^{n-1}.
оценки сверху
2009-04-13 10:18 (UTC)Что касается верхней оценки для c_n вида 4^n, то она в любом случае сразу видна. Ведь c_n = C_{2n}^n/(n+1), что не превышает C_{2n}^n. В свою очередь, по формуле бинома,
4^n=2^{2n}=(1+1)^{2n}=C_{2n}^0+C_{2n}^1+...+C_{2n}^n+...+C_{2n}^{2n} содержит С_{2n}^n в качестве слагаемого. То есть на самом деле отсюда можно извлечь такое неравенство:
c_n<=4^n/(n+1), верное при всех n>=0. В Ваших обозначениях, T(n)<=4^{n-1}/n.
А способов на самом деле очень много, включая те, где не надо ничего как бы "изобретать". Самое "тупое" доказательство, не требующее никакой "смекалки" или догадки, опирается на свойства так называемого "треугольника Каталана".
(no subject)
2009-04-13 10:30 (UTC)"настоящий" бином Ньютона
2009-04-13 20:54 (UTC)Мне кажется, биномиальные коэффициенты там возникают практически неизбежно в ходе подсчёта. А именно, поскольку доказательство опирается на разложение функции (1+x)^a в ряд Тейлора в окрестности нуля при a=1/2, то получаются коэффициенты вида C_{1/2}^n, которые далее выражаются через факториалы.
Кстати говоря, именно это дело и следовало бы называть "биномом Ньютона", так как считается, что для целых показателей формула была известна раньше, а заслуга Ньютона состоит в её распространение на случай нецелых показателей.
Я тут попутно придумал одно рассуждение, которое непосредственно даёт нужную формулу -- с использованием самых простых комбинаторных средств, без использования "трюка" со стягиванием кареток. Если хотите, могу его привести здесь.
(no subject)
2009-04-13 21:03 (UTC)ожерелья
2009-04-14 00:58 (UTC)Код дерева строится так. Представьте себе, что Вы рисуете дерево слева. Есть некий "канонический" порядок это сделать. А именно, будущие "листы" добавляются слева направо, а каретка рисуется тогда и только тогда, когда уже появились те две вершины, на которые она опирается.
Например, как рисуется самое первое слева из пяти деревьев на Вашей картинке, где кареток ровно три? Порядок там такой:
лист
лист
каретка
лист
каретка
лист
каретка
Этот порядок полностью однозначен. Кодируя появление листа знаком +, а появления каретки знаком -, получаем коды каждого из деревьев. Я их сейчас выпишу -- для каждого из пяти случаев, считая слева направо.
++-+-+-
++++---
+++-+--
+++--+-
++-++--
В общем случае, если кареток n, то листьев n+1, и мы получаем код из n+1 плюса и n минусов с таким свойством: у любого начального отрезка кода, количество плюсов строго больше количества минусов. Это легко видно, если вдуматься в сам принцип построения кода, и означает то, что никакая каретка не может быть нарисована преждевременно. Довольно-таки понятно, что если дана последовательность плюсов и минусов с перечисленными выше свойствами, то какому-то дереву она точно соответствует.
Если понятно, как строится код, то теперь следующий шаг: плюсы и минусы располагаем по окружности по часовой стрелке. Получаются как бы ожерелья из белых и чёрных бусинок, где первых на единицу больше, чем вторых. Подсчёт числа таких ожерельев очень прост, поэтому сейчас надо убедиться, что при "зацикливании" не теряется информация. То есть что можно восстановить код по ожерелью -- узнать, в каком именно месте мы его замкнули.
(Ожерелья считаются "одинаковыми", если они отличаются поворотом; "зеркальные" отражения не допускаются.)
Проверить надо вот какой факт: если дано произвольное ожерелье из n+1 белых бусинок и n чёрных, то существует одно и только одно место, читая с которого, мы всегда будем получать на любом начальном отрезке строго больше белых бусинок нежели чёрных.
Прежде всего, почему таких мест не может быть два: если X -- промежуток от первого места до второго по часовой стрелке, а Y -- от второго к первому, тоже по часовой стрелке, то они покрывают окружность, и в каждом промежутке число белых бусинок больше. Но тогда общее число белых бусинок должно превышать число чёрных как минимум на два, что противоречит условию.
Далее, докажем, что существует такое место, чтение с которого всегда приводит к нужному нам результату. От противного: если это не так, то от любой точки при чтении по часовой стрелке есть промежуток, где белых бусинок не больше, чем чёрных. Начнём с произвольной точки, и каждый раз будем добавлять такой промежуток. В какой-то момент мы попадём в точку, где мы уже были. Это значит, что окружность обмотана такими промежутками по часовой стрелке один или более раз. Но из этого следует, что на окружности белых бусинок не больше, чем чёрных.
Таким образом, всё свелось к подсчёту числа ожерелий, но это уже "рутинная" комбинаторная задача. Если учесть тот факт, что каждое ожерелье с разных мест читается по-разному (а это, по сути, выше было уже проверено), то отметим одну из белых бусинок. Это можно сделать n+1 способом. Тогда ожерелью с отмеченной бусинкой соответствует набор из n плюсов и n минусов, причем это соответствие взаимно однозначно. Таких наборов ровно C_{2n}^n. Поэтому число ожерелий, а вместе с тем и число корневых двоичных деревьев с n каретками, равно C_{2n}^n/(n+1).
QED
Re: ожерелья
2009-04-14 08:01 (UTC)(no subject)
2009-04-13 08:56 (UTC)(no subject)
2009-04-13 09:28 (UTC)(no subject)
2009-04-13 09:59 (UTC)А вопрос вот какой - языки классифицируются в виде деревьев, вот меня и спросили, сколько можно бинарных деревьев построить и как это считать. Именно в такой формулировке. В принципе, это был вопрос скорее теоретический, о природе вещей.
Вообще всякие комбинаторные задачи довольно часто возникают, хотя в самой элементарной форме, конечно.
(no subject)
2009-04-13 10:04 (UTC)Интересно, что мне этот вопрос тоже лингвист задал, только возник он по поводу синтаксических деревьев. И тоже по поводу исключительно природы вещей. :-)
(no subject)
2009-04-13 11:24 (UTC)Я как-то объяснял своей знакомой, сколько автомобильных номеров может быть теоретически. Она не могла поверить и стала выписывать их на бумажке... Плохо этому учат...
(no subject)
2009-04-13 14:42 (UTC)(no subject)
2009-04-13 14:37 (UTC)Это, конечно, очень грубо, зато "на пальцах" и становится сразу ясно, что какой-то экспоненциальный рост несомненно есть.
(no subject)
2009-04-13 21:06 (UTC)Куча информации о числах Каталана
2009-05-12 22:23 (UTC)http://turgor.ru/lktg/2002/problem2.ru/index.php
Почитайте условия и решения, там действительно вагон всего.
Еще, кажется, потом на основе этой задачи была статья в "Мат.просвещении" (http://www.mccme.ru/free-books/matpros.html), но я не уверен.
Re: Куча информации о числах Каталана
2009-05-13 01:13 (UTC)