在C程序中LCS的空间优化解决方案?

在这里,我们将看到一种针对LCS问题的空间优化方法。LCS是最长的公共子序列。如果两个字符串分别是“ BHHUBC”和“ HYUYBZC”,则子序列的长度为4。一种动态编程方法已经在使用它们,但是使用动态编程方法将占用更多空间。我们需要一个顺序为mxn的表,其中m是第一个字符串中的字符数,n是第二个字符串中的字符数。

在这里,我们将看到如何使用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 << "LCS的长度是:" << lcsOptimized(X, Y);
}

输出结果

LCS的长度是:4