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.

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

Algoritme 4.5 Berek<strong>en</strong>ing van prefixsomm<strong>en</strong> op PRAM (recursieve formulering)<br />

Input: rij (a1,...,an) met n = 2 ℓ , p = n processor<strong>en</strong><br />

Output: sk = ∑ k i=1 ai, voor 1 ≤ k ≤ n<br />

1: if n = 1 th<strong>en</strong><br />

2: Stel s1 ← a1<br />

3: return<br />

4: for i from 1 to n/2 pardo<br />

5: Stel bi ← a2i−1 ⊕ a2i<br />

6: Berek<strong>en</strong> recursief prefixsomm<strong>en</strong> (c1...,c n/2) van (b1,...,b n/2)<br />

7: for i from 1 to n pardo<br />

8: case i = 1: Stel s1 ← a1<br />

9: case i ev<strong>en</strong>: Stel si ← c i/2<br />

10: case i onev<strong>en</strong>: Stel si ← c (i−1)/2 ⊕ ai<br />

We bewijz<strong>en</strong> de correctheid van het algoritme door inductie, waarbij we veronderstell<strong>en</strong> dat de<br />

inputgrootte n = 2 ℓ is. Het basisgeval k = 0 wordt correct behandeld door de eerste if-opdracht<br />

van het algoritme. Onderstel nu dat het algoritme correct werkt voor alle rij<strong>en</strong> van l<strong>en</strong>gte 2 k met<br />

k > 0. We bewijz<strong>en</strong> dat het algoritme correct werkt voor alle rij<strong>en</strong> van l<strong>en</strong>gte n = 2 k+1 .<br />

Weg<strong>en</strong>s de inductiehypothese bevatt<strong>en</strong> de variabel<strong>en</strong> (c1...,c n/2), berek<strong>en</strong>d in de recursieve<br />

stap van het algoritme, de prefixsomm<strong>en</strong> van de rij (b1,...,b n/2), waarbij bi ← a2i−1 ⊕ a2i, voor<br />

1 ≤ i ≤ n/2. Meer bepaald is c j = c1 ⊕ c2 ⊕ ··· ⊕ c j, <strong>en</strong> dus c j = a1 ⊕ a2 ⊕ ··· ⊕ a2 j−1 ⊕ a2 j.<br />

M.a.w. c j bevat precies de prefixsomm<strong>en</strong> s2 j, voor 1 ≤ j ≤ n/2. Dus, voor i ev<strong>en</strong>, zij i = 2 j,<br />

hebb<strong>en</strong> we dat si = c i/2.<br />

Anders is ofwel i = 1, ofwel i = 2 j+ 1, voor zekere 1 ≤ j ≤ n/2 − 1. Het geval i = 1 is triviaal.<br />

Voor het geval i = 2 j+ 1, hebb<strong>en</strong> we dat si = s2 j+1 = s2 j ⊕ a2 j+1 = c (i−1)/2 ⊕ ai.<br />

M.a.w. alle gevall<strong>en</strong> word<strong>en</strong> correct afgehandeld in de case-opdracht van het algoritme. Hieruit<br />

volgt dat het algoritme correct werkt.<br />

Vervolg<strong>en</strong>s besprek<strong>en</strong> we de complexiteit van het algoritme. De if-opdracht <strong>en</strong> de twee parallelle<br />

for-luss<strong>en</strong> nem<strong>en</strong> elk Θ(1) parallelle tijd <strong>en</strong> vrag<strong>en</strong> Θ(n) bewerking<strong>en</strong>. De parallelle uitvoeringstijd<br />

T(n) <strong>en</strong> het werk W(n) van het algoritme word<strong>en</strong> dus bepaald voor de volg<strong>en</strong>de recurr<strong>en</strong>te<br />

betrekking<strong>en</strong>:<br />

T(n) = T(n/2)+Θ(1)<br />

W(n) = W(n/2)+Θ(n)<br />

De oplossing<strong>en</strong> van deze recurr<strong>en</strong>te betrekking<strong>en</strong> zijn:<br />

Het algoritme is dus werk-optimaal.<br />

T(n) = Θ(logn)<br />

W(n) = Θ(n)<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!