Skip to main content
QUICK REVIEW

[论文解读] Computing the Number of Longest Common Subsequences

Ronald I. Greenberg|ArXiv.org|Jan 29, 2003
Algorithms and Data Compression参考文献 8被引用 5
一句话总结

本文提出了一种时间复杂度为 O(mn)、空间复杂度为 O(m) 的优化动态规划算法,用于计算两个字符串之间不同的最长公共子序列(LCS)的数量以及 LCS 的嵌入数量。该方法通过使用自底向上的递推关系并追踪路径重建过程中的计数,简化了先前的方法,实现了无需显式存储所有解的高效枚举。

ABSTRACT

This note provides very simple, efficient algorithms for computing the number of distinct longest common subsequences of two input strings and for computing the number of LCS embeddings.

研究动机与目标

  • 开发一种简单且高效的算法,用于计算两个字符串之间不同最长公共子序列(LCS)的数量。
  • 将该方法扩展至计算 LCS 嵌入数量——即一个 LCS 在输入字符串中的不同位置映射数量。
  • 在保持 O(mn) 时间复杂度的同时,将空间复杂度降低至 O(m)。
  • 通过消除冗余计算和存储,简化现有的 LCS 计数动态规划方案。

提出的方法

  • 使用动态规划表 L[i,j] 计算前缀 A[1..i] 和 B[1..j] 的 LCS 长度,遵循标准递推规则。
  • 维护第二个表 D[i,j] 或 E[i],分别用于计数不同的 LCS 或 LCS 嵌入,通过聚合来自先前状态的有效路径实现。
  • 应用递推规则,仅在顶部(L[i-1,j])和左侧(L[i,j-1])贡献于相同 LCS 长度时才累加其计数,并在必要时减去重叠部分。
  • 通过仅存储 DP 表的当前列和前一列来优化空间,将内存使用减少至 O(m)。
  • 使用临时变量(newL、newE、oldL、oldE)以滚动方式迭代更新值,避免存储完整数组。
  • 通过在更新步骤中调整条件判断,略微修改逻辑,以在计数不同 LCS 和计数嵌入之间切换。

实验结果

研究问题

  • RQ1是否可以比枚举所有可能的 LCS 更高效地计算不同最长公共子序列的数量?
  • RQ2计算 LCS 嵌入数量所需的最小空间复杂度是多少?
  • RQ3如何简化动态规划递推关系,以在统一且空间高效的框架下同时计数不同的 LCS 和嵌入?
  • RQ4是否可能在不显式生成所有嵌入的情况下计算 LCS 嵘入的数量?

主要发现

  • 该算法以 O(mn) 时间和 O(m) 空间计算不同 LCS 的数量,时间复杂度与标准 LCS 长度计算一致。
  • 相同的框架可高效计算 LCS 嵌入数量,且时间与空间复杂度保持一致。
  • 通过仅维护两列,避免存储完整的 DP 表,显著降低了内存使用。
  • 不同 LCS 的计数通过仅在前驱节点(上方和左侧)产生相同 LCS 长度时累加其贡献,并通过减法校正重叠部分实现。
  • 该算法正确处理了空字符串等边界情况,此时计数恒为 1(即空子序列)。
  • 与先前需要存储所有解或使用更复杂数据结构的方法相比,该方法更加简洁且高效。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。