Benaderend string matching
Benaderend string matching
Benaderend string matching
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Benaderend</strong> <strong>string</strong><br />
<strong>matching</strong><br />
Editeerafstand<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.1/28
Inleiding<br />
<strong>Benaderend</strong> <strong>string</strong> <strong>matching</strong><br />
zoeken naar patroon in tekst<br />
gebaseerd op onvolledige of imprecieze<br />
informatie<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.2/28
Inleiding<br />
<strong>Benaderend</strong> <strong>string</strong> <strong>matching</strong><br />
zoeken naar patroon in tekst<br />
gebaseerd op onvolledige of imprecieze<br />
informatie<br />
Voorbeeld 1<br />
zoeken naar woord dat misschien verkeerd<br />
gespeld<br />
zoek gogle met Google<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.2/28
Voorbeeld 2<br />
Unix-commando diff<br />
bepalen in welke mate twee bestanden<br />
verschillen<br />
bepalen wat veranderd is in nieuwe versie<br />
van bestand<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.3/28
Voorbeeld 2<br />
Unix-commando diff<br />
bepalen in welke mate twee bestanden<br />
verschillen<br />
bepalen wat veranderd is in nieuwe versie<br />
van bestand<br />
Editeerafstand<br />
maat van verschil tussen twee bestanden<br />
aantal wijzigingen nodig in ene bestand om<br />
andere bestand te bekomen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.3/28
Editeerafstand<br />
Editeerafstand d(S, T ) tussen <strong>string</strong>s S en T<br />
kleinste aantal editeerbewerkingen nodig om<br />
S in T om te zetten<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.4/28
Editeerafstand<br />
Editeerafstand d(S, T ) tussen <strong>string</strong>s S en T<br />
kleinste aantal editeerbewerkingen nodig om<br />
S in T om te zetten<br />
Toegelaten editeerbewerkingen<br />
vervangen van karakter door een ander<br />
verwijderen van karakter<br />
tussenvoegen van karakter<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.4/28
Voorbeeld<br />
Omzetten van thuis in heup<br />
thuis verwijder t<br />
huis voeg e tussen<br />
heuis verwijder i<br />
heus vervang s door p<br />
heup<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/28
Voorbeeld<br />
Omzetten van thuis in heup<br />
thuis verwijder t<br />
huis voeg e tussen<br />
heuis verwijder i<br />
heus vervang s door p<br />
heup<br />
Kost: 4 bewerkingen<br />
Kleinst mogelijke kost?<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/28
Opmerking<br />
Opmerking<br />
elke <strong>string</strong> S kan in elke andere <strong>string</strong> T<br />
omgezet worden<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/28
Opmerking<br />
Opmerking<br />
elke <strong>string</strong> S kan in elke andere <strong>string</strong> T<br />
omgezet worden<br />
bvb. alle letters van S verwijderen, dan alle<br />
letters van T toevoegen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/28
Opmerking<br />
Opmerking<br />
Dus<br />
elke <strong>string</strong> S kan in elke andere <strong>string</strong> T<br />
omgezet worden<br />
bvb. alle letters van S verwijderen, dan alle<br />
letters van T toevoegen<br />
d(S, T ) ≤ |S| + |T |<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/28
Bepalen van editeerafstand<br />
Via dynamisch programmeren<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.7/28
Bepalen van editeerafstand<br />
Via dynamisch programmeren<br />
Werkwijze: deelproblemen bij berekenen d(S, T )<br />
bepalen afstanden van alle prefixen S en T<br />
d(S[0..i], T [0..j]), voor alle i en j<br />
notatie: di,j<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.7/28
Bepalen van editeerafstand<br />
Via dynamisch programmeren<br />
Werkwijze: deelproblemen bij berekenen d(S, T )<br />
bepalen afstanden van alle prefixen S en T<br />
d(S[0..i], T [0..j]), voor alle i en j<br />
notatie: di,j<br />
Algemeen: bepalen van d(S[0..i], T [0..j])<br />
bekijken einde van beide deel<strong>string</strong>s<br />
hoe kan S[i] tot T [j] worden?<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.7/28
Bepalen van editeerafstand<br />
Via dynamisch programmeren<br />
Werkwijze: deelproblemen bij berekenen d(S, T )<br />
bepalen afstanden van alle prefixen S en T<br />
d(S[0..i], T [0..j]), voor alle i en j<br />
notatie: di,j<br />
Algemeen: bepalen van d(S[0..i], T [0..j])<br />
bekijken einde van beide deel<strong>string</strong>s<br />
hoe kan S[i] tot T [j] worden?<br />
Drie mogelijke situaties<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.7/28
Vervanging<br />
evt. vervangen van S[i] door T [j] en<br />
omzetten van S[0..i − 1] tot T [0..j − 1]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/28
Vervanging<br />
evt. vervangen van S[i] door T [j] en<br />
omzetten van S[0..i − 1] tot T [0..j − 1]<br />
Voorbeelden<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..2] = pre<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/28
Vervanging<br />
evt. vervangen van S[i] door T [j] en<br />
omzetten van S[0..i − 1] tot T [0..j − 1]<br />
Voorbeelden<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..2] = pre<br />
S[0..3] = pese en T [0..4] = prest<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/28
Vervanging<br />
evt. vervangen van S[i] door T [j] en<br />
omzetten van S[0..i − 1] tot T [0..j − 1]<br />
Voorbeelden<br />
Kost<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..2] = pre<br />
S[0..3] = pese en T [0..4] = prest<br />
di−1,j−1 of 1 + di−1,j−1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/28
Verwijdering<br />
verwijderen van S[i] en<br />
omzetten van S[0..i − 1] tot T [0..j]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.9/28
Verwijdering<br />
verwijderen van S[i] en<br />
omzetten van S[0..i − 1] tot T [0..j]<br />
Voorbeelden<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..2] = pre<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.9/28
Verwijdering<br />
verwijderen van S[i] en<br />
omzetten van S[0..i − 1] tot T [0..j]<br />
Voorbeelden<br />
Kost<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..2] = pre<br />
1 + di−1,j<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.9/28
Tussenvoeging<br />
toevoegen van T [j] achter S[0..i] en<br />
omzetten van S[0..i] in T [0..j − 1]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.10/28
Tussenvoeging<br />
toevoegen van T [j] achter S[0..i] en<br />
omzetten van S[0..i] in T [0..j − 1]<br />
Voorbeelden<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..3] = prest<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.10/28
Tussenvoeging<br />
toevoegen van T [j] achter S[0..i] en<br />
omzetten van S[0..i] in T [0..j − 1]<br />
Voorbeelden<br />
Kost<br />
omzetten S = peseta in T = presto<br />
S[0..3] = pese en T [0..3] = prest<br />
1 + di,j−1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.10/28
Berekening di,j<br />
Recursieve formule<br />
⎧<br />
di,j = min<br />
⎪⎨<br />
⎪⎩<br />
di−1,j−1 +<br />
di,j−1 + 1<br />
di−1,j + 1<br />
<br />
0 als S[i] = T [j]<br />
1 anders<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.11/28
Berekening di,j<br />
Recursieve formule<br />
⎧<br />
di,j = min<br />
Merk op<br />
⎪⎨<br />
⎪⎩<br />
di−1,j−1 +<br />
di,j−1 + 1<br />
di−1,j + 1<br />
<br />
0 als S[i] = T [j]<br />
1 anders<br />
berekening van di,j gebruikt waarden van<br />
di−1,j−1, di−1,j en di,j−1<br />
dus rij per rij berekenen, van links naar<br />
rechts: OK<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.11/28
Voorbeeld A<br />
Tabel voor S = presto en T = peseta<br />
0 1 2 3 4 5<br />
p e s e t a<br />
0 p 0 1 2 3 4 5<br />
1 r 1 1 2 3 4 5<br />
2 e 2 1 2 2 3 4<br />
3 s 3 2 1 2 3 4<br />
4 t 4 3 2 2 2 3<br />
5 o 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.12/28
Voorbeeld B<br />
Berekening van d3,2<br />
0 1 2 3 4 5<br />
p e s e t a<br />
0 p 0 1 2 3 4 5<br />
1 r 1 1 2 3 4 5<br />
2 e 2 1 2 2 3 4<br />
3 s 3 2 1 2 3 4<br />
4 t 4 3 2 2 2 3<br />
5 o 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.13/28
Voorbeeld C<br />
Berekening van d5,3<br />
0 1 2 3 4 5<br />
p e s e t a<br />
0 p 0 1 2 3 4 5<br />
1 r 1 1 2 3 4 5<br />
2 e 2 1 2 2 3 4<br />
3 s 3 2 1 2 3 4<br />
4 t 4 3 2 2 2 3<br />
5 o 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.14/28
Eindgevallen<br />
Berekening van d0,0 = d(S[0], T [0])<br />
als S[0] = T [0]: d0,0 = 0<br />
als S[0] = T [0]: d0,0 = 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/28
Eindgevallen<br />
Berekening van d0,0 = d(S[0], T [0])<br />
als S[0] = T [0]: d0,0 = 0<br />
als S[0] = T [0]: d0,0 = 1<br />
Berekening van d0,j = d(S[0], T [0..j])<br />
als S[0] = T [0]: letters van T [1..j] toevoegen<br />
→ d0,j = j<br />
als S[0] = T [0]: S[0] door T [0] vervangen, en<br />
letters van T [1..j] toevoegen<br />
→ d0,j = j + 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/28
Eindgevallen<br />
Berekening van di,0 = d(S[0..i], T [0])<br />
analoog, via verwijderen van letters van S[0..i]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.16/28
Eindgevallen<br />
Berekening van di,0 = d(S[0..i], T [0])<br />
analoog, via verwijderen van letters van S[0..i]<br />
Merk op<br />
gebruiken dezelfde redeneringen als in<br />
recursieve formule, op onzichtbare rij en<br />
kolom −1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.16/28
Eindgevallen<br />
Berekening van di,0 = d(S[0..i], T [0])<br />
analoog, via verwijderen van letters van S[0..i]<br />
Merk op<br />
gebruiken dezelfde redeneringen als in<br />
recursieve formule, op onzichtbare rij en<br />
kolom −1<br />
formulering vereenvoudigen door expliciet rij<br />
en kolom −1 toe te voegen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.16/28
Extra rij en kolom −1<br />
Berekening van d−1,j = d(S[0.. − 1], T [0..j])<br />
d.i. kost omzetten lege <strong>string</strong> in T [0..j]<br />
toevoegen van alle karakters van T [0..j]<br />
dus d−1,j = j + 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.17/28
Extra rij en kolom −1<br />
Berekening van d−1,j = d(S[0.. − 1], T [0..j])<br />
d.i. kost omzetten lege <strong>string</strong> in T [0..j]<br />
toevoegen van alle karakters van T [0..j]<br />
dus d−1,j = j + 1<br />
Berekening van di,−1 = d(S[0..i], T [0.. − 1])<br />
analoog di,−1 = i + 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.17/28
Voorbeeld<br />
Tabel voor S = presto en T = peseta<br />
−1 0 1 2 3 4 5<br />
p e s e t a<br />
−1 0 1 2 3 4 5 6<br />
0 p 1 0 1 2 3 4 5<br />
1 r 2 1 1 2 3 4 5<br />
2 e 3 2 1 2 2 3 4<br />
3 s 4 3 2 1 2 3 4<br />
4 t 5 4 3 2 2 2 3<br />
5 o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.18/28
Algoritme<br />
Input: <strong>string</strong> S lengte m; <strong>string</strong> T lengte n<br />
Output: d(S, T )<br />
1: Stel d[i, −1] ← i + 1, voor −1 ≤ i < m<br />
2: Stel d[−1, j] ← j + 1, voor 0 ≤ j < n<br />
3: for i from 0 to m − 1 do<br />
4: for j from 0 to n − 1 do<br />
5: if S[i] = T [j] then<br />
6: x ← d[i − 1, j − 1]<br />
7: else<br />
8: x ← 1 + d[i − 1, j − 1]<br />
9: d[i, j] ← min(x, 1+d[i, j −1], 1+d[i−1, j])<br />
10: return d[m − 1, n − 1]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.19/28
Reconstrueren van omzetting<br />
Opmerking<br />
tabel geeft ook informatie om goedkoopste<br />
omzetting te reconstrueren<br />
terugkerend van dm−1,n−1 kan bepaald worden<br />
welke van de drie bewerkingen uitgevoerd<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.20/28
Reconstrueren van omzetting<br />
Opmerking<br />
tabel geeft ook informatie om goedkoopste<br />
omzetting te reconstrueren<br />
terugkerend van dm−1,n−1 kan bepaald worden<br />
welke van de drie bewerkingen uitgevoerd<br />
Voorbeeld<br />
bepalen omzetting S = presto in<br />
T = peseta<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.20/28
Voorbeeld A<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.21/28
Voorbeeld A<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ prest omzetten in peset en o vervangen<br />
door a Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.21/28
Voorbeeld B<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/28
Voorbeeld B<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ pres omzetten in pese en t behouden<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/28
Voorbeeld C<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.23/28
Voorbeeld C<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ pres omzetten in pes en e toevoegen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.23/28
Voorbeeld D<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.24/28
Voorbeeld D<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ pre omzetten in pe en s behouden<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.24/28
Voorbeeld E<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.25/28
Voorbeeld E<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ pr omzetten in p en e behouden<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.25/28
Voorbeeld F<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.26/28
Voorbeeld F<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ p omzetten in p en r verwijderen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.26/28
Voorbeeld G<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.27/28
Voorbeeld G<br />
p e s e t a<br />
0 1 2 3 4 5 6<br />
p 1 0 1 2 3 4 5<br />
r 2 1 1 2 3 4 5<br />
e 3 2 1 2 2 3 4<br />
s 4 3 2 1 2 3 4<br />
t 5 4 3 2 2 2 3<br />
o 6 5 4 3 3 3 3<br />
→ p behouden<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.27/28
Voorbeeld<br />
Omzetting S = presto in T = peseta<br />
verwijder r op positie 1<br />
dit levert pesto<br />
voeg e tussen op positie 3<br />
dit levert peseto<br />
wijzig o in a op positie 5<br />
dit levert peseta<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.28/28