03.06.2014 Aufrufe

Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...

Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...

Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Algorithmus</strong> <strong>von</strong> <strong>Wagner</strong>-<strong>Fischer</strong> <strong>zur</strong> <strong>Bestimmung</strong><br />

<strong>des</strong> <strong>minimalen</strong> Abstands zweier Zeichenketten und<br />

einer optimalen Ausrichtung<br />

/* x[1..n] ist die Ausgangszeichenkette */<br />

/* y[1..m] ist die Zielzeichenkette */<br />

/* d[0..n,0..m] ist die Distanzmatrix */<br />

/* w ist die elementare Abstandsfunktion */<br />

/* Initialisierung */<br />

d[0,0] := 0;<br />

for i := 1 to n do<br />

d[i,0] = d[i-1,0] + w(x[i],-);<br />

for j := 1 to m do<br />

d[0,j] = d[0,j-1] + w(-,y[j]);<br />

/* Berechnung der Abstandsmatrix */<br />

for i := 1 to n do<br />

for j := 1 to m do<br />

d[i,j] := min{ d[i-1,j] + w(x[i],-),<br />

d[i,j-1] + w(-,y[j]),<br />

d[i-1,j-1] + w(x[i],y[j]) };<br />

print "Minimaler Abstand ist d[n,m]"<br />

/* Berechnung einer optimalen Ausrichtung durch */<br />

/* "Rückverfolgen" der Minima <strong>von</strong> d[n,m] bis d[0,0] */<br />

printAlignment(n,m)


* printAlignment berechnet durch Rückverfolgung */<br />

/* eine optimale Ausrichtung für x und y */<br />

/* Damit die Ausrichtung in der richtigen Reihenfolge */<br />

/* ausgegeben werden kann, wird printAlignment rekursiv */<br />

/* verwendet */<br />

procedure printAlignment(i,j)<br />

if<br />

i = 0 and j = 0 return;<br />

if j = 0 then /* i ≠ 0 */<br />

begin<br />

printAlignment(i-1,0);<br />

print (x[i], -);<br />

end;<br />

else if i = 0 then /* j ≠ 0 */<br />

begin<br />

printAlignment(0,j-1);<br />

print (-, y[j]);<br />

end<br />

else /* i ≠ 0 and j ≠ 0 */<br />

begin<br />

if<br />

d[i,j] = d[i-1,j-1] + w(x[i],y[j]) then<br />

begin<br />

printAlignment(i-1,j-1);<br />

print (x[i],y[j]);<br />

end<br />

else if d[i,j] = d[i-1,j] + w(x[i],0) then<br />

begin<br />

printAlignment(i-1,j);<br />

print (x[i],-);<br />

end<br />

else begin<br />

printAlignment(i,j-1);<br />

print (-, y[j]);<br />

end;<br />

end;<br />

end


Beispiel für das <strong>Wagner</strong>-<strong>Fischer</strong> Verfahren<br />

Es sei x = abcabba und y = cbabac.<br />

Die Distanzmatrix ∆ für die Levenshtein–Metrik d L berechnet sich zu:<br />

y c b a b a c<br />

x 0 1 2 3 4 5 6<br />

0 0 1 2 3 4 5 6<br />

a 1 1 1 2 2 3 4 5<br />

b 2 2 2 1 2 2 3 4<br />

c 3 3 2 2 2 3 3 3<br />

a 4 4 3 3 2 3 3 4<br />

b 5 5 4 3 3 2 3 4<br />

b 6 6 5 4 4 3 3 4<br />

a 7 7 6 5 4 4 3 4<br />

Also gilt d L (x, y) = 4.<br />

Die markierten Einträge in der Distanzmatrix zeigen den Verlauf der Rückverfolgung<br />

der Minimumbildung. So ist der Wert d 7,6 entstanden durch d 6,5 + w(a, c) (eine andere<br />

Möglichkeit wäre auch durch d 7,5 + w(−, c)), aber nicht durch d 6,6 + w(a, −). Wie man<br />

an diesem Beispiel sieht muss die Rückverfolgung nicht eindeutig [ sein!<br />

]<br />

a b c a b b a<br />

Eine optimale Ausrichtung wäre in diesem Fall etwa A =<br />

.<br />

c b − a b a c<br />

Die Distanzmatrix ∆ für die Edit–Metrik d E wäre:<br />

y c b a b a c<br />

x 0 1 2 3 4 5 6<br />

0 0 1 2 3 4 5 6<br />

a 1 1 2 3 2 3 4 5<br />

b 2 2 3 2 3 2 3 4<br />

c 3 3 2 3 4 3 4 3<br />

a 4 4 3 4 3 4 3 4<br />

b 5 5 4 3 4 3 4 5<br />

b 6 6 5 4 5 4 5 6<br />

a 7 7 6 5 4 5 4 5<br />

und es gilt d E (x, y) = 5.<br />

Durch die Rückverfolgung erhält man eine optimale Ausrichtung<br />

A =<br />

[<br />

− a b c a b b a −<br />

c − b − a − b a c<br />

]<br />

.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!