Sunteți pe pagina 1din 35

ALGORITMICA GRAFURILOR

Conf. univ. dr. COSTEL BĂLCĂU

2022
Tematica

1 Aranjamente, combinări, permutări 5


1.1 Preliminarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Produs cartezian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Submult, imi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Aranjamente cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Aranjamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 Permutări . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.7 Combinări . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.8 Combinări cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.9 Permutări cu repetit, ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2 Partit, ii 17
2.1 Compuneri ale unui număr natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 Partit, ii ale unui număr natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3 Partit, ii ale unei mult, imi finite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3 Grafuri 24

4 Arbori s, i arborescent, e 25

5 Arbori part, iali de cost minim 26

6 Grafuri euleriene 27

7 Grafuri hamiltoniene 28

8 Grafuri turneu 29

9 Colorări ı̂n grafuri 30

10 Grafuri bipartite 31

11 Grafuri planare 32

12 Distant, e s, i drumuri minime ı̂n grafuri ponderate 33

13 Fluxuri ı̂n ret, ele de transport 34

1
Evaluare

• Activitate laborator: 30% (Programe obligatorii, programe suplimentare s, i probleme din Temele
de laborator)

• Teme de casă: 20% (Programe suplimentare s, i probleme nerezolvate ı̂n timpul laboratorului,
din Temele de laborator)

• Examen final: 50% (Probă scrisă: algoritmi s, i probleme)

2
Bibliografie

[1] A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, Addison-Wesley, Massachusetts, 2009.

[2] Gh. Barbu, V. Păun, Calculatoare personale s, i programare ı̂n C/C++, Editura Didactică s, i Pedagogică,
Bucures, ti, 2005.

[3] Gh. Barbu, V. Păun, Programarea ı̂n limbajul C/C++, Editura Matrix Rom, Bucures, ti, 2011.

[4] Gh. Barbu, I. Văduva, M. Bolos, teanu, Bazele informaticii, Editura Tehnică, Bucures, ti, 1997.

[5] C. Bălcău, Combinatorică s, i teoria grafurilor, Editura Universităt, ii din Pites, ti, Pites, ti, 2007.

[6] O. Bâscă, L. Livovschi, Algoritmi euristici, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2003.

[7] E. Ciurea, Algoritmi. Introducere ı̂n algoritmica grafurilor, Editura Tehnică, Bucures, ti, 2001.

[8] E. Ciurea, L. Ciupală, Algoritmi. Introducere ı̂n algoritmica fluxurilor ı̂n ret, ele, Editura Matrix Rom, Bucures, ti,
2006.

[9] I. Codreanu, M. Lascu, Probleme de combinatorică, Editura Gil, Zalău, 2016.

[10] T.H. Cormen, Algorithms Unlocked, MIT Press, Cambridge, 2013.

[11] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms, MIT Press, Cambridge, 2009.

[12] C. Croitoru, Tehnici de bază ı̂n optimizarea combinatorie, Editura Universităt, ii ”Al. I. Cuza”, Ias, i, 1992.

[13] S. Even, Graph Algorithms, Cambridge University Press, 2012.

[14] D. Fanache, Teoria algoritmică a grafurilor, Editura Paralela 45, Pites, ti, 2016.

[15] H. Georgescu, Tehnici de programare, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2005.

[16] C.A. Giumale, Introducere ı̂n analiza algoritmilor. Teorie s, i aplicat, ii, Editura Polirom, Ias, i, 2004.

[17] F.V. Jensen, T.D. Nielsen, Bayesian Networks and Decision Graphs, Springer, New York, 2007.

[18] D. Jungnickel, Graphs, Networks and Algorithms, Springer, 2013.

[19] M. Keller, W. Trotter, Applied Combinatorics, Open Textbook Library, 2017.

[20] D.E. Knuth, The Art Of Computer Programming. Vol. 4A: Combinatorial Algorithms, Addison-Wesley, Mas-
sachusetts, 2011.

[21] B. Korte, J. Vygen, Combinatorial Optimization.Theory and Algorithms, Springer, 2012.

[22] L. Livovschi, H. Georgescu, Sinteza s, i analiza algoritmilor, Editura S, tiint, ifică s, i Enciclopedică, Bucures, ti, 1986.

[23] D. Logofătu, Algoritmi fundamentali ı̂n Java: Aplicat, ii, Editura Polirom, Ias, i, 2007.

[24] D. Lucanu, M. Craus, Proiectarea algoritmilor, Editura Polirom, Ias, i, 2008.

3
4

[25] L. Panaitopol, A. Szilard, D. S, erbănescu, Probleme de combinatorică pentru juniori, Editura Gil, Zalău, 2019.

[26] V. Pop, L. Popa, D. Popa, M. Olteanu, G. Mincu, M. Burlică, R. Strungariu, M. Ispas, Teme s, i probleme pentru
concursurile student, es, ti de matematică. Volumul II. Concursuri internat, ionale, Editura StudIS, Ias, i, 2013.

[27] V. Pop, M. Teleucă, Probleme de combinatorică elementară. Numărare, grafuri, jocuri, Editura Matrix Rom,
Bucures, ti, 2013.

[28] D.R. Popescu, Combinatorică s, i teoria grafurilor, Societatea de S, tiint, e Matematice din România, Bucures, ti,
2005.

[29] D.R. Popescu, R. Marinescu-Ghemeci, Combinatorică s, i teoria grafurilor prin exercit, ii s, i probleme, Editura
Matrix Rom, Bucures, ti, 2014.

[30] C.P. Popovici, H. Georgescu, L. State, Bazele informaticii. Vol. I s, i II, Editura Universităt, ii din Bucures, ti,
Bucures, ti, 1990-1991.

[31] S.S. Ray, Graph Theory with Algorithms and its Applications, Springer, New Delhi, 2013.

[32] O.A. Schipor, S.G. Pentiuc, F. Gı̂ză-Belciug, Limbajul C - Tehnici de programare eficientă, Editura Matrix Rom,
Bucures, ti, 2014.

[33] R. Sedgewick, K. Wayne, Algorithms, Addison-Wesley, Massachusetts, 2011.

[34] N.O. Stănăs, ilă s, .a., Teme s, i probleme pentru concursurile student, es, ti de matematică. Volumul III. Concursuri
nat, ionale, Editura StudIS, Ias, i, 2013.

[35] R. Stephens, Essential Algorithms: A Practical Approach to Computer Algorithms, Wiley, Indianopolis, 2013.

[36] T. Toadere, Grafe. Teorie, algoritmi s, i aplicat, ii, Editura Albastră, Cluj-Napoca, 2002.

[37] I. Tomescu, Combinatorică s, i teoria grafurilor, Tipografia Universităt, ii din Bucures, ti, Bucures, ti, 1978.

[38] I. Tomescu, Probleme de combinatorică s, i teoria grafurilor, Editura Didactică s, i Pedagogică, Bucures, ti, 1981.

[39] I. Tomescu, Data structures, Editura Universităt, ii din Bucures, ti, Bucures, ti, 2004.

[40] ***, Handbook of combinatorics, edited by R.L. Graham, M. Grőtschel and L. Lovász, Elsevier, Amsterdam,
1995.

[41] ***, Handbook of discrete and combinatorial mathematics, edited by K.H. Rosen, J.G. Michaels, J.L. Gross, J.W.
Grossman and D.R. Shier, CRC Press, Boca Raton, 2000.

[42] ***, Revista MATINF. Publicat, ie bianuală de matematică s, i informatică pentru elevi s, i profesori, editată de
Departamentul Matematică-Informatică, Universitatea din Pites, ti, Editura Universităt, ii din Pites, ti.
Tema 1

