7. óra
A beígért folytatás...
Halmazok partíciói
Egy n elemű halmaz nemüres halmazok diszjunkt uniójára való felbontásait keressük. Az {1, 2, 3, 4} halmaz partíciói:
$
\{1,2,3,4\} = \{1,2,3\}\cup\{4\} = \{1,2,4\}\cup\{3\} =
\{1,3,4\}\cup{2} = \{2,3,4\}\cup\{1\} = \{1,2\}\cup\{3,4\}
= \{1,3\}\cup\{2,4\} =
$
$
=\{1,4\}\cup\{2,3\} = \{1,2\}\cup\{3\}\cup\{4\} = \{1,3\}\cup\{2\}\cup\{4\} = \{1,4\}\cup\{2\}\cup\{3\}
= \{2,3\}\cup\{1\}\cup\{4\} =
$
$
=\{2,4\}\cup\{1\}\cup\{3\} = \{3,4\}\cup\{1\}\cup\{2\} = \{1\}\cup\{2\}\cup\{3\}\cup\{4\}
$
Partíció generáló algoritmus
Egy véges $\{1, 2, \ldots, n\}$ halmaz minden partícióija egyértelműen kódolható egy olyan $a_1, a_2,\ldots, a_n$ sorozattal,
melyre
$a_1 = 0, a_{j+1} \le 1 + max(a_1, \ldots, a_j) $ $ (1 \le j < n)$,
ahol
$a_j = a_k$ akkor és csak akkor teljesül,
ha $j$ és $k$ ugyanabba a részhalmazba esik,
továbbá $a_j~ $ a lehető legkisebb értéket kapja, amikor $j$ a legkisebb szám részhalmazában.
Például $n = 4$-re az alábbi kódolást kapjuk:
| partíció |
kód |
|
Partíció |
kód |
| {1234} |
0000 |
|
{14}{23} |
0110 |
| {123}{4} |
0001 |
|
{1}{234} |
0111 |
| {124}{3} |
0010 |
|
{1}{23}{4} |
0112 |
| {12}{34} |
0011 |
|
{14}{2}{3} |
0120 |
| {12}{3}{4} |
0012 |
|
{1}{24}{3} |
0121 |
| {134}{2} |
0100 |
|
{1}{2}{34} |
0122 |
| {13}{24} |
0101 |
|
{1}{2}{3}{4} |
0123 |
| {13}{2}{4} |
0102 |
|
|
|
Az algoritmus a $b_1,\ldots,b_n$ változók használatával generálja a partíciók kódjait, ahol $b_{j+1} = 1+\max(a_1, \ldots, a_j)$.
Ciklus i := 1-től n-ig
a[i] := 0; b[i]:=1
Ciklus vége
Ciklus
az a[1],...,a[n] által kódolt partíció bejárása
Ciklus amíg a[n] <> b[n]
a[n]:=a[n]+1
az a[1],...,a[n] által kódolt partíció bejárása
Ciklus vége
j := n-1
Ciklus amíg a[j]=b[j]
j:=j-1
Ciklus vége
Ha j = 1 akkor kilépés a főciklusból
a[j]:=a[j]+1
Ha a[j]=b[j] akkor b[n]:= b[j]+1 különben b[n]:= b[j]
j:=j+1
Ciklus amíg j < n
a[j]:=0; b[j] := b[n]; j:=j+1
Ciklus vége
a[n] := 0
Ciklus vége
A C1 ciklus a kód utolsó elemét növeli, amíg lehet. Ha elérte a maximumot, a C2 ciklusban keresünk egy még növelhető elemet. Ha találunk ilyet, megnöveljük, és a mögötte lévő kódrész elemeit lenullázzuk.
$n = 3$-ra a következő sorrendben kapjuk meg a partíciók kódját:
000, 001, 010, 011, 012,
Partíciók száma
| halmaz elemszáma | partíciók száma |
| 1 | 1 |
| 2 | 2 |
| 3 | 5 |
| 4 | 15 |
| 5 | 52 |
| 6 | 203 |
| 7 | 877 |
| 8 | 4140 |
| 9 | 2114 |
| 10 | 115975 |
| 11 | 678570 |
| 12 | 4213597 |
| 13 | 27644437 |
| 14 | 190899322 |
| 15 | 1382958545 |
| 16 | 10480142147 |
| 17 | 82864869804 |
| 18 | 682076806159 |
| 19 | 5832742205057 |
| 20 | 51724158235372 |
| 21 | 474869816156751 |
| 22 | 4506715738447323 |
Feladat