Informatika gyűjtemény

Egy szinttel feljebb 7. óra - Halmaz-partíció

2004050607080910

NézetNyomtat

7. óra

(2008.11.04.)
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] // C1 ciklus eleje
        a[n]:=a[n]+1
        az a[1],...,a[n] által kódolt partíció bejárása
    Ciklus vége //C1 ciklus vége
    j := n-1 //C2 ciklus eleje
    Ciklus amíg a[j]=b[j] 
        j:=j-1
    Ciklus vége //C2 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ámapartíciók száma
11
22
35
415
552
6203
7877
84140
92114
10115975
11678570
124213597
1327644437
14190899322
151382958545
1610480142147
1782864869804
18682076806159
195832742205057
2051724158235372
21474869816156751
224506715738447323

Feladat