Aranjamente, combinări, permutări

1.1 Preliminarii
În această lect, ie vom prezenta formule de numărare s, i algoritmi de generare (enumerare) pentru
cele mai cunoscute familii de obiecte combinatoriale: produs cartezian, submult, imi, aranjamente
(fără repetit, ie, cu repetit, ie sau ordonate), combinări (fără repetit, ie sau cu repetit, ie), permutări (fără
repetit, ie sau cu repetit, ie). Reamintim ı̂n continuare câteva not, iuni uzuale.
Definit, ia 1.1.1. Fie A o mult, ime finită. Numărul de elemente ale lui A, notat cu card (A), se
numes, te cardinalul mult, imii A.
Definit, ia 1.1.2. Fie A un alfabet (adică o mult, ime finită) s, i n ∈ N⋆ . O secvent, ă de forma
a = a1 a2 . . . an , cu a1 , a2 , . . . , an ∈ A,
se numes, te cuvânt de lungime n peste alfabetul A. Lungimea cuvântului a se notează cu |a|.
Observat, ia 1.1.1. Evident, cuvântul a1 a2 . . . an poate fi identificat cu vectorul (a1 , a2 , . . . , an ).
Definit, ia 1.1.3. Fie A o mult, ime (alfabet) total ordonată s, i x = (x1 , . . . , xn ), y = (y1 , . . . , ym )
doi vectori (cuvinte) cu elemente (litere) din A. Spunem că x este mai mic decât y ı̂n ordine
lexicografică s, i notăm x ≺ y dacă
(x1 , . . . , xn ) = (y1 , . . . , yn ) s, i m > n
sau dacă există un indice i, i ≤ min{m, n}, astfel ı̂ncât
(x1 , . . . , xi−1 ) = (y1 , . . . , yi−1) s, i xi < yi .
Exemplul 1.1.1. Considerând alfabetul A = {a, b, c, . . . , z} s, i ordinea alfabetică uzuală a < b < c <
· · · < z, avem
ion ≺ ionela ≺ ionescu.
Definit, ia 1.1.4. Fie x ∈ R s, i n ∈ N. Notăm
 
 1, dacă n = 0,  1, dacă n = 0,
[x]n = x(x − 1) . . . (x − n + 1), dacă n ≥ 1, [x]n = x(x + 1) . . . (x + n − 1), dacă n ≥ 1.
 | {z }  | {z }
n factori n factori

[x]n se numes, te polinomul factorial descrescător de gradul n, iar [x]n se numes, te polinomul
factorial crescător de gradul n.
Exemplul 1.1.2. Avem [1,5]3 = 1,5 · 0,5 · (−0,5) = −0,375, iar [1,5]3 = 1,5 · 2,5 · 3,5 = 13,125.

5
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 6

1.2 Produs cartezian


Definit, ia 1.2.1. Produsul cartezian al mult, imilor A1 , A2 , . . . , An (n ∈ N⋆ ) este mult, imea

A1 × A2 × . . . × An = {(a1 , a2 , . . . , an )|a1 ∈ A1 , a2 ∈ A2 , . . . , an ∈ An }.

Exemplul 1.2.1. {a, b} × {+, −} × {c} = {(a, +, c), (a, −, c), (b, +, c), (b, −, c)}.

Propozit, ia 1.2.1 (de numărare a produsului cartezian). Fie n ∈ N⋆ s, i A1 , A2 , . . . , An mult, imi


finite. Atunci card (A1 × A2 × . . . × An ) = card (A1 ) · card (A2 ) · . . . · card (An ).

Demonstrat, ie. Se utilizează metoda induct, iei matematice după n.


Algoritmul 1.2.1 (de generare a produsului cartezian). Fie mult, imile standard

A1 = {1, 2, . . . , m1 }, A2 = {1, 2, . . . , m2 }, . . . , An = {1, 2, . . . , mn }.

Vom utiliza ”regula următorului”.

• Primul element al produsului cartezian A1 × A2 × . . . × An , ı̂n ordine lexicografică, este

(c1 , c2 , . . . , cn ) = (1, 1, . . . , 1).

• Un element arbitrar (curent)

(c1 , . . . , ck−1, ck , ck+1 , . . . , cn )

are un element următor dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel ı̂ncât ck < mk .
În acest caz, luând cel mai mare indice k cu această proprietate, elementul următor, ı̂n ordine
lexicografică, este
(c1 , . . . , ck−1, ck + 1, 1, . . . , 1).
În pseudocod, algoritmul poate fi descris sub forma
PRODUS CARTEZIAN(n, m) :
for i = 1, n do c[i] ← 1;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m[k]) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← 1;
AFISARE(c, n);
while (k > 0);
unde funct, ia de afis, are este
AFISARE(c, n) :
for i = 1, n do
afis, ează c[i];
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 7

Observat, ia 1.2.1. Pentru generarea produsului cartezian A1 × A2 × . . . × An al unor mult, imi finite
arbitrare

A1 = {a11 , a12 , . . . , a1m1 }, A2 = {a21 , a22 , . . . , a2m2 }, . . . , An = {an1 , an2 , . . . , anmn }

se poate folosi algoritmul anterior, bazat pe generarea indicilor, ı̂nlocuind afis, area indicilor ci cu
afis, area elementelor corespunzătoare aici din mult, imile Ai , adică ı̂nlocuind funct, ia AFIS, ARE(c, n)
cu funct, ia
AFISARE(c, a, n) :
for i = 1, n do
afis, ează a[i, c[i]];

1.3 Submult, imi


Propozit, ia 1.3.1 (de numărare a submult, imilor). Fie A o mult, ime finită s, i P(A) mult, imea
tuturor submult, imilor (părt, ilor) lui A. Atunci card (P(A)) = 2card (A) .
Demonstrat, ie. Fie A = {a1 , a2 , . . . , an }, n ∈ N⋆ . Notăm {1, 2}n = {1, 2} × . . . × {1, 2}.
| {z }
de n ori
Definim funct, iile α : P(A) → {1, 2}n s, i β : {1, 2}n → P(A) prin:

1, dacă ai ∈ B,
• ∀B ∈ P(A), α(B) = (c1 , c2 , . . . , cn ), unde ci =
2, dacă ai 6∈ B;

• ∀ (c1 , c2 , . . . , cn ) ∈ {1, 2}n , β(c1 , c2 , . . . , cn ) = {ai |ci = 1, i ∈ {1, . . . , n}}.


Funct, iile α s, i β sunt inverse una celeilalte, deci sunt bijective s, i card (P(A)) = card ({1, 2}n) = 2n .
Exemplul 1.3.1. Pentru A = {a, b, c}, corespondent, a submult, imi ↔ produs cartezian din demonstrat, ia
anterioară este redată ı̂n următorul tabel:
(c1 , c2 , c3 ) ∈ {1, 2}3 B ∈ P(A)
(1,1,1) {a, b, c}
(1,1,2) {a, b}
(1,2,1) {a, c}
(1,2,2) {a}
(2,1,1) {b, c}
(2,1,2) {b}
(2,2,1) {c}
(2,2,2) ∅

Deci A are 23 = 8 submult, imi.


Algoritmul 1.3.1 (de generare a submult, imilor). Fie mult, imea A = {a1 , a2 , . . . , an }. Conform
demonstrat, iei anterioare, putem genera produsul cartezian {1, 2}n cu Algoritmul 1.2.1 ı̂nlocuind
afis, area elementelor (c1 , . . . , cn ) cu afis, area submult, imilor corespunzătoare

B = {ai |ci = 1, i ∈ {1, . . . , n}}.

Obt, inem următorul algoritm descris ı̂n pseudocod.


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 8

