Próbuję wyrównać ciągów w PHP przy użyciu algorytmu odległości Levenshtein. Problem polega na tym, że mój kod śledzenia wstecznego nie działa poprawnie we wszystkich przypadkach. Na przykład, gdy druga tablica wstawiła linie na początku. W takim przypadku śledzenie wstecz będzie przebiegać tak daleko, jak tylko i = 0.Odległość Levenshteina z powrotem śledzenia w PHP
Jak prawidłowo zaimplementować funkcję śledzenia wstecznego dla odległości Levenshtein?
Odległość Levenshteina, $ s i $ t są tablice ciągów (wiersze)
function match_rows($s, $t)
{
$m = count($s);
$n = count($t);
for($i = 0; $i <= $m; $i++) $d[$i][0] = $i;
for($j = 0; $j <= $n; $j++) $d[0][$j] = $j;
for($i = 1; $i <= $m; $i++)
{
for($j = 1; $j <= $n; $j++)
{
if($s[$i-1] == $t[$j-1])
{
$d[$i][$j] = $d[$i-1][$j-1];
}
else
{
$d[$i][$j] = min($d[$i-1][$j], $d[$i][$j-1], $d[$i-1][$j-1]) + 1;
}
}
}
// backtrace
$i = $m;
$j = $n;
while($i > 0 && $j > 0)
{
$min = min($d[$i-1][$j], $d[$i][$j-1], $d[$i-1][$j-1]);
switch($min)
{
// equal or substitution
case($d[$i-1][$j-1]):
if($d[$i][$j] != $d[$i-1][$j-1])
{
// substitution
$sub['i'][] = $i;
$sub['j'][] = $j;
}
$i = $i - 1;
$j = $j - 1;
break;
// insertion
case($d[$i][$j-1]):
$ins[] = $j;
$j = $j - 1;
break;
// deletion
case($d[$i-1][$j]):
$del[] = $i;
$i = $i - 1;
break;
}
}
PHP ma [levenshtein] (http://php.net/manual/en/function.levenshtein.php) dlaczego piszesz swoje ??? – Baba
Odzwierciedlanie matrycy levenshtein jest dla mnie ważne. Nie jestem zainteresowany rzeczywistą wartością odległości edycyjnej. Używam opkodów z macierzy, aby wyrównać pasujące linie dwóch plików tekstowych. Nieco podobne do diff. – mixxu
Aby prawidłowo obliczyć odległość Levenshteina, z powrotem do tyłu, możesz rzucić okiem na ten algorytm: http://www.cs.toronto.edu/~frank/csc401/tutorials/Levenshtein.pdf – eyecatchUp