View
67
Download
0
Category
Preview:
Citation preview
Curs 3
Permutari cu repetitie. Combinari.Algoritmi de ordonare si generare
Octombrie 2015
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Cuprins
Algoritmi de ordonare si generare pentru permutari cu repetitie
Reprezentarea binara a submultimilor
B Algoritmi de ordonare si generare
Generarea rapida a combinarilor
B Coduri Gray; propertati
Submultimi ordonate lexicografic
Generarea k-combinarilor
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Permutari cu repetitie
r -permutarile cu repetitie ale unui alfabet A = {a1, . . . , an} suntsecventele ordonate de forma
〈x1, . . . , xr 〉
unde x1, . . . , xr ∈ A.
B Acelasi simbol poate sa apara de mai multe ori ın or -permutare cu repetitie
B Conform regulii produsului, exista nr r -permutari cu repetitie
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Permutari cu repetitieAlgoritmi de ordonare si generare ın ordine lexicografica
r -permutarile cu repetitie pot fi ordonate lexicografic, la fel ca sir -permutarile obisnuite.
Exemplu (A = {a1, a2} cu a1 < a2, r = 3)
r -permutare cu repetitie a lui A rang〈a1, a1, a1〉 0〈a1, a1, a2〉 1〈a1, a2, a1〉 2〈a1, a2, a2〉 3〈a2, a1, a1〉 4〈a2, a1, a2〉 5〈a2, a2, a1〉 6〈a2, a2, a2〉 7
Definitie (Ordonare lexicografica)
〈x1, . . . , xr 〉 < 〈y1, . . . , yr 〉 daca exista k ∈ {1, . . . , n} astfel ıncat xk < yksi xi = yi pentru toti 1 ≤ i < k .
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea si generarea r -permutarilor cu repetitieObservatii
Fie A = {a1, a2, . . . , an} cu a1 < a2 < . . . < an.
Daca definim index(ai ) := i − 1 pentru 1 ≤ i ≤ n si ınlocuimai cu index(ai ) ın enumerarea lexicografica a r -permutarilor,avem
r -permutare cu repetitie a lui A rang〈a1, . . . , a1, a1, a1〉 ↔ 〈0, . . . , 0, 0, 0− 1〉 0...
...〈a1, . . . , a1, a1, an〉 ↔ 〈0, . . . , 0, 0, n − 1〉 n − 1〈a1, . . . , a1, a2, a1〉 ↔ 〈0, . . . , 0, 1, 0− 1〉 n...
...〈a1, . . . , a1, a2, an〉 ↔ 〈0, . . . , 0, 1, n − 1〉 2 n − 1...
...
Observatie: r -permutarea cu repetitie a indecsilor estereprezentarea ın baza n a rangului.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea si generarea r -permutarilor cu repetitieExercitii
1 Sa se defineasca un algoritm care calculeaza rangul uneir -permutari cu repetitie 〈x1, . . . , xr 〉 a lui A = {1, . . . , n} ınraport cu ordinea lexicografica.
2 Sa se defineasca un algoritm care calculeaza r -permutarea curepetitie a lui A = {1, . . . , n} care are rangul k ın raport cuordinea lexicografica.
3 Sa se defineasca un algoritm care calculeaza r -permutarea curepetitie care urmeaza imediat dupa r -permutarea cu repetitie〈x1, . . . , xr 〉 a lui A.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
CombinariReprezentarea binara a submultimilor
O r -combinare a unei multimi A cu n elemente este o submultime cu relemente a lui A.
Exista o correspondenta bijectiva ıntre sirurile de n-biti si submultimilemultimii A = {a1, a2, . . . , an}:
B ⊆ A 7→ bn−1bn−2 . . . b0 unde bi =
{1 daca an−i ∈ B0 ın caz contrar.
sir de n-biti b0b1 . . . bn−1 7→ submultimea {an−i | bi = 1} lui A
Exemplu
A = {a1, a2, a3, a4, a5} unde a1 = a, a2 = b, a3 = c , a4 = d , a5 = 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
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Calculul codificarii ca sir binar a lunei submultimi
BitString(B: submultime a lui A,A: multime ordonata {a1, . . . , an})
int bit string[0 ..n − 1]for i:=0 to n − 1 do
if ai ∈ B thenbit string [n − i ] := 1
elsebit string [n − i ] := 0
return bit string
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Calcului combinarii corespunzatoare unui sir de n-biti
Combination(b[0..n-1]: sir de biti,
A: multime ordonata {a1, . . . , an})B:=∅for i:=0 to n − 1 do
if b[i ] = 1 thenadauga an−i la B
return B
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea submultimilor folosind codificari cu siruri binare
Exista o corespondenta bijectiva ıntre codificarile cu siruri binare de n-bitisi numerele cuprinse ıntre 0 si 2n − 1 :
B sir de n−biti b[0 .. n − 1] 7→ numaruln−1∑i=0
b[i ] · 2i
B numar 0 ≤ r < 2n 7→ sirul de n-biti b[0 .. n − 1] unde
b[i ] :=⌊ ci
2i
⌋unde ci este restul ımpartirii lui r cu 2i+1.
Definitie
Rangul unei submultimi B a multimii ordonate A cu n elemente este
Rank(B,A) :=n−1∑i=0
b[i ] · 2i
unde b[0 .. n − 1] este codificarea cu sir de n-biti a lui B ca submultime alui A.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea submultimilor unei multimi prin intermediulsirurilor de biti
Exemplu (A = {a0, a1, a2})
submultime codificare binara rangb2b1b0
∅ 000 0{a0} 001 1{a1} 010 2{a0, a1} 011 3{a2} 100 4{a0, a2} 101 5{a1, a2} 110 6{a0, a1, a2} 111 7
Observatie. Acest mod de enumerare a submultimilor uneimultimi de numeste ordonare canonica, iar sirul b2b1b0 se numestecod canonic (sau binar).
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea submultimilor cu ajutorul sirurilor de biti (2)
B ⊆ 〈a0, . . . , an−1〉
n-biti b[0..n − 1]pentru codificarea binara
n−1∑i=0
b[i ] · 2i
BitString(B,A)
calcul direct
Rank(B,A)
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea submultimilor prin intermediul reprezentariibinare
Se da o multime ordonata A = {a0, a1, . . . , an−1}, si 0 ≤ r < 2n
Sa se determine submultimea B a lui A cu rangul r
0 ≤ r < 2n
n-bit string encoding b[0 .. n − 1]b[i ] := bc/2ic unde c := r mod 2i+1
pentru 0 ≤ i < n
B := {ai | b[n − i − 1] = 1}
Combination(b,A)
Unrank(A, r)
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea submultimilor prin intermediul reprezentariibinare
Problema 1:
Se da o submultime B a multimii ordonate A.
Sa se determine submultimea lui A care urmeaza dupa B ın ordonareaprin intermediul reprezentarii binare.
Sugestie: Se poate defini NextBinaryRankSubset(A,B) folosindalgoritmii anteriori de ordonare si enumerare.
Problema 2: Sa se genereze lista tuturor submultimilor lui A ın ordineacrescatoare a rangului calculat prin intermediul codificarii binare.
Sugestie: Se poate folosi functia Unrank(A, r) definita anterior.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea submultimilor prin intermediul reprezentariibinare
Problema 1:
Se da o submultime B a multimii ordonate A.
Sa se determine submultimea lui A care urmeaza dupa B ın ordonareaprin intermediul reprezentarii binare.
Sugestie: Se poate defini NextBinaryRankSubset(A,B) folosindalgoritmii anteriori de ordonare si enumerare.
Problema 2: Sa se genereze lista tuturor submultimilor lui A ın ordineacrescatoare a rangului calculat prin intermediul codificarii binare.
Sugestie: Se poate folosi functia Unrank(A, r) definita anterior.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea submultimilor cu modificari minimeCoduri Grey
Frank Grey a descoperit ın 1953 o metoda de enumerare a tuturorsubmultimilor unei multimi ıntr-o ordine ın care submultimileconsecutive difera prin inserarea sau stergerea unui singur element.
Aceasta schema de enumerare se numeste cod Grey reflectatstandard.
Exemplu
Folosind metoda lui Grey, submultimile of {a, b, c} sunt enumerate ınordinea urmatoare:
{}, {c}, {b, c}, {b}, {a, b}, {a, b, c}, {a, c}, {a}
Codificarile ca siruri binare b0b1b2 ale acestor submultimi sunt:
000, 100, 110, 010, 011, 111, 101, 001
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Codul Grey reflectat standardDescriere
Se doreste enumerarea submultimilor multimiiA = {a0, a1, . . . , an−1} ıntr-o ordine cu modificari minime ıntresubmultimi consecutive. Fie Gn lista respectiva.
Procedam recursiv:
1 Se calculeaza lista Gn−1 a submultimilor luiB = {a1, . . . , an−1} ıntr-o ordine Grey cu modificari minime.
2 Fie G ′n−1 lista obtinta prin adaugarea lui a0 la fiecare elemental unei copii inversate a listei Gn−1.
3 Gn este rezultatul concatenarii listei Gn−1 cu G ′n−1.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Propertati ale codurilor Grey reflectate
Se presupune ca B este submultime a multimii ordonate A cu nelemente.Daca
m este rangul lui B in ın ordinea enumerarii lui Grey, sim =
∑n−1i=0 bi · 2i
Codificarea ca sir de n biti a lui B este c0c1 . . . cn−1
atunci
ci = (bi + bi+1) mod 2 for all 0 ≤ i < n, unde bn = 0.
Reciproc, se poate demonstra ca
bi = (ci + ci+1 + . . . + cn−1) mod 2 pentru toti 0 ≤ i < n.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Coduri Grey
Exemplu (A = {a, b, c} cu a < b < c)
submultime rang Grey b0b1b2 sir de biti rangB m astfel ıncat al lui B al lui B
m =∑2
i=0 b2−i2i c0c1c2
{} 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 observa ca ci = (bi + bi+1) mod 2 pentru toti 0 ≤ i < 3, undeb3 = 0.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Exercitii
1 Folositi ecuatiile de pe slide-ul precedent ca sa implementatimetodele de ordonare RankGrey(B,A) si de enumerareUnrankGrey(A,r) pentru enumerarea submultimilor bazatape coduri Grey.
2 Sa se definesca metoda NextGreyRankSubset(A,B) carecalculeaza submultimea lui A care urmeaza imediat dupasubmultimea B ın enumerarea submultimilor bazata pe coduriGrey.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
k-combinariGenerarea k-combinarilor
Se da o multime ordonata A cu n elemente si 0 ≤ k ≤ n.
Sa se genereze toate k-combinarile lui A.
Metoda 1 (naiva si ineficienta): generare si testare
1 Se genereaza toate cele 2n submultimi ale lui A
2 Se elimina submultimile generate care nu au k elemente.
Metoda 2 (recursie simpla): Daca A = {a} ∪ B unde a 6∈ B estecel mai mic element al lui A atunci
1 Genereaza lista L1 a tuturor (k − 1)-combinarilor lui B, si fieL2 lista tuturor k-combinarilor lui B.
2 Fie L3 lista ce se obtine adaugand a la toate elementele lui L1.
3 Returneaza rezultatul concatenarii listelor L2 si L3.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
k-combinariGenerarea k-combinarilor
Se da o multime ordonata A cu n elemente si 0 ≤ k ≤ n.
Sa se genereze toate k-combinarile lui A.
Metoda 1 (naiva si ineficienta): generare si testare
1 Se genereaza toate cele 2n submultimi ale lui A
2 Se elimina submultimile generate care nu au k elemente.
Metoda 2 (recursie simpla): Daca A = {a} ∪ B unde a 6∈ B estecel mai mic element al lui A atunci
1 Genereaza lista L1 a tuturor (k − 1)-combinarilor lui B, si fieL2 lista tuturor k-combinarilor lui B.
2 Fie L3 lista ce se obtine adaugand a la toate elementele lui L1.
3 Returneaza rezultatul concatenarii listelor L2 si L3.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
k-combinariGenerarea k-combinarilor
Se da o multime ordonata A cu n elemente si 0 ≤ k ≤ n.
Sa se genereze toate k-combinarile lui A.
Metoda 1 (naiva si ineficienta): generare si testare
1 Se genereaza toate cele 2n submultimi ale lui A
2 Se elimina submultimile generate care nu au k elemente.
Metoda 2 (recursie simpla): Daca A = {a} ∪ B unde a 6∈ B estecel mai mic element al lui A atunci
1 Genereaza lista L1 a tuturor (k − 1)-combinarilor lui B, si fieL2 lista tuturor k-combinarilor lui B.
2 Fie L3 lista ce se obtine adaugand a la toate elementele lui L1.
3 Returneaza rezultatul concatenarii listelor L2 si L3.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare (1)
Se presupune ca A = {1, 2, . . . , n} si X = {x1, x2, . . . , xk} ⊆ A astfelıncat x1 < x2 < . . . < xk .
I: Care este rangul lui X ın enumerarea lexicografica a k-combinarilorlui A?
k-combinarile care apar ınaintea lui X ın ordine lexicografica sunt de 2feluri:
1 Cele care contin un element mai mic decat x1.
2 Cele al caror element minim este x1, dar restul elementelor este o(k − 1)-combinare mai mica decat {x2, x3, . . . , xk}.
⇒ rangul lui X ın enumerarea lexicografica a k-combinarilor lui A esteN1 + N2 unde
B N1 este numarul k-combinarilor de primul fel
B N2 este numarul k-combinarilor de al doilea fel
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare (1)
Se presupune ca A = {1, 2, . . . , n} si X = {x1, x2, . . . , xk} ⊆ A astfelıncat x1 < x2 < . . . < xk .
I: Care este rangul lui X ın enumerarea lexicografica a k-combinarilorlui A?
k-combinarile care apar ınaintea lui X ın ordine lexicografica sunt de 2feluri:
1 Cele care contin un element mai mic decat x1.
2 Cele al caror element minim este x1, dar restul elementelor este o(k − 1)-combinare mai mica decat {x2, x3, . . . , xk}.
⇒ rangul lui X ın enumerarea lexicografica a k-combinarilor lui A esteN1 + N2 unde
B N1 este numarul k-combinarilor de primul fel
B N2 este numarul k-combinarilor de al doilea fel
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este
(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)
Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este
(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)
⇒ N1 =∑x1−1
i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilorObservatii preliminare (2)
Ipoteza: A = {1, 2, . . . , n}.Cum putem calcula N1?
Numarul k-combinarilor lui A care au pe i cel mai mic element este(n−ik−1
)⇒ N1 =
∑x1−1i=1
(n−ik−1
)(regula sumei)
Stim ca(nk
)=(n−1k−1
)+(n−1k
)(vezi curs 1)
⇒ N1 =∑x1−1
i=1
((n−i+1
k
)−(n−ik
))=(nk
)−(n−x1+1
k
)Cum putem calcula N2?
N2 este rangul lui {x2, . . . , xk} ın enumerarea lexicografica a(k − 1)-combinarilor lui {x1 + 1, x1 + 2, . . . , n − 1, n}
⇒ N2 se poate calcula recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Ordonarea lexicografica a k-combinarilor
Din observatiile anterioare rezulta urmatoarea implementare recursiva aoperatiei de calcul al rangului:
RankKSubset({x1, . . . , xk}, {`, . . . , n}) calculeaza rangul ın ordinelexicografica a k-combinarii {x1, . . . , xk} a multimii ordonate{`, ` + 1, . . . , n − 1, n}. Se presupune ca x1 < x2 < . . . < xk .
RankKSubset({x1, . . . , xk}, {`, ` + 1, . . . , n})if (n = k or k=0)
return 0,
p := x1 − ` + 1if (k = 1)
return p − 1else
return(nk
)−(n−p+1
k
)+ RankKSubset({x2, . . . , xk}, {x1 + 1, . . . , n})
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare
Ipoteze:
A = {1, 2, . . . , n} si X = {x1, x2, . . . , xk} cu x1 < x2 < . . . < xk estesubmultimea lui A cu rangul m ın enumerarea lexicografica a tuturork-combinarilor lui A.[Retinem ca 0 ≤ m <
(nk
).]
I: Care sunt valorile lui x1, x2, . . . , xk?
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare
1 Numarul total al k-combinarilor lui A care contin un element < x1 este
x1−1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1 + 1
k
)≤ m. (1)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1 − 1}. Acest numar este ≤ m fiindca toate aceste k-combinari sunt
lexicografic mai mici decat X , care are rangul m.
2 Numarul total al k-combinarilor lui A care contin un element ≤ x1 este
x1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1
k
)> m. (2)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1}. Acest numar este > m deoarece sunt m + 1 ıntregi i ıntre 0 si
rangul lui X (care este m), si toate k-combinarile cu un astfel de rang i contin
un element ≤ x1.
⇒ putem folosi (1) si (2) ca sa aflam x1:(nk
)−(n−x1+1
k
)≤ m <
(nk
)−(n−x1
k
)Celelalte elemente x2, . . . , xk se pot determina recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare
1 Numarul total al k-combinarilor lui A care contin un element < x1 este
x1−1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1 + 1
k
)≤ m. (1)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1 − 1}. Acest numar este ≤ m fiindca toate aceste k-combinari sunt
lexicografic mai mici decat X , care are rangul m.
2 Numarul total al k-combinarilor lui A care contin un element ≤ x1 este
x1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1
k
)> m. (2)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1}. Acest numar este > m deoarece sunt m + 1 ıntregi i ıntre 0 si
rangul lui X (care este m), si toate k-combinarile cu un astfel de rang i contin
un element ≤ x1.
⇒ putem folosi (1) si (2) ca sa aflam x1:(nk
)−(n−x1+1
k
)≤ m <
(nk
)−(n−x1
k
)Celelalte elemente x2, . . . , xk se pot determina recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare
1 Numarul total al k-combinarilor lui A care contin un element < x1 este
x1−1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1 + 1
k
)≤ m. (1)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1 − 1}. Acest numar este ≤ m fiindca toate aceste k-combinari sunt
lexicografic mai mici decat X , care are rangul m.
2 Numarul total al k-combinarilor lui A care contin un element ≤ x1 este
x1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1
k
)> m. (2)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1}. Acest numar este > m deoarece sunt m + 1 ıntregi i ıntre 0 si
rangul lui X (care este m), si toate k-combinarile cu un astfel de rang i contin
un element ≤ x1.
⇒ putem folosi (1) si (2) ca sa aflam x1:(nk
)−(n−x1+1
k
)≤ m <
(nk
)−(n−x1
k
)
Celelalte elemente x2, . . . , xk se pot determina recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilorEnuntul problemei. Observatii preliminare
1 Numarul total al k-combinarilor lui A care contin un element < x1 este
x1−1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1 + 1
k
)≤ m. (1)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1 − 1}. Acest numar este ≤ m fiindca toate aceste k-combinari sunt
lexicografic mai mici decat X , care are rangul m.
2 Numarul total al k-combinarilor lui A care contin un element ≤ x1 este
x1∑i=1
(n − i
k − 1
)=(nk
)−(n − x1
k
)> m. (2)
unde(n−ik−1
)este numarul k-combinarilor ın care cel mai mic element este
i ∈ {1, . . . , x1}. Acest numar este > m deoarece sunt m + 1 ıntregi i ıntre 0 si
rangul lui X (care este m), si toate k-combinarile cu un astfel de rang i contin
un element ≤ x1.
⇒ putem folosi (1) si (2) ca sa aflam x1:(nk
)−(n−x1+1
k
)≤ m <
(nk
)−(n−x1
k
)Celelalte elemente x2, . . . , xk se pot determina recursiv.
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Enumerarea lexicografica a k-combinarilor
UnrankKSubset(m, k , {a1, . . . , an}) produce k-combinarea{x1, . . . , xk} cu rangul m a lui {a1, . . . , an} ın ordine lexicografica.Se presupune ca x1 < . . . < xk si a1 < . . . < an.
UnrankKSubset(m, k, {a1, . . . , an})if (k = 1)
return ak+1
else if (m = 0)return {a1, . . . , am}
elseu :=
(nk
)i := 1while
( ik
)< u −m
i++x1:=n − (i − 1)
return {an−i+1} ∪ UnrankKSubset(m − u +(n−x1+1
k
), k − 1,{an−i+2, . . . , an})
Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare
Recommended