SUBMULT, IMI(a, n) :
for i = 1, n do c[i] ← 1;
AFISARE(c, a, n);
repeat
k ← n;
while (c[k] = 2) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← 2;
for i = k + 1, n do c[i] ← 1;
AFISARE(c, a, n);
while (k > 0);
unde funct, ia de afis, are este
AFISARE(c, a, n) :
for i = 1, n do
if c[i] = 1 then afis, ează a[i];

1.4 Aranjamente cu repetit, ie


Propozit, ia 1.4.1 (de numărare a aranjamentelor cu repetit, ie). Fie m, n ∈ N. Atunci numărul
de cuvinte de lungime n peste un alfabet cu m litere este egal cu mn .
Demonstrat, ie. Fie B = {1, 2, . . . , m} s, i C = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i}. Cum C = B n , conform
Propozit, iei 1.2.1 avem card (C) = mn .
Definit, ia 1.4.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc aranjamente cu repetit, ie
de m luate câte n. Prin abuz de limbaj, s, i numărul lor, adică mn , se numes, te tot aranjamente cu
repetit, ie de m luate câte n.
Exemplul 1.4.1. Pentru m = 2 s, i n = 3, aranjamente cu repetit, ie sunt, ı̂n ordine lexicografică:

(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2).

Deci avem 23 = 8 aranjamente cu repetit, ie.


Algoritmul 1.4.1 (de generare a aranjamentelor cu repetit, ie, sub formă de cuvinte). Pentru
mult, imea standard B = {1, 2, . . . , m}, conform demonstrat, iei anterioare putem genera produsul
cartezian B n , cu Algoritmul 1.2.1, luând m1 = m2 = · · · = mn = m.
Observat, ia 1.4.1. Pentru o mult, ime A = {a1 , a2 , . . . , am } oarecare putem genera indicii (c1 , . . . , cn )
cu algoritmul anterior s, i afis, a elementele corespunzătoare acestor indici (ac1 , . . . , acn ).

1.5 Aranjamente
Propozit, ia 1.5.1 (de numărare a aranjamentelor). Fie m, n ∈ N. Atunci numărul de cuvinte
de lungime n cu litere distincte peste un alfabet cu m litere este egal cu [m]n .
Demonstrat, ie. Fie B = {1, 2, . . . , m} s, i C1 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci 6= cj ∀ i 6= j}. Avem
C1 = {(c1 , c2 , . . . , cn )|c1 ∈ {1, . . . , m}, c2 ∈ {1, . . . , m} \ {c1 }, c3 ∈ {1, . . . , m} \ {c1 , c2 }, . . . , cn ∈
{1, . . . , m} \ {c1 , . . . , cn−1 }}, deci card (C1 ) = m(m − 1)(m − 2) . . . (m − n + 1) = [m]n .
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 9

Definit, ia 1.5.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc aranjamente (fără repetit, ie)
de m luate câte n. De asemenea s, i numărul lor, adică [m]n , se numes, te tot aranjamente (fără
repetit, ie) de m luate câte n s, i se mai notează cu Anm .
Observat, ia 1.5.1. Pentru n > m avem [m]n = m . . . (m − m) . . . (m − n + 1) = 0.
Exemplul 1.5.1. Pentru m = 4 s, i n = 2, aranjamentele sunt, ı̂n ordine lexicografică:
(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3).
Deci avem [4]2 = 4 · 3 = 12 aranjamente.
Un algoritm pentru generarea aranjamentelor va fi prezentat ı̂n Sect, iunea 1.7.

1.6 Permutări
Propozit, ia 1.6.1 (de numărare a permutărilor). Fie n ∈ N. Atunci numărul de cuvinte ce
cont, in exact o dată fiecare literă a unui alfabet cu n litere este egal cu n!, unde
n! = 1 · 2 · 3 · · · · · n (n factorial), 0! = 1.
Demonstrat, ie. Luăm m = n ı̂n Propozit, ia 1.5.1 s, i folosim egalitatea [n]n = n(n − 1) . . . 1 = n!.
Definit, ia 1.6.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc permutări (fără repetit, ie)
de ordinul n. De asemenea s, i numărul lor, adică n!, se numes, te tot permutări (fără repetit, ie)
de n.
Exemplul 1.6.1. Pentru n = 3, permutările mult, imii standard {1, 2, 3} sunt, ı̂n ordine lexicografică:
(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1).
Deci avem 3! = 1 · 2 · 3 = 6 permutări.
Algoritmul 1.6.1 (de generare a permutărilor). Fie mult, imea standard A = {1, 2, . . . , n}. Vom
utiliza din nou ”regula următorului”.
• Prima permutare, ı̂n ordine lexicografică, este
(p1 , p2 , . . . , pn ) = (1, 2, . . . , n).

• O permutare arbitrară (curentă)


(p1 , p2 , . . . , pk−1 , pk , pk+1, . . . , pn )
are o permutare următoare dacă s, i numai dacă există un indice k ∈ {n − 1, . . . , 1} astfel ı̂ncât
pk < pk+1. În acest caz, luând cel mai mare indice k cu această proprietate s, i cel mai mare indice
j din {n, . . . , k + 1} astfel ı̂ncât pj > pk (există, deoarece pk+1 > pk ), permutarea următoare,
ı̂n ordine lexicografică, este
(p1 , p2 , . . . , pk−1, pj , p′k+1 , . . . , p′j , . . . , p′n ),
unde vectorul (p′k+1, . . . , p′j , . . . , p′n ) este obt, inut prin ordonarea crescătoare a elementelor rămase
(pk , pk+1 , . . . , pj−1, pj+1, . . . , pn ). Cum aceste elemente formează vectorul ordonat descrescător
(pk+1 , . . . , pj−1 , pk , pj+1, . . . , pn ),
rezultă că vectorul (p′k+1 , . . . , p′j , . . . , p′n ) este răsturnatul acestuia s, i deci poate fi obt, inut din
acesta, de exemplu, prin interschimbări ı̂ntre termenii situat, i la egală distant, ă fat, ă de mijloc.
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 10

De exemplu, pentru permutarea curentă


(2, 7, 4, 8, 6, 5, 3, 1)
avem k = 3 (p3 = 4 < p4 = 8), j = 6 (pj = 5 > pk = 4), deci permutarea următoare se obt, ine
interschimbând ı̂ntâi pk = p3 = 4 cu pj = p6 = 5, apoi răsturnând subvectorul (8, 6, 4, 3, 1) dintre
pozit, iile k + 1 s, i n (de exemplu prin interschimbările 8 ↔ 1, 6 ↔ 3), adică această permutare
următoare este
(2, 7, 5, 1, 3, 4, 6, 8).
În pseudocod, algoritmul poate fi descris sub forma
PERMUTĂRI(n) :
for i = 1, n do p[i] ← i;
AFISARE(p, n);
repeat
k ← n − 1;
while (p[k] ≥ p[k + 1]) and (k > 0) do k ← k − 1;
if (k > 0) then
j ← n;
while (p[j] ≤ p[k]) do j ← j − 1;
p[k] ↔ p[j];
 
for i = 1, n−k
2
do p[k + i] ↔ p[n − i + 1];
AFISARE(p, n);
while (k > 0);
unde ↔ reprezintă instruct, iunea de interschimbare, iar [x] = ⌊x⌋ reprezintă partea ı̂ntreagă
(inferioară) a numărului x ∈ R.
Observat, ia 1.6.1. Pentru generarea permutărilor unei mult, imi arbitrare A = {a1 , a2 , . . . , an } ı̂nlocuim
afis, area indicilor (p1 , . . . , pn ) cu afis, area elementelor corespunzătoare (ap1 , . . . , apn ).

