Конструирование комбинаторных объектов и их подсчёт

Материал из Викиконспекты
Перейти к: навигация, поиск

Последовательности (Seq)

Утверждение:
Пусть A={a1,a2,,az} — множество из различных объектов, S=Seq(A) — множество всех последовательностей из элементов A, W={w1,w2,,wl} — количество объектов веса от 1 до l. Мы считаем, что нет объектов веса 0, так как в противном случае существует бесконечное количество последовательностей любого веса. Тогда, количество последовательностей веса n можно вычислить как Sn=ni=1wiSni. Причем S0=1, так как есть единственный способ составить пустую последовательность.

Докажем по индукции.

База n=1.

S1=w1S0=w1, что верно, так как единственный способ составить последовательность веса 1 — это взять любой элемент веса 1.

Переход.

Пусть для j<n верно. Докажем для n. Возьмем произвольный элемент из A веса in, и допишем его к последовательности элементов веса ni. Образуется новая последовательность веса n. Причем никакая последовательность не будет учтена дважды, так как прежде не было последовательностей веса n и ни к какой последовательности меньшего веса мы не добавляем один и тот же элемент дважды.

Подсчет битовых векторов длины n

Пусть A={0,1}, W={2,00} S=Seq(A) — множество всех битовых векторов, S0=1.

Тогда, Sn=ni=1wiSni=2Sn1=2n.

Подсчет Seq из маленьких и больших элементов

Пусть A={1,2}, W={1,1,00}, S=Seq(A) — множество всех последовательностей из маленьких и больших элементов, S0=1, S1=1.

Тогда, Sn=ni=1wiSn1=Sn1+Sn2=Fn, где Fnn-ое число Фибоначчи [1].

Подсчет подвешенных непомеченных деревьев с порядком на детях

Пусть Tn — количество таких деревьев с n вершинами, T0=1. S=Seq(A) — множество всех последовательностей из данных деревьев. Sn — количество последовательностей с суммарным количество вершин n. Чтобы получить дерево из n вершин, достаточно взять 1 вершину, и подвесить к ней последовательность деревьев с суммарным количеством вершин n1. Тогда:

Tn=Sn1.
Sn=ni=1TiSni=ni=1Si1Sni=n1i=0SiSni1=Cn, где Cnn-ое число Каталана.

Sequence of rooted Trees.png Ordered Rooted Trees.png

Множества (PSet)

Утверждение:
Пусть A={a1,a2,,az} — множество из различных объектов, P=PSet(A) — множество всех множеств, составленных из элементов A, W={w1,w2,,wl} — количество объектов веса от 1 до l. Для простоты считаем что нет объектов веса 0. Тогда количество множеств суммарного веса n можно вычислить как Pn=pn,n, где pn,k=nki=0(wki)pnik,k1 — количество таких множеств, которые содержат объекты, вес которых не больше чем k. Причем p0,i=1, так как не набирать никакой вес есть один способ, а pi,0=0, i0, так как нельзя набрать положительный вес из ничего.
Изначально у нас есть только пустое множество веса 0. Рассмотрим очередной этап вычисления pn,k. Для данных n и k у нас уже имеется множество, которое необходимо дополнить. Мы можем сделать это добавляя от 0 до nk элементов веса k (при условии, что столько различных элементов имеется) в данное множество. Следовательно, у нас образуется новые множества, которые будет необходимо дополнить элементами веса меньше k (чтобы избежать повторений) суммарного веса nik, где i — количество элементов веса k которое мы добавили в данное множество. Довольно легко заметить, что данные операции полностью соответствуют описанной выше формуле.

Количество PSet из элементов 0 и 1

Пусть A={0,1}, P=PSet(A) — множество всех множеств из A, W={2,00}, w0=1. Тогда Pn=pn,n, где pn,k=nki=0pnik,k1.

P0=p0,0=1.
P1=p1,1=p1,0+2p0,0=2p0,0=2.
P2=p2,2=p2,1+0p0,1=p2,0+2p1,0+p0,0=p0,0=1.
P3=p3,3=p3,2+0p0,2=p3,1+0p0,1=p3,0+2p2,0+0p1,0+0p0,0=0.
Для n>2, Pn=0 .
{}
{0},{1}
{0,1}


Количество разбиений на слагаемые

Пусть A=N, P=PSet(A) — множество всех разбиений на слагаемые, W={11}, w0=1. Тогда,

Pn=pn,n, где pn,k=nki=0pnik,k1=pn,k1+pnk,k, что, как несложно заметить, соответствует формуле, полученной методом динамического программирования.


Мультимножества (MSet)

Утверждение:
Пусть A={a1,a2,,az} — множество из различных объектов, M=MSet(A) — множество всех мультимножеств [2] из элементов A, W={w1,w2,,wk} — количество объектов веса {1k}. Тогда количество мультимножеств из объектов суммарного веса n можно вычислить как Mn=mn,n, где mn,k=nki=0(wk+i1i)mnik,k1 — количество таких мультимножеств, которые содержат объекты, вес которых не больше чем k.

