Sunteți pe pagina 1din 16

Combinatorica

-este o ramură a matematicii care studiază mulţimi (de obicei


finite) de obiecte şi modalităţile de a le "combina".

Sunt studiate probleme de:


-numărare (combinatorică enumerativă),
-generare şi de analiză (design combinatoric şi teoria
matroizilor),
-determinare a "celui mai mare", "celui mai mic" sau a "celui
mai bun" obiect al mulţimii (combinatorică extremală şi
optimizare combinatorică),
-determinarea structurilor algebrice ale acelor obiecte
(combinatorică algebrică).

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Problema: Generare numere

 Alina are o cutie cu n piese distincte


numerotate cu valori distincte de la 1
la n <10). Ajutati-o sa afiseze toate
numerele formate din cifre strict
crescatoare.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Algoritm 1.
Generare submulţimi
 Fie n un număr natural nenul. Să se genereze toate submulţimile
mulţimii {1, …, n}.
 Soluţie(a)
 Vom reprezenta submulţimile prin vector caracteristic (un vector S
cu n componente 0 sau 1, având semnificaţia S[i]=1, dacă i
aparţine submulţimii şi 0 în caz contrar). Problema se reduce astfel
la generarea tuturor secvenţelor binare de lungime n. Pentru a
rezolva această problemă vom utiliza un algoritm de tip succesor:
 Pas 1. Se iniţializează soluţia cu cea mai mică configuraţie posibilă
(în cazul nostru, iniţializăm vectorul S cu 0, ceea ce corespunde
mulţimii vide);
 Pas 2. Cât timp este posibil (există succesor) se execută:
 se afişează configuraţia curentă
 se generează configuraţia următoare (în cazul nostru, vom
considera că elementele vectorului reprezintă cifrele unui număr
scris în baza 2, la care vom aduna 1).

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Generare submulţimi
 Solutie (a)
 Citeste n
 Pt i←1,n executa S[i]←0;
 ok:=0;
 cit timp ok=0 executa
 -afisare configuratia curenta
 Pt i←1,n executa
 daca S[i]=1 atunci scrie (i,' ');
 -generam configuratia urmatoare prin adunare binara
 i←n;
 cit timp (i>0) si (S[i]=1) executa
 S[i] ←0;
 dec(i);
 daca i=0 atunci ok←1 altfel S[i]:=1;
 sf_cit_timp

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Generare submulţimi
 Solutie (b)
 Pornind de la configuratia 0 0 0 ...0 se aduna la fiecare pas 1
simulind adunarea in binar. Cind ne oprim? Cind a fost scrisa
ultima combinatie 1 1 1 1 1 1 ...1 (suma tuturor elementelor este
n).
 Citeste n
 Pt i←1,n executa S[i]←0;
 Repeta
 Inc(S[n])
 Pentru i←n,2,-1 executa
 Daca s[i]>1 atunci s[i]←s[i]-2
 Inc(S[i-1])
 st←0
 pt i←1, n executa st←st+s[i]
 pt i←1, n executa daca s[i]>0 atunci scrie i
 pina cind st=n

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Problema 2: Piese si cutii

 Alina are n cutii cu cite xi piese


distincte numerotate cu cifre de la 1 la
xi (xi<10). Ajutati-o sa afiseze toate
numerele de n cifre formate cu piese
din fiecare cutie.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Algoritm 2: Generare
elemente produs cartezian
 Fie n un număr natural (n>1) şi L=(l1, l2, ..., ln) n numere naturale nenule. Să se
determine în ordine lexicografică[1] toate elementele produsului cartezian {1, 2, ...,
l1}x{1, 2, ..., l2}x...x{1, 2, ..., ln}.
 De exemplu pentru n=3 şi L=(2, 3, 2), elementele produsului cartezian sunt: (1,1,1),
(1,1,2), (1,2,1), (1,2,2), (1,3,1), (1,3,2), (2,1,1), (2,1,2), (2,2,1), (2,2,2), (2,3,1), (2,3,2).
Observaţi că produsul cartezian are l1*l2*...*ln elemente.
 Soluţie
 Vom reprezenta un element al produsului cartezian ca un vector E cu n elemente, unde
E[i]{1, 2, ..., li}.
 Pentru a genera toate elementele produsului cartezian în ordine lexicografică, vom aplica