1.7 Combinări
Propozit, ia 1.7.1 (de numărare a combinărilor). Fie m, n ∈ N. Atunci
numărul de cuvinte strict crescătoare de lungime n peste un alfabet (ordonat) cu m litere
= numărul  de submult
 , imi cu n elemente ale unei mult, imi cu m elemente
[m]n def m
= = .
n! n
Demonstrat, ie. Fie B = {1, 2, . . . , m}. Notăm mult, imile din enunt, astfel:
C3 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci < ci+1 ∀ i}, S3 = {S|S ⊆ B, card (S) = n}.
Între aceste mult, imi definim funct, iile µ : C3 → S3 , ν : S3 → C3 prin:
• ∀ (c1 , c2 , . . . , cn ) ∈ C3 , µ(c1 , c2 , . . . , cn ) = {c1 , c2 , . . . , cn };
• ∀ {c1 , c2 , . . . , cn } ∈ S3 cu c1 < c2 < . . . < cn , ν({c1 , c2 , . . . , cn }) = (c1 , c2 , . . . , cn ).
Aceste funct, ii sunt inverse una celeilalte, deci sunt bijective s, i astfel card (C3 ) = card (S3 ).
Permutând fiecare combinare (c1 , c2 , . . . , cn ) ∈ C3 ı̂n toate cele n! moduri posibile, obt, inem fără
repetare toate aranjamentele din mult, imea C1 = {(a1 , a2 , . . . , an )|ai ∈ B ∀ i, ai 6= aj ∀i 6= j}.
[m]n
Deci card (C3 )·n! = card (C1 ). Conform Propozit, iei 1.5.1, card (C1 ) = [m]n , deci card (C3 ) = .
n!
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 11

Definit, ia 1.7.1. Oricare obiecte din cele 2 tipuri numărate ı̂n propozit, ia anterioarăse 
numesc com-
m
binări (fără repetit, ie) de m luate câte n. De asemenea s, i numărul lor, adică , se numes, te
n
n
tot combinări (fără repetit, ie) de m luate câte n s, i se mai notează cu Cm .
 
m
Observat, ia 1.7.1. Pentru n > m avem = 0, deoarece [m]n = 0.
n  
m! m m!
Pentru n ≤ m, deoarece [m]n = m(m − 1) . . . (m − n + 1) = avem = .
(m − n)! n n!(m − n)!
Exemplul 1.7.1. Pentru m = 5 s, i n = 3, corespondent, ele din demonstrat, ia anterioară sunt redate ı̂n
următorul tabel:
(c1 , c2 , c3 ) ∈ C3 S ∈ S3
(1,2,3) {1, 2, 3}
(1,2,4) {1, 2, 4}
(1,2,5) {1, 2, 5}
(1,3,4) {1, 3, 4}
(1,3,5) {1, 3, 5}
(1,4,5) {1, 4, 5}
(2,3,4) {2, 3, 4}
(2,3,5) {2, 3, 5}
(2,4,5) {2, 4, 5}
(3,4,5) {3, 4, 5}.
 
5 [5]3 5·4·3
Deci avem = = = 10 combinări.
3 3! 1·2·3
Algoritmul 1.7.1 (de generare a combinărilor). Fie mult, imea standard B = {1, 2, . . . , m} s, i
n ≤ m. Vom utiliza din nou ”regula următorului”.

• Prima combinare (de m luate câte n), ı̂n ordine lexicografică, este

(c1 , c2 , . . . , cn ) = (1, 2, . . . , n).

• O combinare arbitrară (curentă)

(c1 , c2 , . . . , ck−1 , ck , ck+1, . . . , cn )

are o combinare următoare dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel ı̂ncât
ck < m − n + k. În acest caz, luând cel mai mare indice k cu această proprietate, combinarea
următoare, ı̂n ordine lexicografică, este

(c1 , c2 , . . . , ck−1 , ck + 1, ck + 2, . . . , ck + 1 + n − k).

De exemplu, pentru m = 8, n = 6 s, i combinarea curentă (1, 2, 5, 6, 7, 8) avem k = 2 (c2 = 2 <


m − n + k = 8 − 6 + 2), deci combinarea următoare este (1, 3, 4, 5, 6, 7).
În pseudocod, algoritmul poate fi descris sub forma
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 12

COMBINĂRI(m, n) :
for i = 1, n do c[i] ← i;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m − n + k) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[i − 1] + 1;
AFISARE(c, n);
while (k > 0);

Algoritmul 1.7.2 (de generare a aranjamentelor). Fie mult, imea standard B = {1, 2, . . . , m} s, i
n ≤ m. Conform demonstrat, iei anterioare, putem genera aranjamentele de m luate câte n prin
generarea combinărilor s, i permutarea fiecărei combinări. Folosind Algoritmii 1.7.1 s, i 1.6.1 obt, inem
următoarea descriere ı̂n pseudocod.
ARANJAMENTE(m, n) :
for i = 1, n do c[i] ← i;
PERMUTĂRI(n);
repeat
k ← n;
while (c[k] = m − n + k) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[i − 1] + 1;
PERMUTĂRI(n);
while (k > 0);
unde PERMUTĂRI(n) este funct, ia din Algoritmul 1.6.1 ı̂nlocuind funct, ia de afis, are cu
AFISARE(c, p, n) :
for i = 1, n do
afis, ează c[p[i]];

Exemplul 1.7.2. Pentru m = 4 s, i n = 3, corespondent, a aranjamente ↔ permutările combinărilor din


demonstrat, ia anterioară s, i din algoritmul anterior este redată ı̂n următorul tabel:
Combinare Permutare Aranjament Combinare Permutare Aranjament
(1,2,3) (1,2,3) (1,2,3) (1,3,4) (1,2,3) (1,3,4)
(1,3,2) (1,3,2) (1,3,2) (1,4,3)
(2,1,3) (2,1,3) (2,1,3) (3,1,4)
(2,3,1) (2,3,1) (2,3,1) (3,4,1)
(3,1,2) (3,1,2) (3,1,2) (4,1,3)
(3,2,1) (3,2,1) (3,2,1) (4,3,1)
(1,2,4) (1,2,3) (1,2,4) (2,3,4) (1,2,3) (2,3,4)
(1,3,2) (1,4,2) (1,3,2) (2,4,3)
(2,1,3) (2,1,4) (2,1,3) (3,2,4)
(2,3,1) (2,4,1) (2,3,1) (3,4,2)
(3,1,2) (4,1,2) (3,1,2) (4,2,3)
(3,2,1) (4,2,1) (3,2,1) (4,3,2)
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 13
 
4
Deci avem · 3! = [4]3 = 4 · 3 · 2 = 24 aranjamente.
3
Observat, ia 1.7.2. Analog Observat, iei 1.6.1, algoritmii anteriori pot fi adaptat, i pentru generarea
combinărilor s, i aranjamentelor pentru mult, imi oarecare.

1.8 Combinări cu repetit, ie


Propozit, ia 1.8.1 (de numărare a combinărilor cu repetit, ie). Fie m, n ∈ N. Atunci numărul de
 
[m]n def m
cuvinte crescătoare de lungime n peste un alfabet (ordonat) cu m litere este egal cu = .
n! n
Demonstrat, ie. Fie B = {1, 2, . . . , m}, A = {1, 2, . . . , m + n − 1},

C4 = {(c1 , c2 , . . . , cn )|ci ∈ B ∀ i, ci ≤ ci+1 ∀ i}, C3 = {(d1 , d2 , . . . , dn )|di ∈ A ∀ i, di < di+1 ∀ i}.

Definim corespondent, ele ρ : C4 → C3 , σ : C3 → C4 astfel:


