Podział zbioru

7
Podzial zbioru, generowanie podzialów zbiorów, liczby Bella. Podzial (rozbicie, partycja) zbioru – podzielenie zbioru na niepuste i rozlączne podzbiory, które w sumie dają caly zbiór. Definicja Niech H będzie dowolnym zbiorem. Podzialem (rozbiciem, partycją) zbioru H nazywa się rodzinę niepustych, parami rozlącznych podzbiorów zbioru H takich, że ich suma jest równa zbiorowi H. Tak więc rodzina indeksowana jest partycją zbioru H, jeśli są spelnione następujące warunki: , . O rodzinie mówi się, że jest podzialem na | I | podzbiorów. Przyklady: Zbiór { 1, 2, 3 } ma 5 podzialów. { {1}, {2}, {3} }, { {1, 2}, {3} }, { {1, 3}, {2} }, { {1}, {2, 3} }, { {1, 2, 3} }, Zauważmy, że: { {}, {1,3}, {2} } nie jest podzialem (zabiera pusty zbiór) { {1,2}, {2, 3} } nie jest podzialem ponieważ element 2 znajduje się więcej niż 1 partycji zbioru { {1}, {2} } nie jest podzialem zbioru {1, 2, 3} ponieważ żadna z partycji nie zawiera elementu 3; ale jest partycja zbioru{1, 2}.

description

Set Partitioning Problem

Transcript of Podział zbioru

Page 1: Podział zbioru

Podział zbioru, generowanie podziałów zbiorów, liczby Bella.

Podział (rozbicie, partycja) zbioru – podzielenie zbioru na niepuste i rozłączne podzbiory, które w sumie dają cały zbiór. Definicja

Niech H będzie dowolnym zbiorem. Podziałem (rozbiciem, partycją) zbioru H nazywa się rodzinę niepustych, parami rozłącznych podzbiorów zbioru H takich, że ich suma jest równa zbiorowi H. Tak więc rodzina

indeksowana jest partycją zbioru H, jeśli są spełnione następujące warunki:

• ,

• .

O rodzinie mówi się, że jest podziałem na | I | podzbiorów.

Przykłady:

Zbiór { 1, 2, 3 } ma 5 podziałów.

• { {1}, {2}, {3} }, • { {1, 2}, {3} }, • { {1, 3}, {2} }, • { {1}, {2, 3} },

{ {1, 2, 3} }, Zauważmy, że:

• { {}, {1,3}, {2} } nie jest podziałem (zabiera pusty zbiór) • { {1,2}, {2, 3} } nie jest podziałem ponieważ element 2 znajduje się więcej niż 1

partycji zbioru • { {1}, {2} } nie jest podziałem zbioru {1, 2, 3} ponieważ żadna z partycji nie zawiera

elementu 3; ale jest partycja zbioru{1, 2}.

Page 2: Podział zbioru

II.Liczby Bella Definicja 1.

Niech Bn będzie równe liczbie wszystkich partycji zbioru n-elementowego. (Przypomnijmy, że partycją zbioru nazywamy rodzinę jego niepustych, parami rozłącznych podzbiorów, które w sumie dają cały zbiór).Korzystając z interpretacji kombinatorycznej liczb Stirlinga II rodzaju mamy:

Uwaga: Ilekroć poniżej będzie mowa o przypisywaniu ludzi do stolików lub do pokoi, to przyjmujemy, że: – osoby są rozróżnialne; – stoliki są nierozróżnialne (identyczne)

Przy założeniu, że B0 = 1 (zbiór pusty posiada dokładnie jedną partycję).

Ciąg nazywamy ciągiem liczb Bella (lub ciągiem liczb ekspotencjalnych).

Obserwacja 1. Korzystając z interpretacji kombinatorycznych liczb można udowodnić następujące interpretacje kombinatoryczne liczb Bella:

(1) Bn - liczba rozmieszczeń n różnych obiektów w co najwyżej n identycznych pudełkach. (2) Bn - liczba obsadzeń n osób dookoła co najwyżej n stolików (gdy nieważny jest sposób usadzenia osób przy stoliku). (3) Liczba naturalna będąca iloczynem n różnych liczb pierwszych może być przedstawiona w postaci iloczynu różnych czynników na Bn sposobów. (4) Bn - liczba ciągów modelowych dla słów długości n. (5) Bn - liczba różnych schematów rymowych w strofie n-wersowej. (6) Bn - liczba permutacji zbioru {1, 2, ..., n} z określonym porządkiem na wszystkich cyklach. (7) Wiadomo, że relacja równoważności dzieli zbiór, na którym jest określona na rozłączne i niepuste klasy abstrakcji. Wynika stąd i z Definicji, że Bn - liczba relacji równoważności na zbiorze n-elementowym.

