Enfrentando erro na função LCS em php
-
20-12-2019 - |
Pergunta
Estou codificando LCS (maior subsequência comum) no programa php usando abordagem recursiva.Eu tenho o seguinte código:
<?php
$lcsTbl = array(array(128),array(128));
$backTracks = array(array(128),array(128));
$str1 = 'asdvadsdad';
$str2 = 'asdasdadasda';
$len1 = strlen($str1);
$len2 = strlen($str2);
echo LCS_Length($lcsTbl, $backTracks, $str1, $str2, $len1, $len2); //longest common sub sequence
echo '<br/>';
function LCS_Length(&$LCS_Length_Table, &$B, &$s1, &$s2, &$m, &$n)
{
//reset the 2 cols in the table
for($i=1; $i < $m; $i++) $LCS_Length_Table[$i][0]=0;
for($j=0; $j < $n; $j++) $LCS_Length_Table[0][$j]=0;
for ($i=1; $i <= $m; $i++) {
for ($j=1; $j <= $n; $j++) {
if ($s1[$i-1]==$s2[$j-1])
{ $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j-1] + 1; $B[$i][$j] = '\\';}
else if ($LCS_Length_Table[$i-1][$j] >= $LCS_Length_Table[$i][$j-1])
{ $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j]; $B[$i][$j] = '|';}
else
{ $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i][$j-1]; $B[$i][$j] = '-';}
}
}
return $LCS_Length_Table[$m][$n];
}
Para imprimir o LCS, chamo a seguinte função:
$x = str_split($str1);
echo lcs_print($backTracks, $str1, $len1, $len2); //print longest common sub sequence
function lcs_print(&$B, &$x, &$i, &$j)
{
if( $i == 0 || $j == 0 )
return;
if( $B[$i][$j] == '\\' ) {
echo $x[$i-1];
lcs_print( $B, $x, $i = $i-1, $j = $j-1 );
} else if( $B[$i][$j] == '|' ) {
lcs_print( $B, $x, $i = $i-1, $j );
} else {
lcs_print( $B, $x, $i, $j = $j-1 );
}
}
?>
Este código conta o comprimento total do LCS corretamente, mas fornece "Aviso:Deslocamento indefinido:-1" em cada chamada desta linha na função de impressão echo $x[$i-1];
e não imprime nada.Eu tentei quase tudo para dividir a string de $str1 e depois passá-la para funcionar, mas nada funciona.Ele não imprime a string LCS porque algo está errado com esta linha de código echo $x[$i-1];
que não consigo obter.Por favor ajude.
Observação:O pseudocódigo do código acima foi retirado do livro de Thomas H.Cormen, "Introdução aos Algoritmos 3ª Edição".Estou escrevendo em PHP com a intenção de estendê-lo para que possa imprimir LCS de mais de duas strings.Agradecerei se alguém compartilhar a ideia de como posso estender este código para que ele possa imprimir LCS de um array com várias strings como $array{'sdsad','asddaw','asd',...n}.Posteriormente, pretendo converter todo o programa em MATLAB.
Solução 2
Eu resolvi o erro:Coloquei echo $x[$i-1];antes de lcs_print($B, $x, $i = $i-1, $j = $j-1 );na função lcs_print, tudo está funcionando bem agora.
Outras dicas
Existem problemas no seu LCS_length
1.if ($s1[$i-1]==$s2[$j-1]) , deveria ter sido if ($s1[$i]==$s2[$j])
2.sua condição de contorno ($j=0;$j < $n) não está claro, você precisa incluir este limite superior
e você está tentando imprimi-lo chamando isso de lcs_print($backTracks, $str 1, $len 1, $len 2).Deveria ter sido ($j=0;$j<=n;$j++)
Acho que essas mudanças resolverão o problema.Não fiz codificação em PHP, então não posso falar sobre as sintaxes.