• ρ(c1 , c2 , c3 , . . . , cn ) = (c1 , c2 + 1, c3 + 2, . . . , cn + n − 1);
• σ(d1 , d2 , d3 , . . . , dn ) = (d1 , d2 − 1, d3 − 2, . . . , dn − n + 1).
Acestea sunt funct, ii inverse, deciutilizând Propozitia 1.7.1 avem
 
m+n−1 [m + n − 1]n [m]n m
card (C4 ) = card (C3 ) = = = = .
n n! n! n
Definit, ia 1.8.1. Cuvintele numărate ı̂n propozit, ia anterioară
 se numesc combinări cu repetit, ie
m
de m luate câte n. De asemenea s, i numărul lor, adică , se numes, te tot combinări cu
n
repetit, ie de m luate câte n.
Exemplul 1.8.1. Pentru m = 3 s, i n = 4, combinările cu repetit, ie sunt, ı̂n ordine lexicografică:

(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3), (1, 2, 2, 2), (1, 2, 2, 3),

(1, 2, 3, 3), (1, 3, 3, 3), (2, 2, 2, 2), (2, 2, 2, 3), (2, 2, 3, 3), (2, 3, 3, 3), (3, 3, 3, 3).
 
3 [3]4 3·4·5·6
Deci avem = = = 15 combinări cu repetit, ie.
4 4! 1·2·3·4
Algoritmul 1.8.1 (de generare a combinărilor cu repetit, ie). Fie mult, imea standard B = {1, 2, . . . , m}.
Vom utiliza din nou ”regula următorului”.
• Prima combinare cu repetit, ie (de m luate câte n), ı̂n ordine lexicografică, este
(c1 , c2 , . . . , cn ) = (1, 1, . . . , 1).

• O combinare cu repetit, ie arbitrară (curentă)


(c1 , c2 , . . . , ck−1 , ck , ck+1, . . . , cn )

are o combinare cu repetit, ie următoare dacă s, i numai dacă există un indice k ∈ {n, . . . , 1} astfel
ı̂ncât ck < m. În acest caz, luând cel mai mare indice k cu această proprietate, combinarea cu
repetit, ie următoare, ı̂n ordine lexicografică, este

(c1 , c2 , . . . , ck−1 , ck + 1, ck + 1, . . . , ck + 1).


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 14

De exemplu, pentru m = 8, n = 6 s, i combinarea cu repetit, ie curentă (2, 4, 5, 8, 8, 8) avem k = 3


(c3 = 5 < m = 8) deci combinarea cu repetit, ie următoare este (2, 4, 6, 6, 6, 6).
În pseudocod, algoritmul poate fi descris sub forma
COMBINĂRI CU REPETIT , IE(m, n) :
for i = 1, n do c[i] ← 1;
AFISARE(c, n);
repeat
k ← n;
while (c[k] = m) and (k > 0) do k ← k − 1;
if (k > 0) then
c[k] ← c[k] + 1;
for i = k + 1, n do c[i] ← c[k];
AFISARE(c, n);
while (k > 0);

Observat, ia 1.8.1. Analog Observat, iei 1.6.1, algoritmul anterior poate fi adaptat pentru generarea
combinărilor cu repetit, ie pentru mult, imi oarecare.

1.9 Permutări cu repetit, ie


Propozit, ia 1.9.1 (de numărare a permutărilor cu repetit, ie). Fie m, t1 , t2 , . . . , tm ∈ N s, i
n = t1 + t2 + · · · + tm . Atunci numărul de cuvinte de lungime n ce pot fi formate peste un alfabet cu
m litere astfel ı̂ncât  litera numărul  i să apară de exact ti ori pentru orice i ∈ {1, . . . , m} este egal cu
n! def n
= .
t1 !t2 ! . . . tm ! t1 , t2 , . . . , tm
Demonstrat, ie. Fie A = {1, 2, . . . , m} s, i

C5 = {(x1 , x2 , . . . , xn )|xi ∈ A ∀ i, card ({i|xi = j}) = tj ∀ j}.

Numărăm cuvintele din C5 astfel:


 
n
• alegem cei t1 indici (din totalul de n) ai literelor egale cu 1, rezultă moduri posibile;
t1
• pentru fiecare
 alegere de mai sus, alegem cei t2 indici  restulde n − t1 ) ai literelor egale cu
 (din
n − t1 n n − t1
2, rezultă moduri posibile, deci obt, inem moduri posibile de alegere a
t2 t1 t2
indicilor literelor 1 s, i 2;

• ...

• pentru fiecare alegere de mai  sus, alegem cei tm indici (din restul de n − t1 − . . . − tm−1 ) ai
n − t1 − . . . − tm−1
literelor egale cu m; rezultă moduri posibile, deci obt, inem
tm
    
n n − t1 n − t1 − . . . − tm−1
...
t1 t2 tm

moduri posibile de alegere a tuturor indicilor literelor 1, 2, . . . , m.


TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 15

Astfel
    
n n − t1 n − t1 − . . . − tm−1
card (C5 ) = ...
t1 t2 tm
n! (n − t1 )! (n − t1 − . . . − tm−1 )!
= · · ...·
t1 !(n − t1 )! t2 !(n − t1 − t2 )! tm !(n − t1 − . . . − tm )!
n!
=
t1 !t2 ! . . . tm !
(deoarece (n − t1 − . . . − tm )! = 0! = 1).
Definit, ia 1.9.1. Cuvintele numărate ı̂n propozit, ia anterioară se numesc permutări  cu repetit  , ie
n
(anagrame) de n luate câte t1 , t2 , . . . , tm . De asemenea s, i numărul lor, adică , se
t1 , t2 , . . . , tm
numes, te tot permutări cu repetit, ie de n luate câte t1 , t2 , . . . , tm .
 
n
Observat, ia 1.9.1. Luând t1 = t2 = · · · = tm = 1 obt, inem n = m s, i = n!, deci
1, 1, . . . , 1
permutările (fără repetit
 , ie) sunt
 un caz particular al permutărilor cu repetit, ie. Pe de altă parte,
n n!
luând m = 2 obt, inem = , deci s, i combinările (fără repetit, ie) sunt un caz particular al
t1 , t2 t1 !t2 !
permutărilor cu repetit, ie.
Exemplul 1.9.1. Pentru m = 3 s, i t1 = 2, t2 = t3 = 1, deci n = 4, permutările cu repetit, ie sunt, ı̂n
ordine lexicografică:

(1, 1, 2, 3), (1, 1, 3, 2), (1, 2, 1, 3), (1, 2, 3, 1), (1, 3, 1, 2), (1, 3, 2, 1),

(2, 1, 1, 3), (2, 1, 3, 1), (2, 3, 1, 1), (3, 1, 1, 2), (3, 1, 2, 1), (3, 2, 1, 1).
 
4 4!
Deci avem = = 12 permutări cu repetit, ie.
2, 1, 1 2!1!1!
Algoritmul 1.9.1 (de generare a permutărilor cu repetit, ie). Fie mult, imea standard B =
{1, 2, . . . , m} s, i t1 , t2 , . . . , tm ∈ N, n = t1 + t2 + · · · + tm . Vom utiliza din nou ”regula următorului”.
• Prima permutare cu repetit, ie (de n luate câte t1 , t2 , . . . , tm ), ı̂n ordine lexicografică, este

(p1 , p2 , . . . , pn ) = (1, 1, . . . , 1, 2, 2, . . . , 2, . . . , m, m, . . . , m).


| {z } | {z } | {z }
de t1 ori de t2 ori de tm ori

• Existent, a s, i forma permutării cu repetit, ie următoare ı̂n ordine lexicografică pentru o permutare
cu repetit, ie curentă arbitrară se determină exact ca la permutările fără repetit, ie (Algoritmul
1.6.1).
De exemplu, pentru permutarea cu repetit, ie curentă

(4, 4, 1, 3, 6, 5, 5, 3, 2, 1)

avem k = 4 (p4 = 3 < p5 = 6), j = 7 (pj = 5 > pk = 3), deci permutarea cu repetit, ie următoare se
obt, ine interschimbând ı̂ntâi pk = p4 = 3 cu pj = p7 = 5, apoi răsturnând subvectorul (6, 5, 3, 3, 2, 1)
dintre pozit, iile k + 1 s, i n (de exemplu prin interschimbările 6 ↔ 1, 5 ↔ 2, 3 ↔ 3), adică aceată
permutare cu repetit, ie următoare este

(4, 4, 1, 5, 1, 2, 3, 3, 5, 6).
TEMA 1. ARANJAMENTE, COMBINĂRI, PERMUTĂRI 16

În pseudocod, algoritmul poate fi descris sub forma


PERMUTĂRI CU REPETIT , IE(n, t, m) :
n ← 0;
for i = 1, m do n ← n + t[i];
i ← 0;
for j = 1, m do
for k = 1, t[j] do
i ← i + 1;
p[i] ← j;
AFISARE(p, n);
repeat
k ← n − 1;
while (p[k] ≥ p[k + 1]) and (k > 0) do k ← k − 1;
if (k > 0) then
j ← n;
while (p[j] ≤ p[k]) do j ← j − 1;
p[k] ↔ p[j];
 
for i = 1, n−k
2
do p[k + i] ↔ p[n − i + 1];
AFISARE(p, n);
while (k > 0);

Observat, ia 1.9.2. Analog Observat, iei 1.6.1, algoritmul anterior poate fi us, or adaptat pentru generarea
permutărilor cu repetit, ie pentru mult, imi arbitrare.
Tema 2

Partit, ii

2.1 Compuneri ale unui număr natural


Definit, ia 2.1.1. Fie n, m ∈ N. O compunere a lui n este o scriere de forma

n = n1 + n2 + · · · + nm ,

unde n1 , n2 , . . . , nm ∈ N s, i contează ordinea dintre termenii n1 , n2 , . . . , nm .

Propozit, ia 2.1.1 (de numărare a compunerilor unui număr   natural).


 Fie n, m ∈ N. Atunci:
m
a) numărul de compuneri ale lui n cu m termeni este egal cu ;
n  
n−1
b) numărul de compuneri ale lui n cu m termeni nenuli este egal cu .
m−1
Demonstrat, ie. a) Fie mult, imile

