Generisanje Permutacija i Kombinacija

Embed Size (px)

DESCRIPTION

Ako trazite odlicno uradjen seminarski evo prilike.

Citation preview

GENERISANJE PERMUTACIJA I KOMBINACIJA

GENERISANJE PERMUTACIJA I KOMBINACIJA6.1 UVOD

Nabrajanje kombinatornih objekata zauzima znaajno mesto u kompjuterskoj nauci zbog mnogobrojnih primena u nauci i ininjerstvu. U ovom odeljku opisujemo niz paralelnih algoritama za dva fundamentalna problema generisanja permutacija i kombinacija. Poinjemo nekim definicijama.

Recimo da S predstavlja skup koji se sastoji od n razliitih elemenata, recimo prvih n celih brojeva; dakle S = {1, 2, ... n}. Jedna permutacija m-te klase skupa S dobija se odabirom m razliitih celih brojeva iz n i ureivanjem tih brojeva nekim redosledom. Dakle, za n = 10 i m = 4, permutacija 4-te klase moze biti (5 7 9 2). Dve permutacije m-te klase su razliite ukoliko se razlikuju u pogledu elemenata koje sadre ili u pogledu redosleda nekih elemenata. Broj razliitih permutacija m-te klase od n elemenata oznaava se sa n P m, gde jen P m = n!/(n - m)!.Dakle, za n = 4 postoje dvadeset etiri razliite permutacije 3-ce klase. Imajte u vidu da kada je n = m, onda je n P m = n!.

Sada recimo da su x = (x1 x2 ... xm) a y = (y1 y2 ... ym) dve permutacije m-te klase skupa S. Kaemo da x prethodi y u leksikografskom redosledu ukoliko postoji i, , tako da je x j = y j za sve j < i i x i < y i. Permutacije 3-ce klase od elemenata {1, 2, 3, 4} po leksikografskom redosledu su:

(1 2 3),

(1 2 4),

(1 3 2),

(1 3 4),

(1 4 2),

(1 4 3),

(2 1 3),

(2 1 4),

(2 3 1),

(2 3 4),

(2 4 1),

(2 4 3),

(3 1 2),

(3 1 4),

(3 2 1),

(3 2 4),

(3 4 1),

(3 4 2),

(4 1 2),

(4 1 3),

(4 2 1),

(4 2 3),

(4 3 1),

(4 3 2).

Imajte u vidu da se, budui da je S = {1, 2, 3, 4}, leksikografski redosled poklapa sa porastom numerikog redosleda. Da smo za elemente S imali slova abecede, leksikografski redosled bio bi ekvivalentan redosledu koji se koristi da izlista rei u reniku.

Jedna permutacija m-te klase skupa S dobija se odabirom m razliitih celih brojeva iz n i ureivanjem tih brojeva nekim redosledom. Dakle, za n =6 i m = 3, jedna permutacija 3-ce klase je (2 4 5). Dve permutacije m-te klase su razliite ukoliko se razlikuju u pogledu elemenata koje sadre. Broj razliitih permutacija m-te klase od n elemenata oznaava se sa n C m [i ponekada (nm)] gde jen C m = n!/m!(n - m)!.

Dakle, za n = 4 postoje etiri razliite permutacije 3-ce klase. Budui da su kombinacije m-te klase poseban sluaj permutacija m-te klase, definicija leksikografskog redosleda primenjuje se na njih, takoe. Kombinacije 3-ce klase od elemenata {1, 2, 3, 4} po leksikografskom redosledu su(1 2 3),

(1 2 4), (1 3 4), (2 3 4).

Treba biti jasno da svaki od dva cela broja n P m i n C m moe biti izraunat sekvencijalno u O(mn) vremenu.

Ovaj odeljak bavi se problemom generisanja svih permutacija i kombinacija m-te klase od n elemenata u leksikografskom redosledu. Poinjemo opisivanjem broja sekvencijalnih algoritama u odeljku 6.2. dva od ovih algoritama povezani su sa generisanjem permutacija i kombinacija m-te klase po leksikografskom redosledu, ponaosob. Ostali algoritmi u sekciji 6.2 primenjuju dva numerika sistema koja povezuju jedinstveni celi broj sa svakom permutacijom i kombinacijom m-te klase, ponaosob. Tri paralelne generisane permutacije m-te klase algoritama za EREW SM SIMD model kompjuterizacije opisane su u sekciji 6.3. Prvi od ovih algoritama jeste direktna paraleli/zacija sekvencijalnog algoritma u sekciji 6.2. isti koristi m procesore i vri se u O(nPmlog m) vremenu. Drugi algotitam bazira se na numerikom sistemu za permutacije m-te klase opisane u odeljku 6.2 i isti je adaptivan i optimalne cene. Koristi N procesore, gde je 1 0), onda ovde vredi:

m = 1, step = n div 2 = 2k1 i

y[n 1] sadrzi citavu sumu x(0 : n 1).

