Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
Algoritmen en Datastructuren III Partim: Parallelle algoritmen - caagt
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