Curs 3 Permutări cu repetiţie. Combinări. Algoritmi de ordonare şi generare Octombrie 2015
Cuprins Algoritmi de ordonare şi generare pentru permutări cu repetiţie Reprezentarea binară a submulţimilor Algoritmi de ordonare şi generare Generarea rapidă a combinărilor Coduri Gray; propertăţi Submulţimi ordonate lexicografic Generarea -combinărilor
Permutări cu repetiţie r-permutările cu repetiţie ale unui alfabet A = {a 1,..., a n } sunt secvenţele ordonate de forma unde x 1,..., x r A. x 1,..., x r Acelaşi simbol poate să apară de mai multe ori în o r-permutare cu repetiţie Conform regulii produsului, există n r r-permutări cu repetiţie
Permutări cu repetiţie Algoritmi de ordonare şi generare în ordine lexicografică r-permutările cu repetiţie pot fi ordonate lexicografic, la fel ca şi r-permutările obişnuite. Exemplu (A = {a 1, a 2 } cu a 1 < a 2, r = 3 r-permutare cu repetiţie a lui A rang a 1, a 1, a 1 0 a 1, a 1, a 2 1 a 1, a 2, a 1 2 a 1, a 2, a 2 3 a 2, a 1, a 1 4 a 2, a 1, a 2 5 a 2, a 2, a 1 6 a 2, a 2, a 2 7 Definiţie (Ordonare lexicografică x 1,..., x r < y 1,..., y r dacă există {1,..., n} astfel încât x < y şi x i = y i pentru toţi 1 i <.
Ordonarea şi generarea r-permutărilor cu repetiţie Observaţii Fie A = {a 1, a 2,..., a n } cu a 1 < a 2 <... < a n. Dacă definim index(a i := i 1 pentru 1 i n şi înlocuim a i cu index(a i în enumerarea lexicografică a r-permutărilor, avem r-permutare cu repetiţie a lui A rang a 1,..., a 1, a 1, a 1 0,..., 0, 0, 0 1 0.. a 1,..., a 1, a 1, a n 0,..., 0, 0, n 1 n 1 a 1,..., a 1, a 2, a 1 0,..., 0, 1, 0 1 n.. a 1,..., a 1, a 2, a n 0,..., 0, 1, n 1 2 n 1. Observaţie: r-permutarea cu repetiţie a indecşilor este reprezentarea în baza n a rangului..
Ordonarea şi generarea r-permutărilor cu repetiţie Exerciţii 1 Să se definească un algoritm care calculează rangul unei r-permutări cu repetiţie x 1,..., x r a lui A = {1,..., n} în raport cu ordinea lexicografică. 2 Să se definească un algoritm care calculează r-permutarea cu repetiţie a lui A = {1,..., n} care are rangul în raport cu ordinea lexicografică. 3 Să se definească un algoritm care calculează r-permutarea cu repetiţie care urmează imediat după r-permutarea cu repetiţie x 1,..., x r a lui A.
Combinări Reprezentarea binară a submulţimilor O r-combinare a unei mulţimi A cu n elemente este o submulţime cu r elemente a lui A. Există o correspondenţă bijectivă între şirurile de n-biţi şi submulţimile mulţimii A = {a 1, a 2,..., a n }: { 1 dacă an i B B A b n 1 b n 2... b 0 unde b i = 0 în caz contrar. şir de n-biţi b 0 b 1... b n 1 submulţimea {a n i b i = 1} lui A Exemplu A = {a 1, a 2, a 3, a 4, a 5 } unde a 1 = a, a 2 = b, a 3 = c, a 4 = d, a 5 = e. 00000 {a, b} 00011 {c, d, e} 11100 {a} 00001 {a, c} 00101 {b, c, d, e} 11110 {b} 00010 {a, d} 01001 {a, b, d, e} 11011 {c} 00100 {a, e} 10001 {a, c, d, e} 11101 {d} 01000 {b, c} 00110 {a, b, c, d} 01111 {e} 10000... {a, b, c, d, e} 11111
Calculul codificării ca şir binar a lunei submulţimi BitString(B: submultime a lui A, A: multime ordonata {a 1,..., a n } int bit string[0..n 1] for i:=0 to n 1 do if a i B then bit string[n i] := 1 else bit string[n i] := 0 return bit string
Calcului combinării corespunzătoare unui şir de n-biţi Combination(b[0..n-1]: sir de biti, A: multime ordonata {a 1,..., a n } B:= for i:=0 to n 1 do if b[i] = 1 then adauga a n i la B return B
Ordonarea submulţimilor folosind codificări cu şiruri binare Există o corespondenţă bijectivă între codificările cu şiruri binare de n-biţi şi numerele cuprinse între 0 şi 2 n 1 : n 1 şir de n biţi b[0.. n 1] numărul b[i] 2 i număr 0 r < 2 n şirul de n-biţi b[0.. n 1] unde ci b[i] := 2 i unde c i este restul împărţirii lui r cu 2 i+1. i=0 Definiţie Rangul unei submulţimi B a mulţimii ordonate A cu n elemente este n 1 Ran(B, A := b[i] 2 i unde b[0.. n 1] este codificarea cu şir de n-biţi a lui B ca submulţime a lui A. i=0
Ordonarea submulţimilor unei mulţimi prin intermediul şirurilor de biţi Exemplu (A = {a 0, a 1, a 2 } submulţime codificare binară rang b 2 b 1 b 0 000 0 {a 0 } 001 1 {a 1 } 010 2 {a 0, a 1 } 011 3 {a 2 } 100 4 {a 0, a 2 } 101 5 {a 1, a 2 } 110 6 {a 0, a 1, a 2 } 111 7 Observaţie. Acest mod de enumerare a submulţimilor unei mulţimi de numeşte ordonare canonică, iar şirul b 2 b 1 b 0 se numeşte cod canonic (sau binar.
Ordonarea submulţimilor cu ajutorul şirurilor de biţi (2 B a 0,..., a n 1 BitString(B, A n-biţi b[0..n 1] pentru codificarea binară Ran(B, A calcul direct n 1 b[i] 2 i i=0
Enumerarea submulţimilor prin intermediul reprezentării binare Se dă o mulţime ordonată A = {a 0, a 1,..., a n 1 }, şi 0 r < 2 n Să se determine submulţimea B a lui A cu rangul r 0 r < 2 n n-bit string encoding b[0.. n 1] b[i] := c/2 i unde c := r mod 2 i+1 pentru 0 i < n Unran(A, r Combination(b, A B := {a i b[n i 1] = 1}
Enumerarea submulţimilor prin intermediul reprezentării binare Problema 1: Se dă o submulţime B a mulţimii ordonate A. Să se determine submulţimea lui A care urmează după B în ordonarea prin intermediul reprezentării binare. Sugestie: Se poate defini NextBinaryRanSubset(A,B folosind algoritmii anteriori de ordonare şi enumerare.
Enumerarea submulţimilor prin intermediul reprezentării binare Problema 1: Se dă o submulţime B a mulţimii ordonate A. Să se determine submulţimea lui A care urmează după B în ordonarea prin intermediul reprezentării binare. Sugestie: Se poate defini NextBinaryRanSubset(A,B folosind algoritmii anteriori de ordonare şi enumerare. Problema 2: Să se genereze lista tuturor submulţimilor lui A în ordinea crescătoare a rangului calculat prin intermediul codificării binare. Sugestie: Se poate folosi funcţia Unran(A, r definită anterior.
Enumerarea submulţimilor cu modificări minime Coduri Grey Exemplu Fran Grey a descoperit în 1953 o metodă de enumerare a tuturor submulţimilor unei mulţimi într-o ordine în care submulţimile consecutive diferă prin inserarea sau ştergerea unui singur element. Această schemă de enumerare se numeşte cod Grey reflectat standard. Folosind metoda lui Grey, submulţimile of {a, b, c} sunt enumerate în ordinea următoare: {}, {c}, {b, c}, {b}, {a, b}, {a, b, c}, {a, c}, {a} Codificările ca şiruri binare b 0 b 1 b 2 ale acestor submulţimi sunt: 000, 100, 110, 010, 011, 111, 101, 001
Codul Grey reflectat standard Descriere Se doreşte enumerarea submulţimilor mulţimii A = {a 0, a 1,..., a n 1 } într-o ordine cu modificări minime între submulţimi consecutive. Fie G n lista respectivă. Procedăm recursiv: 1 Se calculează lista G n 1 a submulţimilor lui B = {a 1,..., a n 1 } într-o ordine Grey cu modificări minime. 2 Fie G n 1 lista obţintă prin adăugarea lui a 0 la fiecare element al unei copii inversate a listei G n 1. 3 G n este rezultatul concatenării listei G n 1 cu G n 1.
Propertăţi ale codurilor Grey reflectate Se presupune că B este submulţime a mulţimii ordonate A cu n elemente. Dacă atunci m este rangul lui B in în ordinea enumerării lui Grey, şi m = n 1 i=0 b i 2 i Codificarea ca şir de n biţi a lui B este c 0 c 1... c n 1 c i = (b i + b i+1 mod 2 for all 0 i < n, unde b n = 0. Reciproc, se poate demonstra că b i = (c i + c i+1 +... + c n 1 mod 2 pentru toţi 0 i < n.
Coduri Grey Exemplu (A = {a, b, c} cu a < b < c submulţime rang Grey b 0 b 1 b 2 şir de biţi rang B m astfel încât al lui B al lui B m = 2 i=0 b 2 i2 i c 0 c 1 c 2 {} 0 000 000 0 {c} 1 100 100 4 {b, c} 2 010 110 6 {b} 3 110 010 2 {a, b} 4 001 011 3 {a, b, c} 5 101 111 7 {a, c} 6 011 101 5 {a} 7 111 001 1 Se observă că c i = (b i + b i+1 mod 2 pentru toţi 0 i < 3, unde b 3 = 0.
Exerciţii 1 Folosiţi ecuaţiile de pe slide-ul precedent ca să implementaţi metodele de ordonare RanGrey(B,A şi de enumerare UnranGrey(A,r pentru enumerarea submulţimilor bazată pe coduri Grey. 2 Să se definescă metoda NextGreyRanSubset(A,B care calculează submulţimea lui A care urmează imediat după submulţimea B în enumerarea submulţimilor bazată pe coduri Grey.
-combinări Generarea -combinărilor Se dă o mulţime ordonată A cu n elemente şi 0 n. Să se genereze toate -combinările lui A.
-combinări Generarea -combinărilor Se dă o mulţime ordonată A cu n elemente şi 0 n. Să se genereze toate -combinările lui A. Metoda 1 (naivă şi ineficientă: generare şi testare 1 Se generează toate cele 2 n submulţimi ale lui A 2 Se elimină submulţimile generate care nu au elemente.
-combinări Generarea -combinărilor Se dă o mulţime ordonată A cu n elemente şi 0 n. Să se genereze toate -combinările lui A. Metoda 1 (naivă şi ineficientă: generare şi testare 1 Se generează toate cele 2 n submulţimi ale lui A 2 Se elimină submulţimile generate care nu au elemente. Metoda 2 (recursie simplă: Dacă A = {a} B unde a B este cel mai mic element al lui A atunci 1 Generează lista L 1 a tuturor ( 1-combinărilor lui B, şi fie L 2 lista tuturor -combinărilor lui B. 2 Fie L 3 lista ce se obţine adăugând a la toate elementele lui L 1. 3 Returnează rezultatul concatenării listelor L 2 şi L 3.
Ordonarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare (1 Se presupune că A = {1, 2,..., n} şi X = {x 1, x 2,..., x } A astfel încât x 1 < x 2 <... < x. Î: Care este rangul lui X în enumerarea lexicografică a -combinărilor lui A? -combinările care apar înaintea lui X în ordine lexicografică sunt de 2 feluri: 1 Cele care conţin un element mai mic decât x 1. 2 Cele al căror element minim este x 1, dar restul elementelor este o ( 1-combinare mai mică decât {x 2, x 3,..., x }.
Ordonarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare (1 Se presupune că A = {1, 2,..., n} şi X = {x 1, x 2,..., x } A astfel încât x 1 < x 2 <... < x. Î: Care este rangul lui X în enumerarea lexicografică a -combinărilor lui A? -combinările care apar înaintea lui X în ordine lexicografică sunt de 2 feluri: 1 Cele care conţin un element mai mic decât x 1. 2 Cele al căror element minim este x 1, dar restul elementelor este o ( 1-combinare mai mică decât {x 2, x 3,..., x }. rangul lui X în enumerarea lexicografică a -combinărilor lui A este N 1 + N 2 unde N 1 este numărul -combinărilor de primul fel N 2 este numărul -combinărilor de al doilea fel
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1?
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? Numărul -combinărilor lui A care au pe i cel mai mic element este
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? Numărul -combinărilor lui A care au pe i cel mai mic element este ( n i 1
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? Numărul -combinărilor lui A care au pe i cel mai mic element este N1 = x 1 1 (regula sumei ( n i 1 i=1 ( n i 1
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? ( Numărul -combinărilor lui A care au pe i cel mai mic element este n i 1 N1 = x 1 1 ( n i i=1 1 (regula sumei Ştim că ( ( n = n 1 ( 1 + n 1 (vezi curs 1
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? ( Numărul -combinărilor lui A care au pe i cel mai mic element este n i 1 N1 = x 1 1 ( n i i=1 1 (regula sumei Ştim că ( ( n = n 1 ( 1 + n 1 (vezi curs 1 N 1 = ( x (n i+1 1 1 ( i=1 n i = ( ( n n x1+1 Cum putem calcula N 2?
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? ( Numărul -combinărilor lui A care au pe i cel mai mic element este n i 1 N1 = x 1 1 ( n i i=1 1 (regula sumei Ştim că ( ( n = n 1 ( 1 + n 1 (vezi curs 1 N 1 = ( x (n i+1 1 1 ( i=1 n i = ( ( n n x1+1 Cum putem calcula N 2? N 2 este rangul lui {x 2,..., x } în enumerarea lexicografică a ( 1-combinărilor lui {x 1 + 1, x 1 + 2,..., n 1, n}
Ordonarea lexicografică a -combinărilor Observaţii preliminare (2 Ipoteză: A = {1, 2,..., n}. Cum putem calcula N 1? ( Numărul -combinărilor lui A care au pe i cel mai mic element este n i 1 N1 = x 1 1 ( n i i=1 1 (regula sumei Ştim că ( ( n = n 1 ( 1 + n 1 (vezi curs 1 N 1 = ( x (n i+1 1 1 ( i=1 n i = ( ( n n x1+1 Cum putem calcula N 2? N 2 este rangul lui {x 2,..., x } în enumerarea lexicografică a ( 1-combinărilor lui {x 1 + 1, x 1 + 2,..., n 1, n} N 2 se poate calcula recursiv.
Ordonarea lexicografică a -combinărilor Din observaţiile anterioare rezultă următoarea implementare recursivă a operaţiei de calcul al rangului: RanKSubset({x 1,..., x }, {l,..., n} calculează rangul în ordine lexicografică a -combinării {x 1,..., x } a mulţimii ordonate {l, l + 1,..., n 1, n}. Se presupune că x 1 < x 2 <... < x. RanKSubset({x 1,..., x }, {l, l + 1,..., n} if (n = or =0 return 0, p := x 1 l + 1 if ( = 1 return p 1 else return ( n ( n p+1 + RanKSubset({x2,..., x }, {x 1 + 1,..., n}
Enumerarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare Ipoteze: A = {1, 2,..., n} şi X = {x 1, x 2,..., x } cu x 1 < x 2 <... < x este submulţimea lui A cu rangul m în enumerarea lexicografică a tuturor -combinărilor lui A. [Reţinem că 0 m < ( n.] Î: Care sunt valorile lui x 1, x 2,..., x?
Enumerarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare 1 Numărul total al -combinărilor lui A care conţin un element < x 1 este x 1 1 i=1 ( n i ( n = 1 ( n x1 + 1 m. (1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 1}. Acest număr este m fiindcă toate aceste -combinări sunt lexicografic mai mici decât X, care are rangul m.
Enumerarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare 1 Numărul total al -combinărilor lui A care conţin un element < x 1 este x 1 1 i=1 ( n i ( n = 1 ( n x1 + 1 m. (1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 1}. Acest număr este m fiindcă toate aceste -combinări sunt lexicografic mai mici decât X, care are rangul m. 2 Numărul total al -combinărilor lui A care conţin un element x 1 este x 1 ( n i ( n ( n x1 = > m. (2 1 i=1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 }. Acest număr este > m deoarece sunt m + 1 întregi i între 0 şi rangul lui X (care este m, şi toate -combinările cu un astfel de rang i conţin un element x 1.
Enumerarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare 1 Numărul total al -combinărilor lui A care conţin un element < x 1 este x 1 1 i=1 ( n i ( n = 1 ( n x1 + 1 m. (1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 1}. Acest număr este m fiindcă toate aceste -combinări sunt lexicografic mai mici decât X, care are rangul m. 2 Numărul total al -combinărilor lui A care conţin un element x 1 este x 1 ( n i ( n ( n x1 = > m. (2 1 i=1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 }. Acest număr este > m deoarece sunt m + 1 întregi i între 0 şi rangul lui X (care este m, şi toate -combinările cu un astfel de rang i conţin un element x 1. putem folosi (1 şi (2 ca să aflăm x 1 : ( n ( n x1 +1 m < ( n ( n x1
Enumerarea lexicografică a -combinărilor Enunţul problemei. Observaţii preliminare 1 Numărul total al -combinărilor lui A care conţin un element < x 1 este x 1 1 i=1 ( n i ( n = 1 ( n x1 + 1 m. (1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 1}. Acest număr este m fiindcă toate aceste -combinări sunt lexicografic mai mici decât X, care are rangul m. 2 Numărul total al -combinărilor lui A care conţin un element x 1 este x 1 ( n i ( n ( n x1 = > m. (2 1 i=1 unde ( n i 1 este numărul -combinărilor în care cel mai mic element este i {1,..., x 1 }. Acest număr este > m deoarece sunt m + 1 întregi i între 0 şi rangul lui X (care este m, şi toate -combinările cu un astfel de rang i conţin un element x 1. putem folosi (1 şi (2 ca să aflăm x 1 : ( n ( n x1 +1 ( m < n ( n x1 Celelalte elemente x 2,..., x se pot determina recursiv.
Enumerarea lexicografică a -combinărilor UnranKSubset(m,, {a 1,..., a n } produce -combinarea {x 1,..., x } cu rangul m a lui {a 1,..., a n } în ordine lexicografică. Se presupune că x 1 <... < x şi a 1 <... < a n. UnranKSubset(m,, {a 1,..., a n} if ( = 1 return a +1 else if (m = 0 return {a 1,..., a m} else u := ( n i := 1 while ( i < u m i++ x1:=n (i 1 return {a n i+1 } UnranKSubset(m u + ( n x1+1, 1,{an i+2,..., a n}
Bibliografie S. Pemmaraju, S. Siena. Combinatorics and Graph Theory with Mathematica. Section 2.3: Combinations. Cambridge University Press. 2003.