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.
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