سؤال

أنا الترميز لس (أطول اللاحقة المشتركة) في برنامج فب باستخدام نهج العودية.لدي الكود التالي:

<?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];
}

لطباعة خطابات الاعتماد ، أدعو الدالة التالية:

$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 );
    }
}
?> 

يحسب هذا الرمز إجمالي طول خطابات الاعتماد بشكل صحيح ولكنه يعطي " إشعار:إزاحة غير محددة:-1 " على كل مكالمة من هذا الخط في وظيفة الطباعة echo $x[$i-1]; ولا يطبع شيئا.لقد حاولت كل شيء تقريبا لتقسيم سلسلة من str ستر 1 ومن ثم تمريرها إلى وظيفة ، ولكن لا شيء يعمل.لا تطبع سلسلة خطابات الاعتماد لأن هناك خطأ ما في هذا السطر من التعليمات البرمجية echo $x[$i-1]; التي أنا غير قادر على الحصول عليها.الرجاء المساعدة.

ملاحظة:تم أخذ الرمز الكاذب للرمز أعلاه من كتاب توماس هـ.كورمن ، "مقدمة في الخوارزميات الطبعة 3".أنا أكتب ذلك في فب بقصد توسيعه بحيث يمكن طباعة خطابات الاعتماد من أكثر من سلسلتين.سوف نقدر إذا كان أي شخص يشارك فكرة كيف يمكنني تمديد هذا الرمز بحيث يمكن طباعة لس من مجموعة مع سلاسل متعددة مثل array صفيف {'سساد'، 'أسداو'، 'أسد'،...ن}.في وقت لاحق ، أنوي تحويل البرنامج بأكمله إلى ماتلاب.

هل كانت مفيدة؟

المحلول 2

لقد حللت الخطأ:لقد وضعت صدى x س [i ط-1];قبل lcs_print( $B, $x, $i = $i-1, $j = $j-1 );في وظيفة لك_برينت ، كل شيء يعمل بشكل جيد الآن.

نصائح أخرى

هناك مشاكل في الطول الخاص بك
1.إذا ($s1[$i-1]==$s2[$j-1]) ، كان ينبغي أن يكون إذا ($s1[$i]==$s2[$j])
2.شرط الحدود الخاص بك(j ي = 0;$j < n ن) غير واضح ، تحتاج إلى تضمين هذا العلوي وأنت تحاول طباعته استدعاء هذا لكسبرينت (back التراجع ، str ستري1 ، len لين1 ، len لين2).كان ينبغي أن يكون (j ي = 0 ؛ j ي<= ن ؛ j ي j)

أعتقد أن هذه التغييرات ستحل المشكلة.أنا لم تفعل الترميز في فب لذلك لا يمكن أن أقول عن بناء الجملة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top