Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

CプログラムにおけるLCSのスペース最適化ソリューション?


ここでは、LCS問題に対する1つのスペース最適化アプローチを示します。 LCSは、最長共通部分列です。 2つの文字列が「BHHUBC」と「HYUYBZC」の場合、サブシーケンスの長さは4です。1つの動的計画法アプローチはすでにそれらですが、動的計画法アプローチを使用すると、より多くのスペースが必要になります。次数mxnのテーブルが必要です。ここで、mは最初の文字列の文字数、nは2番目の文字列の文字数です。

ここでは、O(n)個の補助スペースを使用してこのアルゴリズムを実装する方法を説明します。各反復で見られる古いアプローチを観察する場合、前の行のデータが必要です。すべてのデータが必要なわけではありません。したがって、サイズ2nのテーブルを作成すると、問題ありません。アイデアを得るためのアルゴリズムを見てみましょう。

アルゴリズム

lcs_problem(X、Y)-

begin
   m := length of X
   n := length of Y
   define table of size L[2, n+1]
   index is to point 0th or 1st row of the table L.
   for i in range 1 to m, do
      index := index AND 1
      for j in range 0 to n, do
         if i = 0 or j = 0, then
            L[index, j] := 0
         else if X[i - 1] = Y[j - 1], then
            L[index, j] := L[1 – index, j - 1] + 1
         else
            L[index, j] := max of L[1 – index, j] and L[index, j-1]
         end if
      done
   done
   return L[index, n]
end

#include <iostream>
using namespace std;
int lcsOptimized(string &X, string &Y) {
   int m = X.length(), n = Y.length();
   int L[2][n + 1];
   bool index;
   for (int i = 0; i <= m; i++) {
      index = i & 1;
      for (int j = 0; j <= n; j++) {
         if (i == 0 || j == 0)
            L[index][j] = 0;
         else if (X[i-1] == Y[j-1])
            L[index][j] = L[1 - index][j - 1] + 1;
         else
            L[index][j] = max(L[1 - index][j], L[index][j - 1]);
      }
   }
   return L[index][n];
}
int main() {
   string X = "BHHUBC";
   string Y = "HYUYBZC";
   cout << "Length of LCS is :" << lcsOptimized(X, Y);
}

出力

Length of LCS is :4

  1. 配列の左回転をCプログラムのO(n)時間とO(1)空間で出力します。

    いくつかのサイズnと複数の整数値の配列が与えられているので、与えられたインデックスkから配列を回転させる必要があります。 -のようなインデックスkから配列を回転させたい 例 Input: arr[] = {1, 2, 3, 4, 5}    K1 = 1    K2 = 3    K3 = 6 Output:    2 3 4 5 1    4 5 1 2 3    2 3 4 5 1 アルゴリズム START Step 1 -> Declare functio

  2. Cプログラムで余分なスペースや変更を加えずに、リンクリストの裏面を印刷します。

    タスクは、余分なスペースを使用せずにリンクリストの最後からノードを印刷することです。つまり、余分な変数はなく、最初のノードを指すヘッドポインターが移動します。 例 Input: 10 21 33 42 89 Output: 89 42 33 21 10 再帰的アプローチ(余分なスペースを使用)、リンクリストの反転(指定されたリンクリストの変更が必要)、スタック上の要素のプッシュ、要素のポップと表示など、リンクリストを逆の順序で印刷するソリューションは多数あります。 1つずつ(スペースO(n)が必要)、これらのソリューションはO(1)よりも多くのスペースを使用しているようです。 O(