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