Page 3: Podział zbioru

Rekurencja

Rozważmy usadzenia (n + 1) osób dookoła co najwyżej (n + 1) stolików (niektóre stoliki mogą być puste). Wyróżnijmy jedną osobę, np. ostatnią. Może ona siedzieć przy stoliku z r innymi osobami (r = 0, 1, 2, ..., n), które można wybrać na

sposobów spośród innych osób. Wtedy pozostałe (n − r) osób może usiąść przy co najwyżej n stolikach na Bn−r sposobów.

Stosując zasady: mnożenia i dodawania, mamy, że:

Powyższe równanie rekurencyjne, wraz z warunkiem brzegowym: B0 = 1 stanowi kolejną definicje ciągu liczb Bella i umożliwia wypisanie tablicy ich wartości.

N Bn

0 1

1 1

2 2

3 5

4 15

5 52

6 203

7 877

8 4140

9 21147

10 115975

11 678570

12 4213597

13 190899322

14 1382958545

III.Generowanie podziałów zbioru Podziały utworzone przez program Mathematica

Użyjemy wyjaśnionego w punkcie 2 definiowania rekurencyjnego lecz bez zbędnego zagłębiania się w kod źródłowy.

BellList[1] = {{{1}}}; (* podstawowy zbiór*) BellList[n_Integer?Positive] := BellList[n] = (* cachowanie *)

Page 4: Podział zbioru

Flatten[ Join[ Map[ReplaceList[#,{S__}->{S,{n}}]&, BellList[n-1]], Map[ReplaceList[#,{b___,{S__},a___}->{b,{S,n},a}]&, BellList[n-1]]], 1]

{1, 2, 3}, 5 partycji:

{1, 2, 3, 4}, 15 partycji:

{1, 2, 3, 4, 5}, 52 partycje:

Page 5: Podział zbioru

{1, 2, 3, 4, 5, 6}, 203 partycji:

Page 6: Podział zbioru

A partycje w postaci liczbowej które zobrazowano powyżej: BellList[2] {{1}, {2}} {{1, 2}} BellList[3] {{1}, {2}, {3}} {{1, 2}, {3}} {{1, 3}, {2}} {{1}, {2, 3}} {{1, 2, 3}} BellList[4] {{1}, {2}, {3}, {4}} {{1, 2}, {3}, {4}} {{1, 3}, {2}, {4}} {{1}, {2, 3}, {4}} {{1, 2, 3}, {4}} {{1, 4}, {2}, {3}} {{1}, {2, 4}, {3}} {{1}, {2}, {3, 4}} {{1, 2, 4}, {3}} {{1, 2}, {3, 4}} {{1, 3, 4}, {2}} {{1, 3}, {2, 4}} {{1, 4}, {2, 3}} {{1}, {2, 3, 4}} {{1, 2, 3, 4}}

Generowanie wszystkich podziałów zbioru {1,…,n} Dane:n Wyniki: Ciąg wszystkich partycji zbioru {1,…,n} w którym każdy następny podział powstaje z poprzedniego przez przeniesienie pojedynczego elementu do innego bloku.

1.begin

2.for i:=1 to n do //umieszcza i-te elementy w pierwszym bloku

3.begin BLOK[i]:=1; KIER[i]:=true

4.end;

5.NAS[1]:=0;

6.wypisz podział;

7.j:=n; //zmiennej j przypisuje element aktywny

8.while j>1 do

9.begin k:=BLOK[j];

10.if KIER[j] then //zmienna j przesuwa się do przodu

11.begin

12.if NAS[k]=0 then //numer k bloku jest ostatnim blokiem

13.begin NAS[k]:=j; POP[j]:=k; NAS[j]:=0

14.end;

Page 7: Podział zbioru

15.if NAS[k]>j then //zmienna j tworzy nowy blok

16.begin POP[j]:=k; NAS[j]:=NAS[k];

17.POP[NAS[j]]:=j; NAS[k]:=j

18.end;

19.BLOK[j]:=NAS[k]

20.end;

21.else //zmienna j przesuwa się do tyłu

22.begin BLOK[j]:=POP[k];

23.if k=j then //zmienna j tworzył blok jednoelementowy

24.if NAS[k]=0 then NAS[POP[k]]:=0

25.else begin NAS[POP[k]]:=NAS[k];

26.POP[NAS[k]]:=POP[k]

27.end

28.end;

29.wypisz podział;

30.j:=n;

31.while (j>1) end

32.((KIER[j] and (BLOK[j]=j)) or (not KIER[j] and (BLOK[j]=1)))

do

33.begin KIER:= not KIER[j]; j:=j-1

34.end

35.end

36.end