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.

44 Hoofdstuk 4. Ontwerptechniek<strong>en</strong> voor parallelle algoritm<strong>en</strong><br />

Algoritme 4.7 Partitioneringsalgoritme<br />

Input: A = (a1,...,an) <strong>en</strong> B = (b1,...,bm) stijg<strong>en</strong>d, log 2 m <strong>en</strong> k = m/log 2 m geheel<br />

Output: k par<strong>en</strong> deelrij<strong>en</strong> (Ai,Bi), zodat |Bi| = log 2 m, <strong>en</strong> elk elem<strong>en</strong>t van Ai <strong>en</strong> Bi groter dan<br />

elk elem<strong>en</strong>t van Ai−1 <strong>en</strong> Bi−1, voor elke 1 ≤ i < k<br />

1: Stel j0 ← 0; jk ← n<br />

2: for i from 1 to k − 1 pardo<br />

3: Bepaal rank(bilog 2 m : A) via de binaire zoekmethode<br />

4: Stel ji ← rank(bilog 2 m : A)<br />

5: for i from 0 to k − 1 pardo<br />

6: Stel Bi ← (bilog 2 m+1,...,b (i+1)log 2 m)<br />

7: Stel Ai ← (a ji+1,...,aji+1 )<br />

Stelling 4.3.1. Zij C de gesorteerde rij bekom<strong>en</strong> door het merg<strong>en</strong> van de twee gesorteerde rij<strong>en</strong><br />

A <strong>en</strong> B, met l<strong>en</strong>gte resp. n <strong>en</strong> m. Algoritme 4.7 partitioneert A <strong>en</strong> B in par<strong>en</strong> deelrij<strong>en</strong> (Ai,Bi)<br />

zodanig dat |Bi| = Θ(log 2 m), ∑i |Ai| = n <strong>en</strong> C = (C0,C1,...), waarbij Ci de gesorteerde deelrij<br />

is die bekom<strong>en</strong> werd door Ai <strong>en</strong> Bi te merg<strong>en</strong>. Het algoritme heeft parallelle uitvoeringstijd<br />

T(n) = Θ(logn) <strong>en</strong> vereist W(n) = O(n+m) bewerking<strong>en</strong>.<br />

Bewijs: We bewijz<strong>en</strong> eerst dat elk elem<strong>en</strong>t in de deelrij<strong>en</strong> Ai <strong>en</strong> Bi groter is dan elk elem<strong>en</strong>t in<br />

Ai−1 <strong>en</strong> Bi−1, voor elke 1 ≤ i < k. De twee kleinste elem<strong>en</strong>t<strong>en</strong> van Ai <strong>en</strong> Bi zijn resp. a j(i)+1 <strong>en</strong><br />

bilog 2 m+1. De tweede grootste elem<strong>en</strong>t<strong>en</strong> van Ai−1 <strong>en</strong> Bi−1 zijn resp. a j(i) <strong>en</strong> bilog 2 m. Aangezi<strong>en</strong><br />

rank(bilog 2 m : A) = j(i), wet<strong>en</strong> we dat a j(i) < bilog 2 m < a j(i)+1. Hieruit volgt dat bilog 2 m+1 ><br />

bilog 2 m > a j(i) <strong>en</strong> ook dat a j(i) > bilog 2 m. M.a.w. elk van de elem<strong>en</strong>t<strong>en</strong> uit Ai <strong>en</strong> Bi is groter dan<br />

elk van de elem<strong>en</strong>t<strong>en</strong> uit Ai−1 <strong>en</strong> Bi−1. Hieruit volgt de correctheid van het algoritme.<br />

De complexiteitsanalyse gebeurt als volgt. Stap 1 neemt Θ(1) sequ<strong>en</strong>tiële tijd. De eerste parallelle<br />

for-lus vereist Θ(logn) parallelle tijd, aangezi<strong>en</strong> de binaire zoekmethode op alle gew<strong>en</strong>ste<br />

elem<strong>en</strong>t<strong>en</strong> in parallel uitgevoerd wordt. Het aantal bewerking<strong>en</strong> in deze lus is gegev<strong>en</strong><br />

door Θ(logn×(m/logm))=O(n+m), aangezi<strong>en</strong> (mlog 2 n/log 2 m) < (mlog 2 (n+m)/log 2 m) <<br />

n+m, voor m ≥ 4. De laatste parallelle for-lus vereist Θ(1) tijd <strong>en</strong> e<strong>en</strong> lineair aantal bewerking<strong>en</strong>.<br />

Het totale algoritme vereist dus T(n) = Θ(logn) parallelle uitvoeringstijd <strong>en</strong> W(n) = O(n+m)<br />

bewerking<strong>en</strong>.<br />

Wanneer we Algoritme 4.7 toepass<strong>en</strong> op het merge-probleem (waarbij we twee rij<strong>en</strong> van gelijke<br />

l<strong>en</strong>gte n hebb<strong>en</strong>), dan levert dat e<strong>en</strong> stel onafhankelijke merge-deelproblem<strong>en</strong>. Dit is de ess<strong>en</strong>tie<br />

van de partitioneringsstrategie.<br />

Nu w<strong>en</strong>s<strong>en</strong> we elk merge-deelprobleem op te loss<strong>en</strong> in Θ(logn) tijd, zodanig dat het totaal aantal<br />

gebruikte bewerking<strong>en</strong> proportioneel is met de grootte van de deelproblem<strong>en</strong>. Deze uitvoeringstijd<br />

kunn<strong>en</strong> we als volgt bekom<strong>en</strong>.<br />

Beschouw het merge-deelprobleem voor e<strong>en</strong> willekeurig paar (Ai,Bi). Merk op dat |Bi| = log 2 n<br />

voor alle i. Als |Ai| = O(logn), dan kunn<strong>en</strong> we (Ai,Bi) merg<strong>en</strong> in Θ(logn) sequ<strong>en</strong>tiële tijd door<br />

e<strong>en</strong> optimaal sequ<strong>en</strong>tieel algoritme te gebruik<strong>en</strong>. Anders gebruik<strong>en</strong> we Algoritme 4.7 om Ai te<br />

partitioner<strong>en</strong> in blokk<strong>en</strong> die elk O(logn) groot zijn (in dit geval speelt Ai de rol van B <strong>en</strong> Bi speelt<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!