Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...
Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...
Algorithmus von Wagner-Fischer zur Bestimmung des minimalen ...
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 />
.