un algoritm de tip succesor:
 Pas 1. Iniţializăm vectorul E cu 1 (cel mai mic element al produsului cartezian, din punct
de vedere lexicografic).
 Pas 2. Cât timp este posibil (mai există succesor)
 afişăm elementul curent;
 generăm elementul următor; în acest scop căutăm prima componentă (începând din
dreapta către stânga) care poate fi mărită (adică E[i]<L[i]); dacă găsim o astfel de
componentă o mărim, şi repunem pe 1 toate componentele următoare; dacă nu găsim o
astfel de componentă deducem că generarea s-a încheiat, acesta a fost cel mai mare
element din punct de vedere lexicografic.
 Fie x=(x1, x2, ..., xn) şi y=(y1, y2, ..., ym). Spunem că x precedă pe y din punct de
vedere lexicografic dacă există k astfel încât xi=yi, pentru orice i<k şi xk<yk sau k>n.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
2. Generare elemente
produs cartezian
 Citeste n
 Pentru i←1, n executa citeste L[i];
 Pentru i←1, n executa e[i] ←1;
 ok←0;
 cit timp ok=0 executa
 {afisare configuratia curenta}
 pentru i←1, n executa scrie (e[i],' ');
 {generam configuratia urmatoare}
 i←n;
 cit timp (i>0) si (e[i]=L[i]) executa
 e[i] ←1;
 dec(i);
 Sf cit timp
 daca (i=0) atunci ok←1 { acesta a fost ultima configuratie }
 altfel inc(e[i]);
 sf_cit_timp

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Problema 3: Spectacol

 Administratorul unei sali de


spectacole are in grija n scaune
numerotate de la 1 la n. Determinati
toate modurile in care poate aranja
cele n scaune in sala de spectacole.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Algoritm 3: Generare
permutări
 Fie n un număr natural 1≤n≤20.
 Se numeşte permutare de ordin n o succesiune de n valori distincte
din mulţimea {1, 2, ..., n}.
 De exemplu, pentru n=3 există 6 permutări:
 123 132 213 231 312 321

 a) Generare prin permutari circulare


 -se genereaza permutarea identica p[i]=i, i=1,n
 -se stabileste pozitia de inceput pentru permutarea circulara: k=1
 -se permuta circular sirul p incepind cu pozitia k
 -daca p(k)=k atunci s-a obtinut o permutare care a fost deja afisata
si se mareste k cu 1; altfel, se afiseaza permutarea si se
reinitializeaza k: k=1
 -daca k<>n se revine la pas 3
 -stop

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
b)Generare în ordine lexicografică toate
permutările de ordin n.

 Soluţie
 Cea mai mică permutare din pdv lexicografic este 1, 2, ..., n (permutarea
identică).
 Cea mai mare permutare din pdv lexicografic este n, n-1, ..., 2, 1.
 Vom reprezenta permutarea ca un vector P cu n componente (1≤P[i]≤n,
P[i]≠P[j], 1≤i<j≤n).
 Pentru a genera permutările vom utiliza un algoritm de tip succesor:
 Pas 1. Iniţializăm vectorul P cu permutarea identică (P[i]=i, pentru orice
1≤i≤n)
 Pas 2. Cât timp este posibil (mai există succesor)
 afişăm permutarea curentă;
 generăm permutarea următoare; în acest scop căutăm prima componentă
(începând din dreapta către stânga) care poate fi mărită (adică determinăm
cel mai mare i cu proprietatea că există un element P[j], astfel încât P[j]>P[i],
iar j>i); determin apoi cel mai mic element P[j] situat dupa P[i] care este
>P[i]; interschimb P[i] cu P[j], apoi elementele situate dupa pozitia i le
rearanjez astfel incat sa obtin cea mai mica configuratie posibila (adica in
ordine crescatoare).

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
b)Generare în ordine lexicografică toate
permutările de ordin n

 ok←0;
 cit timp ok=0
 afisare;
 i←n-1;
 cit timp (i>=1) and (P[i]>P[i+1]) executa dec(i);
 Sf cit timp
 daca (i=0) atunci {ultima permutare}
 ok←1
 else
 {maresc P[i] cu cel mai mic element situat dupa el}
 begin
 j←n;
 cit timp P[j]<P[i] executa dec(j);
 sf cit timp
 aux←P[i];
 P[i] ←P[j];
 P[j] ←aux;
 //inversez segmentul i+1..j
 k:=i+1; j:=n;
 cit timp k<j executa
• aux←P[k]; P[k] ←P[j]: P[j] ←aux;
 inc(k); dec(j);
sf_cit timp
 end

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Problema 4: Conferinta de
presa
 Administratorul unei sali de