N = {(n1 , n2 , . . . , nm )|ni ∈ N ∀ i, n1 + n2 + · · · + nm = n},

C4 = {(c1 , c2 , . . . , cn )|ci ∈ {1, 2, . . . , m} ∀ i, ci ≤ ci+1 ∀ i}.


Definim corespondent, ele α : N → C4 , β : C4 → N prin:


 c1 = · · · = cn1 = 1 (n1 litere),

c
n1 +1 = · · · = cn1 +n2 = 2 (n2 litere),
• α(n1 , . . . , nm ) = (c1 , . . . , cn ), unde


 ...

cn1 +···+nm−1 +1 = · · · = cn1 +···+nm−1 +nm = m (nm litere);

• β(c1 , . . . , cn ) = (n1 , . . . , nm ), unde ni = numărul de litere i ale cuvântului (c1 , . . . , cn ), ∀ i.


 
m
Acestea sunt funct, ii inverse, deci conform Propozit, iei 1.8.1 avem card (N ) = card (C4 ) = .
n
b) Fie mult, imile N1 = {(n1 , n2 , . . . , nm )|ni ∈ N⋆ ∀ i, n1 + n2 + · · · + nm = n},

N2 = {(t1 , t2 , . . . , tm )|ti ∈ N ∀ i, t1 + t2 + · · · + tm = n − m}.

Definim corespondent, ele ϕ : N1 → N2 , ψ : N2 → N1 prin:

• ∀(n1 , . . . , nm ) ∈ N1 , ϕ(n1 , . . . , nm ) = (n1 − 1, . . . , nm − 1);

17
TEMA 2. PARTIT, II 18

• ∀(t1 , . . . , tm ) ∈ N2 , ψ(t1 , . . . , tm ) = (t1 + 1, . . . , tm + 1).


 
m
Acestea sunt funct, ii inverse, deci conform punctului a) avem card (N1 ) = card (N2 ) = =
  n−m
[m]n−m m(m + 1) . . . (n − 1) (n − 1)! n−1
= = = .
(n − m)! (n − m)! (m − 1)!(n − m)! m−1
Exemplul 2.1.1. Pentru n = 4 s, i m = 3 compunerile sunt
4 = 0+0+4= 0+1+3 =0+2+2 =0+3+1 =0+4+0
= 1+0+3= 1+1+2 =1+2+1 =1+3+0 =2+0+2
= 2 + 1 + 1 = 2 + 2 + 0 = 3 + 0 + 1 = 3 + 1 + 0 = 4 + 0 + 0.
     
3 3·4·5·6 4−1 3
Deci avem = = 15 compuneri, dintre care = = 3 compuneri cu
4 1·2·3·4 3−1 2
termenii nenuli.
Algoritmul 2.1.1 (de generare a compunerilor unui număr natural). Fie n, m ∈ N⋆ . Vom
utiliza din nou ”regula următorului”.
• Prima compunere a lui n cu m termeni, ı̂n ordine lexicografică, este
n = 0 + 0 + · · · + 0 + n.

• O compunere curentă arbitrară


n = t1 + t2 + · · · + tk−1 + tk + tk+1 + · · · + tm
are o compunere următoare dacă s, i numai dacă există un indice k ∈ {m, . . . , 2} astfel ı̂ncât
tk > 0. În acest caz, luând cel mai mare indice k cu această proprietate, compunerea următoare,
ı̂n ordine lexicografică, este
n = t1 + t2 + · · · + tk−2 + (tk−1 + 1) + 0 + · · · + 0 + (tk − 1).

De exemplu, următoarea compunere după


10 = 2 + 0 + 5 + 3 + 0 + 0
este 10 = 2 + 0 + 6 + 0 + 0 + 2 (deoarece tk = t4 = 3).
În pseudocod, algoritmul poate fi descris sub forma
COMPUNERI(n, m) :
for i = 1, m − 1 do t[i] ← 0;
t[m] ← n;
AFISARE(t, m);
repeat
k ← m;
while (t[k] = 0) and (k > 1) do k ← k − 1;
if (k > 1) then
t[k − 1] ← t[k − 1] + 1;
t[m] ← t[k] − 1;
if (k < m) then t[k] ← 0;
AFISARE(t, m);
while (k > 1);
TEMA 2. PARTIT, II 19

unde funct, ia de afis, are este


AFISARE(t, m) :
for i = 1, m do
afis, ează t[i];

Algoritmul 2.1.2 (de generare a compunerilor cu termeni nenuli). Analog algoritmului anterior
se obt, ine următorul algoritm pentru generarea compunerilor lui n cu m termeni nenuli, m ≤ n.
COMPUNERI TERMENI NENULI(n, m) :
for i = 1, m − 1 do t[i] ← 1;
t[m] ← n − m + 1;
AFISARE(t, m);
repeat
k ← m;
while (t[k] = 1) and (k > 1) do k ← k − 1;
if (k > 1) then
t[k − 1] ← t[k − 1] + 1;
t[m] ← t[k] − 1;
if (k < m) then t[k] ← 1;
AFISARE(t, m);
while (k > 1);