Количество MSet из элементов 0 и 1

Пусть A={0,1}, S=PSet(A) — множество всех множеств из A, W={2,00}, w0=1.

Тогда, Mn=mn,n, где sn,k=nki=0snik,k1
M0=m0,0=1.
M1=m1,1=m1,0+2m0,0=2m0,0=2.
M2=m2,2=m2,1+0m0,1=m2,0+2m1,0+3m0,0=3m0,0=3.
M3=m3,3=m3,2+0m0,2=m3,1+0m0,1=m3,0+2m2,0+3m1,0+4m0,0=4m0,0=4.
{}
{0},{1}
{0,0},{0,1},{1,1}
{0,0,0},{0,0,1},{0,1,1},{1,1,1}
Mn=mn,n=mn,n1+0m0,n1=mn,n2+0m0,n2==mn,0+2mn1,0++nm1,0+(n+1)m0,0=(n+1)m0,0=n+1.

Подсчет подвешенных непомеченных деревьев без порядка на детях

Пусть Tn — количество таких деревьев с n вершинами, T0=1. F=MSet(T) — множество всех лесов из данных деревьев, так как лес можно интерпретировать как мультимножество из деревьев. Fn=fn,n — количество лесов с суммарным количество вершин n. fn,k — количество таких лесов из n вершин, что деревья в них содержат не более чем k вершин. Чтобы получить дерево из n вершин, достаточно взять 1 вершину и подвесить к ней лес деревьев с суммарным количеством вершин n1. Тогда:

Tn=Fn1.
Fn=fn,n.
fn,k=nki=0(Tk+i1i)snik,k1.

Количество таких деревьев с n вершинами образуют последовательность 1,1,2,4,9,20,48,115,286,719,1842,4766,12486,32973,87811,235381,634847 [3]

Forests.png Rooted Trees.png


Пары (Pair)

Утверждение:
Пусть A={a1,a2,,az}, B={b1,b2,,bm} — множества из различных объектов, D=Pair(A,B) — множество всех пар объектов, составленных из элементов A и B. W={w1,w2,,wk} — количество объектов веса {1k}, составленных из элементов A, а U={u1,u2,,uk} — соответственно для B. Тогда количество пар из объектов суммарного веса n можно вычислить как Dn=ni=0wiuni.

Количество подвешенных неполных двоичных деревьев

Пусть Tn — количество таких деревьев с n вершинами, T0=1. D=Pair(T,T) — множество всех пар из данных деревьев. Чтобы получить двоичное дерево из n вершин, достаточно взять 1 вершину и подвесить к ней левого и правого сына с суммарным количеством вершин n1. Тогда:

Tn=Dn1=n1i=0TiTni1=Cn, где Cnn-ое число Каталана.

Циклы (Cycle)

Утверждение:
Пусть A={a1,a2,,az} — множество из различных объектов, C=Cycle(A) — множество всех циклов [4] из элементов A, W={w1,w2,,wm} — количество объектов веса {1m}.

Тогда количество циклов веса n можно вычислить как Cn=ns=1cn,s, где cn,s — количество циклов веса n длины s.

По лемме Бёрнсайда cn,s=s1i=0|St(i)|s, где |St(i)| — количество стабилизаторов для циклического сдвига на i .

Найдем |St(i)|=zn,s,i в общем случае.

Пусть g=gcd(s,i)наибольший общий делитель(s,i). Заметим, что в i-ой перестановке на j-ой позиции стоит элемент (i+j)mods. Также, заметим, что элемент a переходит в элемент a+in, где i=1,2,k. Из этого следует, что длина цикла для i-ой перестановки равна lcm(s,i)i=sg, где lcm(s,i)наименьшее общее кратное(s,i).

Также заметим, что если вес n нельзя равномерно распределить по всей длине цикла, то стабилизатор равен 0.

zn,s,i={0,nmodsg0bngs,g,nmodsg=0

Где bn,k — число способов упорядочить набор из k элементов суммарного веса n и

bn,k=ni=1wibni,k1, причем bn,1=wn.

Задача об ожерельях

Решим данным способом задачу об ожерельях. Пусть необходимый вес n — это количество бусинок, а k — количество цветов. Причем каждая бусинка весит 1. То есть W={k,00}.

Cn=ns=1cn,s=cn,n так как невозможно набрать вес n менее, чем n бусинами при весе бусин 1.

cn,n=n1i=0|St(i)|n=1ns1i=0|St(i)|=1ns1i=0bgcd(n,i),gcd(n,i). Поскольку все бусины имеют одинаковый вес 1, то bn,k0

В итоге, Cn=1ns1i=0kgcd(n,i).

Производящие функции

Для анализа свойств таких больших групп часто применяют метод производящих функций. Рассмотренные классы имеют следующие производящие функции:

Seq(A) 11A(z)
Pset(A) n1(1+zn)An=exp(k1(1)kA(zk)k)
Mset(A) n11(1zn)An=exp(k1A(zk)k)
Pair(A,B) A(z)B(z)
Cycle(A) ln11A(z)

См.также

Примeчания

Источники информации