spectacole are in grija n scaune
numerotate de la 1 la n. Determinati
toate grupele de cite m scaune din
cele n ce le poate oferi pentru
conferinta de presa de dupa
spectacol.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Algoritm 4: Generare
combinări
 Fie n şi m două numere naturale, 1≤m≤n≤20.
 Să se genereze în ordine lexicografică toate submulţimile formate din m elemente ale mulţimii {1, 2, ..., n}.
 Soluţie
 Vom reprezenta o submulţime ca un vector C cu m elemente (elementele submulţimii), 1≤C[i]≤n.
 Deoarece ordinea elementelor într-o submulţime nu contează, pentru a nu genera de mai multe ori
aceeaşi submulţime vom conveni că plasăm elementele în submulţime în ordine crescătoare: C[i]<C[i+1],
pentru orice 1≤i<m.
 Vom genera submuţimile printr-un algoritm de tip succesor.
 Cea mai mică submulţime (din pdv lexicografic) este 1, 2, ..., m.
 Cea mai mare submulţime este: n-m+1,..., n-1, n
 Intrebare: care este cea mai mare valoare care poate fi plasată pe poziţia i?
 Observăm că atunci când poziţia scade cu 1, valoarea maximă scade cu 1, deci diferenţa dintre Valoarea
maximă şi Poziţie este constantă:Valoare_maximă-Poziţie=n-m=?-i.
 Deducem că valoarea maximă care poate fi plasată pe poziţia i este n-m+i.
 Pas 1. Iniţializăm vectorul C (C[i]=i, pentru orice 1≤i≤m)
 Pas 2. Cât timp este posibil (mai există succesor)
 afişăm submulţimea curentă;
 generăm submulţimea următoare; în acest scop căutăm prima componentă (începând din dreapta către
stânga) care poate fi mărită (adică C[i]<n-m+i); dacă găsim o astfel de componentă o mărim, şi repunem
pe cea mai mică valoare posibilă toate componentele următoare (C[j]=C[j-1]+1, i<j≤m); dacă nu găsim o
astfel de componentă deducem că generarea s-a încheiat, acesta a fost cea mai mare submulţime din
punct de vedere lexicografic.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Problema 4: Generare
combinări
 Citeste n,m
 Pentru i←1, m executa e[i] ←i;
 {afisare configuratia curenta}
 pentru i←1, m executa scrie (e[i],' ');
 ok←0;
 i←m;
 cit timp ok=0 executa
 {generam configuratia urmatoare}
 cit timp e[i]<n-m+i executa
 e[i] ←e[i]+1;
 cit timp i<m executa i←i+1;e[i] ← e[i-1]+1
 sf cit timp
 afisare solutie;
 i←m
 sf cit timp
 dec(i);
 daca (i=0) atunci ok←1 { acesta a fost ultima configuratie }
 sf_cit_timp

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX
Tema
 Generare aranjamente
 Fie n şi m două numere naturale, m<n.
 Numim aranjamente de n luate câte m toate succesiunile formate din m elemente distincte din mulţimea
{1, 2, ..., n}.
 De exemplu, pentru n=4 şi m=2 aranjamentele sunt: 12 13 14 21 23 24 31 32 34 41 42 43

 Cod de identificare
 Pentru a concura cu numărul de serie de la procesoarele Intel Pentium III, Advanced Micro Devices a
stabilit un sistem de identificare pentru noile procesoare cu numele de cod Thunderbird. Fiecare firmă
distribuitoare primeşte o mulţime de litere (de exemplu {a, m, x}) din care va trebui să-şi formeze
codurile proprii de identificare. Firmelor li se impune exact de câte ori trebuie să apară fiecare literă în
aceste coduri. De exemplu, o firmă trebuie să formeze identificatori care să conţină exact 3 litere a, 2
litere m şi 1 literă x. Scrieţi un program care, cunoscând un anumit cod dat, determină următorul cod
corect în ordine lexicografică, dacă există un astfel de cod următor. (ONI Constanţa 2000, IX)
 Date de intrare
 Fişierul de intrare COD.IN conţine un cod. Codurile sunt formate din cel mult 100 de litere mici ale
alfabetului latin.
 Date de ieşire
 Fişierul de ieşire COD.OUT va conţine o singură linie pe care se va afla codul următor; dacă nu există
un astfel de cod, atunci în fişier se va scrie ‘Este ultimul cod.’
 Exemple
 COD.IN COD.OUT
 amaaxm amamax
 COD.IN COD.OUT
 xmmaaa Este ultimul cod.

Generarea elementelor combinatoriale-clasa a-I 03/26/21


X-a, CEX

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