2.2 Partit, ii ale unui număr natural


Definit, ia 2.2.1. O partit, ie (descompunere) a numărului n ∈ N⋆ este o scriere de forma

n = n1 + n2 + · · · + nk ,

unde n1 , n2 , . . . , nk ∈ N⋆ (k ∈ N⋆ ) s, i nu contează ordinea dintre termenii n1 , n2 , . . . , nk .

Observat, ia 2.2.1. Deoarece ı̂ntr-o partit, ie ca mai sus nu contează ordinea dintre termeni, putem
presupune că aces, tia sunt scris, i ı̂n ordine crescătoare.

Definit, ia 2.2.2. Fie n, k ∈ N⋆ . Notăm cu P (n, k) numărul de partit, ii ale lui n cu k termeni, iar cu
P (n) numărul tuturor partit, iilor lui n.

Exemplul 2.2.1. Numărul n = 6 are partit, iile

6=6=1+5=2+4=3+3=1+1+4=1+2+3=2+2+2
= 1 + 1 + 1 + 3 = 1 + 1 + 2 + 2 = 1 + 1 + 1 + 1 + 2 = 1 + 1 + 1 + 1 + 1 + 1,

deci P (6, 1) = 1, P (6, 2) = 3, P (6, 3) = 3, P (6, 4) = 2, P (6, 5) = 1, P (6, 6) = 1 s, i P (6) = 11.


Observat, ia 2.2.2. Avem P (n) = P (n, 1) + P (n, 2) + · · · + P (n, n), ∀ n ∈ N⋆ .

Propozit, ia 2.2.1 (relat, ia de recurent, ă a numerelor P (n, k)). Pentru orice n ∈ N⋆ s, i orice
k ∈ {1, . . . , n − 1} avem

P (n, k) = P (n − k, 1) + P (n − k, 2) + · · · + P (n − k, k).
TEMA 2. PARTIT, II 20

Demonstrat, ie. Pentru orice n ∈ N⋆ s, i orice k ∈ {1, . . . , n − 1} notăm

P(n, k) = {(n1 , . . . , nk )|ni ∈ N⋆ ∀ i, n1 ≤ · · · ≤ nk , n1 + · · · + nk = n}.


k
S k
S
Definim corespondent, ele α : P(n, k) → P(n − k, i) s, i β : P(n − k, i) → P(n, k) prin:
i=1 i=1

• ∀ (n1 , . . . , nk ) ∈ P(n, k), α(n1 , . . . , nk ) = (nj − 1, . . . , nk − 1), unde j = min{i|ni ≥ 2, i ∈


{1, . . . , k}} (există j, deoarece k ≤ n − 1);

• ∀ i ∈ {1, . . . , k}, ∀ (n1 , . . . , ni ) ∈ P(n − k, i), β(n1 , . . . , ni ) = (1, . . . , 1, n1 + 1, . . . , ni + 1).


| {z }
de k−i ori

Interpretarea acestor funct, ii este următoarea: aplicarea funct, iei α unei partit, ii a lui n cu k termeni
constă ı̂n mics, orarea cu 1 a fiecărui termen s, i eliminarea termenilor care astfel devin egali cu zero,
obt, inându-se o partit, ie a lui n − k cu cel mult k termeni. Reciproc, aplicarea funct, iei β unei partit, ii
a lui n − k cu cel mult k termeni constă ı̂n mărirea cu 1 a fiecărui termen s, i adăugarea de termeni
egali cu 1 pentru a obt, ine k termeni, astfel obt, inându-se o partit, ie a lui n cu k termeni.
k 
S
Funct, iile α s, i β sunt bine definite s, i inverse una celeilalte, deci card (P(n, k)) = card P(n − k, i) .
i=1
Cum mult, imile P(n − k, 1), . . . , P(n − k, k) sunt evident disjuncte două câte două, rezultă că
k
P
P (n, k) = P (n − k, i).
i=1

Observat, ia 2.2.3. Relat, ia de recurent, ă din Propozit, ia 2.2.1, ı̂mpreună cu condit, iile init, iale evidente
P (n, 1) = P (n, n) = 1, P (n, k) = 0 ∀ k > n permit calculul tuturor numerelor P (n, k), deci s, i al
numerelor P (n), conform Corolarului 2.2.2. De exemplu, tabelul numerelor P (n, k) s, i P (n) pentru
n ≤ 7 (s, i k ≤ 7) este:

P (n, k) k = 1 k = 2 k = 3 k=4 k=5 k=6 k=7 P (n)


n=1 1 0 0 0 0 0 0 1
n=2 1 1 0 0 0 0 0 2
n=3 1 1 1 0 0 0 0 3
n=4 1 2 1 1 0 0 0 5
n=5 1 2 2 1 1 0 0 7
n=6 1 3 3 2 1 1 0 11
n=7 1 3 4 3 2 1 1 15

Numerele P (n, k) nenule, aflate doar pe diagonala principală s, i sub această diagonală (adică 1 ≤ k ≤
n) formează triunghiul numerelor P (n, k).
Algoritmul 2.2.1 (de generare a partit, iilor lui n cu k termeni). Fie n, k ∈ N⋆ , k ≤ n. Pentru
generarea ı̂n ordine lexicografică a celor P (n, k) partit, ii ale lui n cu k termeni

(t1 , t2 , . . . , tk ), n = t1 + t2 + · · · + tk , ti ∈ N⋆ ∀i, t1 ≤ t2 ≤ · · · ≤ tk

folosim din nou ”regula următorului”.

• Prima partit, ie este (1, . . . , 1 , n − k + 1).


| {z }
de k−1 ori
TEMA 2. PARTIT, II 21

• O partit, ie curentă arbitrară


(t1 , t2 , . . . , tj−1 , tj , tj+1 , . . . , tk )
are o partit, ie următoare dacă s, i numai dacă există un indice j ∈ {k − 1, . . . , 1} astfel ı̂ncât
tj ≤ tk − 2. În acest caz, luând cel mai mare indice j cu această proprietate, următoarea
partit, ie este
(t1 , t2 , . . . , tj−1 , tj + 1, tj + 1, . . . , tj + 1, n − r),
unde r = t1 + t2 + · · · + tj−1 + (tj + 1) + (tj + 1) + · · · + (tj + 1).
De exemplu, următoarea partit, ie după
22 = 1 + 1 + 2 + 4 + 4 + 5 + 5
este
22 = 1 + 1 + 3 + 3 + 3 + 3 + 8
(deoarece tj = t3 = 2 ≤ tk − 2 = 5 − 2).
Descrierea ı̂n pseudocod a algoritmului are forma
GENERARE P(n, k) :
for i = 1, k − 1 do t[i] ← 1;
t[k] ← n − k + 1;
AFISARE(t, k);
repeat
j ← k − 1;
while (t[j] > t[k] − 2) and (j > 0) do j ← j − 1;
if (j > 0) then
t[j] ← t[j] + 1;
for i = j + 1, k − 1 do t[i] ← t[j];
r ← 0;
for i = 1, k − 1 do r ← r + t[i];
t[k] ← n − r;
AFISARE(t, k);
while (j > 0);
unde funct, ia de afis, are este aceeas, i ca ı̂n Algoritmul 2.1.1.

2.3 Partit, ii ale unei mult, imi finite


