03.07.2013 Views

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4.3. Partitionering / Merge 43<br />

kleiner dan of gelijk is aan x. Zij Y = (y1,...,yk) e<strong>en</strong> willekeurige rij van elem<strong>en</strong>t<strong>en</strong> uit S. Het<br />

rank<strong>en</strong> van Y in X is het probleem van het bepal<strong>en</strong> van de rij rank(Y : X) = (r1,...,rk), waarbij<br />

ri = rank(yi : X).<br />

Zonder verlies van algeme<strong>en</strong>heid kunn<strong>en</strong> we veronderstell<strong>en</strong> dat alle elem<strong>en</strong>t<strong>en</strong> die in de gegev<strong>en</strong><br />

rij<strong>en</strong> A <strong>en</strong> B optred<strong>en</strong>, verschill<strong>en</strong>d zijn. Meer bepaald komt ge<strong>en</strong> <strong>en</strong>kele elem<strong>en</strong>t van A voor in B.<br />

Het probleem van merg<strong>en</strong> kan word<strong>en</strong> beschouwd als het bepal<strong>en</strong> van de rank van elk elem<strong>en</strong>t x<br />

uit A <strong>en</strong> B in de rij A ∪ B. Als rank(x : A ∪ B) = i, dan is ci = x, waarbij ci het i-de elem<strong>en</strong>t van<br />

de gew<strong>en</strong>ste gesorteerde rij is. Aangezi<strong>en</strong> rank(x : A ∪ B) = rank(x : A)+rank(x : B), kunn<strong>en</strong><br />

we het probleem van merg<strong>en</strong> oploss<strong>en</strong> door de twee gehele rij<strong>en</strong> rank(A : B) <strong>en</strong> rank(B : A) te<br />

bepal<strong>en</strong>.<br />

We beschrijv<strong>en</strong> nu e<strong>en</strong> algoritme om rank(B : A) te bepal<strong>en</strong>. Hetzelfde algoritme kan gebruikt<br />

word<strong>en</strong> om rank(A : B) te bepal<strong>en</strong>. Zijn bi e<strong>en</strong> willekeurig elem<strong>en</strong>t van B. Aangezi<strong>en</strong> A gesorteerd<br />

is, kunn<strong>en</strong> we de rank van bi in A vind<strong>en</strong> door gebruik te mak<strong>en</strong> van de binaire zoekmethode.<br />

We vergelijk<strong>en</strong> bi met het middelste elem<strong>en</strong>t van A. Afhankelijk van de uitkomst van<br />

deze vergelijking kunn<strong>en</strong> we het zoek<strong>en</strong> beperk<strong>en</strong> tot de onderste of de bov<strong>en</strong>ste helft van A. Dit<br />

proces wordt herhaald totdat bi geïsoleerd is tuss<strong>en</strong> twee ope<strong>en</strong>volg<strong>en</strong>de elem<strong>en</strong>t<strong>en</strong> van A, m.a.w.<br />

a j(i) < bi < a j(i)+1, waarbij rank(bi : A) = j(i). Merk op dat we hier gebruik mak<strong>en</strong> van het feit<br />

dat de elem<strong>en</strong>t<strong>en</strong> van A <strong>en</strong> B allemaal verschill<strong>en</strong>d zijn.<br />

Dit algoritme bepaalt de rank van e<strong>en</strong> willekeurig elem<strong>en</strong>t van B in A in sequ<strong>en</strong>tiële tijd Θ(logn).<br />

Het is onmiddellijk duidelijk dat we deze methode in parallel kunn<strong>en</strong> uitvoer<strong>en</strong> voor alle elem<strong>en</strong>t<strong>en</strong><br />

van B. Dit levert e<strong>en</strong> parallel algoritme voor het bepal<strong>en</strong> van rank(B : A) met parallelle uitvoeringstijd<br />

Θ(logn). Dit impliceert e<strong>en</strong> parallel algoritme met uitvoeringstijd Θ(logn) voor het<br />

merg<strong>en</strong> van twee rij<strong>en</strong> van l<strong>en</strong>gte n. Het totaal aantal bewerking<strong>en</strong> gebruikt door dit algoritme is<br />

echter W(n) = Θ(nlogn), zodat het algoritme dus niet werk-optimaal is (aangezi<strong>en</strong> sequ<strong>en</strong>tiële<br />

algoritm<strong>en</strong> met lineaire uitvoeringstijd bestaan).<br />

4.3.3 Parallel algoritme voor merge via partitioner<strong>en</strong><br />

E<strong>en</strong> werk-optimaal parallel algoritme kan als volgt bekom<strong>en</strong> word<strong>en</strong>. Kies ongeveer n/log 2 n<br />

elem<strong>en</strong>t<strong>en</strong> elk uit A <strong>en</strong> B die A <strong>en</strong> B partitioner<strong>en</strong> in blokk<strong>en</strong> van ongeveer gelijke grootte. Pas<br />

de binaire zoekmethode toe om elk van de gekoz<strong>en</strong> elem<strong>en</strong>t<strong>en</strong> te rank<strong>en</strong> in de andere rij. Deze<br />

stap reduceert het probleem tot het merg<strong>en</strong> van e<strong>en</strong> aantal par<strong>en</strong> van deelrij<strong>en</strong>, die elk Θ(logn)<br />

elem<strong>en</strong>t<strong>en</strong> hebb<strong>en</strong>. Dan kunn<strong>en</strong> we e<strong>en</strong> optimaal sequ<strong>en</strong>tieel algoritme gebruik<strong>en</strong> om elk paar<br />

deelrij<strong>en</strong> te merg<strong>en</strong> tot e<strong>en</strong> gesorteerde deelrij, die deel uitmaakt van van de uiteindelijk gew<strong>en</strong>ste<br />

gesorteerde rij.<br />

Bij het uitwerk<strong>en</strong> van de details beperk<strong>en</strong> we ons voor de e<strong>en</strong>voud tot e<strong>en</strong> lichtjes ander algoritme.<br />

Algoritme 4.7 geeft de pseudocode voor het partitioneringsalgoritme, dat de belangrijkste<br />

compon<strong>en</strong>t van het gehele merge-algoritme zal uitmak<strong>en</strong>. In deze beschrijving veronderstell<strong>en</strong><br />

we niet dat de l<strong>en</strong>gte van de twee deelrij<strong>en</strong> noodzakelijk gelijk zal zijn.<br />

Volg<strong>en</strong>de stelling bewijst de correctheid <strong>en</strong> de complexiteit van dit algoritme.<br />

<strong>Algoritm<strong>en</strong></strong> <strong>en</strong> Datastructur<strong>en</strong> <strong>III</strong> Veerle.Fack@UG<strong>en</strong>t.be

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!