03.07.2013 Views

Benaderend string matching

Benaderend string matching

Benaderend string matching

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!