Definit, ia 2.3.1. O partit, ie a unei mult, imi nevide A este o scriere de forma
A = A1 ∪ A2 ∪ · · · ∪ Ak ,
unde submult, imile (părt, ile, clasele) A1 , A2 , . . . , Ak (k ∈ N⋆ ) sunt nevide s, i disjuncte două câte două,
s, i nu contează ordinea dintre aceste submult, imi. Considerăm că singura partit, ie a mult, imii vide este
partit, ia cu zero submult, imi.
Definit, ia 2.3.2. Fie n, k ∈ N.
a) Numărul lui Stirling de spet, a a doua, notat cu S(n, k), reprezintă numărul de partit, ii ale
unei mult, imi cu n elemente ı̂n k părt, i.
b) Numărul lui Bell, notat cu Bn , reprezintă numărul tuturor partit, iilor unei mult, imi cu n ele-
mente.
TEMA 2. PARTIT, II 22

Exemplul 2.3.1. Mult, imea A = {a, b, c} are partit, iile

A = {a, b, c} = {a, b} ∪ {c} = {a, c} ∪ {b} = {a} ∪ {b, c} = {a} ∪ {b} ∪ {c},

deci S(3, 1) = 1, S(3, 2) = 3, S(3, 3) = 1 s, i B3 = 5.


Observat, ia 2.3.1. Evident, avem B0 = 1 s, i Bn = S(n, 1) + S(n, 2) + · · · + S(n, n), ∀ n ∈ N⋆ .
Propozit, ia 2.3.1 (relat, ia de recurent, ă a numerelor S(n, k)).

S(n, k) = S(n − 1, k − 1) + kS(n − 1, k), ∀ n, k ∈ N⋆ .

Demonstrat, ie. Notăm

S(n, k) = {{A1 , . . . , Ak }|Ai 6= ∅ ∀ i, Ai ∩ Aj = ∅ ∀ i 6= j, A = A1 ∪ · · · ∪ Ak },

pentru orice n, k ∈ N⋆ . Definim corespondent, ele

α : S(n, k) → S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k),


β : S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k) → S(n, k),

prin:
• ∀ {A1 , . . . , Ak } ∈ S(n, k), α({A1 , . . . , Ak }) =

{A1 , . . . , Ak } \ {Ai }, dacă n ∈ Ai s, i Ai = {n},
=
(i, {A1 , . . . , Ai \ {n}, . . . , Ak }), dacă n ∈ Ai s, i Ai 6= {n};

• ∀ {A1 , . . . , Ak−1 } ∈ S(n − 1, k − 1), β({A1 , . . . , Ak−1}) = {A1 , . . . , Ak−1, {n}},


• ∀ (i, {A1 , . . . , Ak }) ∈ {1, . . . , k} × S(n − 1, k), β(i, {A1 , . . . , Ak }) = {A1 , . . . , Ai ∪ {n}, . . . , Ak }.
Interpretarea acestor definit, ii este următoarea: aplicarea funct, iei α unei partit, ii a mult, imii {1, . . . , n}
ı̂n k părt, i constă ı̂n eliminarea elementului n, astfel obt, inându-se o partit, ie a mult, imii {1, . . . , n − 1}
ı̂n k − 1 sau ı̂n k părt, i, după cum n este sau nu singur ı̂ntr-o parte. Reciproc, aplicarea funct, iei β
constă ı̂n adăugarea elementului n, fie singur ı̂ntr-o parte, fie la oricare din cele k părt, i.
Funct, iile α s, i β sunt bine definite s, i inverse una celeilalte, deci

card (S(n, k)) = card (S(n − 1, k − 1) ∪ {1, . . . , k} × S(n − 1, k)) ,

adică S(n, k) = S(n − 1, k − 1) + kS(n − 1, k).


Observat, ia 2.3.2. Relat, ia de recurent, ă de mai sus ı̂mpreună cu condit, iile init, iale evidente S(0, 0) = 1,
S(0, k) = 0 ∀ k ≥ 1, S(n, 0) = 0 ∀n ≥ 1 permit calculul tuturor numerelor S(n, k), deci s, i al numerelor
Bn , conform Corolarului 2.3.1. De exemplu, tabelul numerelor S(n, k) s, i Bn pentru n ≤ 6 (s, i k ≤ 6)
este:
S(n, k) k = 0 k = 1 k=2 k=3 k=4 k=5 k = 6 Bn
n=0 1 0 0 0 0 0 0 1
n=1 0 1 0 0 0 0 0 1
n=2 0 1 1 0 0 0 0 2
n=3 0 1 3 1 0 0 0 5
n=4 0 1 7 6 1 0 0 15
n=5 0 1 15 25 10 1 0 52
n=6 0 1 31 90 65 15 1 203
TEMA 2. PARTIT, II 23

Numerele S(n, k) nenule, aflate doar pe diagonala principală s, i sub această diagonală (1 ≤ k ≤ n)
formează triunghiul numerelor lui Stirling de spet, a a doua.
Algoritmul 2.3.1 (de generare a partit, iilor unei mult, imi ı̂ntr-un număr fixat de părt, i). Fie
A = {1, 2, . . . , n} s, i 1 ≤ k ≤ n. Pentru scrierea unei partit, ii

A = A1 ∪ · · · ∪ Ak

vom folosi convent, ia că ı̂n fiecare parte Ai elementele sunt ordonate crescător, iar ordinea dintre
părt, ile A1 , . . . , Ak este dată de ordinea dintre cele mai mici elemente ale acestor mult, imi.
De exemplu, partit, ia
{1, 2, 3, 4, 5} = {3, 2} ∪ {5} ∪ {4, 1}
va fi scrisă sub forma
{1, 2, 3, 4, 5} = {1, 4} ∪ {2, 3} ∪ {5}. (2.3.1)
Pentru reprezentarea unei partit, ii A = A1 ∪ · · · ∪ Ak scrise conform convent, iei de mai sus, vom folosi
vectorul caracteristic v = (v1 , . . . , vn ), unde

vi = j dacă i ∈ Aj , ∀ i ∈ {1, 2, . . . , n}, ∀ j ∈ {1, 2, . . . , k}.

De exemplu, vectorul caracteristic al partit, iei (2.3.1) este v = (1, 2, 2, 1, 3).


Cu această reprezentare, conform demonstrat, iei relat, iei de recurent, ă a numerelor S(n, k) (Propozit, ia
2.3.1) obt, inem un algoritm recursiv de generare a partit, iilor mult, imii {1, 2, . . . , n} ı̂n k părt, i. În pseu-
docod, acest algoritm poate fi descris sub forma
GENERARE S(n, k) :
if (k = 1) then // condit, ie init, ială
for i = 1, n do v[i] ← 1; // partit, ia cu o parte
AFISARE(v);
else
if (k = n) then // condit, ie init, ială
for i = 1, n do v[i] ← i; // partit, ia cu n părt, i
AFISARE(v);
else
// relat, ia de recurent, ă
v[n] ← k; GENERARE S(n − 1, k − 1); // n singur ı ^n parte
for i = 1, k do // n nesingur ı ^n parte
v[n] ← i; GENERARE S(n − 1, k);

unde funct, ia de afis, are, ce transformă vectorul caracteristic v ı̂n partit, ia corespunzătoare, este
AFISARE(v) :
for j = 1, k do // afis, ăm partea Aj
afis, ează ”{”
for i = 1, n do
if (v[i] = j) then afis, ează i;
afis, ează ”}”;
Tema 3

Grafuri

24
Tema 4

Arbori s, i arborescent, e

25
Tema 5

Arbori part, iali de cost minim

26
Tema 6

Grafuri euleriene

27
Tema 7

Grafuri hamiltoniene

28
Tema 8

Grafuri turneu

29
Tema 9

Colorări ı̂n grafuri

30
Tema 10

Grafuri bipartite

31
Tema 11

Grafuri planare

32
Tema 12

Distant, e s, i drumuri minime ı̂n grafuri


ponderate

33
Tema 13

Fluxuri ı̂n ret, ele de transport

34

S-ar putea să vă placă și