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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top