U protivnom, za n = 1 vredi m = 0.}

{Spustanje}

for j := 1 to k 2 do {j-ti korak spustanja - koristi samo y} begin

m := 2 m; {m = 2j} step := step div 2; {step = n div (2m) = 2k(j+1) = 2kj1} for i := 1 to m 1 parallel do {za 1 manje nego prije}

y[(2 i + 1) step 1] := y[(2 i step 1] + y[(2 i + 1) step 1];

{= x(0 : (2i + 1) step 1)}

end; {for j} m := 2 m; {m = 2k1 = n div 2}

{ovdje ne treba: step := step div 2; jer izlazi tacno step = 1}

parallel begin

y[0] := x[0];

for i := 1 to m 1 parallel doy[2 i] := y[2 i 1] + x[2 i]; {= x(0 : 2i)} parallel end;

Ako je n = 1, onda se petlja po j ne izvrsava, a u zadnjem bloku je m = 0, pa

se ne izvrsava niti petlja po i. Tj. za n = 1, samo kopiramo x[0] u y[0].

Za n > 1, algoritam u j-tom koraku penjanja (za j = 1, . . . , k) racuna

y[i2j 1] := x((i 1)2j : i2j 1) , i = 1, . . . , 2kj ,

4. BRZI ALGORITMI NA STABLIMA PARALELNI PREFIKS 54

a u j-tom koraku spustanja (za j = 1, . . . , k 1) racuna

y[i2kj + 2kj1 1] := x(0 : i2kj + 2kj1 1) , i = 1, . . . , 2j 1

6.18

Algorithm ZS1.

for i:=1 to n do xi:=1;

x1:=n; m:=1; h:=1; output x1;

while x11 do {

if xh=2 then {m:=m+1; xh:=1; h:=h-1}

else {r:=xh-1; t:=m-h+1; xh:=r;

while t r do {h:=h+1; xh:=r; t:=t-r}

if t=0 then m:=h

else { m:=h+1;

i f t>1 then {h:=h+1;

xh:=t}}

output x1, x2, ..., xm}

za niz n=a1+a2++am.

Algorithm ZS2.

for i:=1 to n do xi:=1; output xi, i=1,2,..., n;

x0:=-1; x1:=2; h:=1; m:=n-1; output xi, i=1,2,...,m;

while x1 n do {

if m-h>1 then {h:=h+1; xh:=2; m:=m-1}

else {j:=m-2;

while xj= xm-1 do { xj := 1; j:=j-1 };

h:=j+1; xh:= xm-1+1; r:=xm+xm-1(m-h-1); xm := 1;

if m-h>1 then xm-1:=1;

m:= h+r-1;

output x1, x2, ..., xm}

ovo je za povecanje I samnjenje niza.

6.3 EREW MODEL

EREW SORT:

procedure EREW SORT (S)

if {Sj < k

then QUICKSORT (S)

else (1) for i = 1 to k - 1 do

PARALLEL SELECT (S, rilSi/kj) {Obtain mi}

end for

(2) SI-{seS:s m,}

(3) for i = 2 to k - 1 do

S +-{seS:m1-, < s < me}

end for

(4) Sk +- {sCES:s > mk- ,

(5) for i = 1 to k/2 do in parallel

EREW SORT (Si)

end for

(6) for i = (k/2) + 1 to k do in parallel

EREW SORT (Si)

end for

end if._________________________________________

6.10

procedure MULTIPLE BROADCAST (d(l), d(2),...,d(N))

Step 1: for i = I to N do in parallel

{Pi initializes level(i) and loc(i)}

(1.1) level(i)+-O

(1.2) loc(i) +-N + i- 2

(1.3) store [i] in location d(i) + loc(i)

end for.

Step 2: for v = 0 to (log N)-2 do

(2.1) for i = 1 to N do in parallel

{Pi at a left child advances up its tree}

(2.1.1) x (lo(i) - 1)/2]

(2.1.2) if loc(i) is odd and level(i)= v

then (i) loc(i) - x

(ii) store [i] in location d(i) + loc(i)

(iii) level(i) +- level(i) + 1

end if

end for

(2.2) for i = I to N do in parallel

if d(i) + x does not already contain a marker [j] for some 1 j < N

then (i) loc(i) - x

(ii) store [i] in location d(i) + loc(i)

(iii) level(i) +- level(i) + 1

end if

end for

end for.

Step 3: for v = (log N)- 1 down to 0 do

(3.1) for i = 1 to N do in parallel

(3. 1. 1) x - (loc(i) - 1)/2]

(3.1.2) y - (2 x loc(i)) + 1

(3.1.3) if loc(i) is odd and level(i) = v

then (i) read the contents of d(i) + x

(ii) write the contents of d(i) + x in location

d(i) + loc(i)

(iii) level(i) +-- level(i) - 1

(iv) if location d(i) + y contains [i]

then loc(i) -- y

else loc(i)