Skip to main content
QUICK REVIEW

[论文解读] Fast and Simple Computation of All Longest Common Subsequences

Ronald I. Greenberg|arXiv (Cornell University)|Nov 1, 2002
Algorithms and Data Compression参考文献 19被引用 5
一句话总结

本文提出一种简单的 O(mn) 算法,用于构建一个所有前缀的LCS图(all-prefixes-LCSs-graph),从而实现对任意输入序列对的所有最长公共子序列(LCS)嵌入的高效枚举。通过利用动态规划和基于轮廓的链表结构,该方法在经过线性时间预处理后,能够以与输出大小成比例的时间生成所有不同的LCS或所有嵌入。

ABSTRACT

This paper shows that a simple algorithm produces the {\em all-prefixes-LCSs-graph} in $O(mn)$ time for two input sequences of size $m$ and $n$. Given any prefix $p$ of the first input sequence and any prefix $q$ of the second input sequence, all longest common subsequences (LCSs) of $p$ and $q$ can be generated in time proportional to the output size, once the all-prefixes-LCSs-graph has been constructed. The problem can be solved in the context of generating all the distinct character strings that represent an LCS or in the context of generating all ways of embedding an LCS in the two input strings.

研究动机与目标

  • 解决高效枚举两个输入序列之间所有不同最长公共子序列(LCS)字符串及其嵌入的挑战。
  • 克服朴素回溯方法效率低下、产生重复项且需后续去重处理的缺点。
  • 设计一种数据结构——所有前缀的LCS图(all-prefixes-LCSs-graph),以支持对任意前缀对的LCS和嵌入的快速、输出敏感型枚举。
  • 提供一个统一框架,同时处理不同的LCS字符串和每个LCS的多个嵌入,且开销最小。
  • 实现预处理时间复杂度为 O(mn),枚举时间与输出成比例的最优时间复杂度,优于现有方法。

提出的方法

  • 使用标准递推关系构建动态规划表 L[i,j]:若 a_i = b_j,则 L[i,j] = L[i-1,j-1]+1;否则 L[i,j] = max(L[i-1,j], L[i,j-1])。
  • 构建所有前缀的LCS图,其中每个单元格 [i,j] 维护一个链表(头指针、尾指针、前驱尾指针),用于存储具有相同秩(L[i,j])且索引更早或相等的匹配。
  • 采用基于轮廓的遍历方式:将匹配按秩分组,并通过之字形轮廓连接,以保持顺序并避免重复。
  • 应用两阶段合并:对于每个 [i,j],仅当来自 [i-1,j] 和 [i,j-1] 的邻接链表秩与 L[i,j] 相同时才进行合并,确保无重复嵌入。
  • 通过强制执行反支配性(antidominance)和支配性(dominance)条件,消除冗余路径,确保每个LCS嵌入仅被生成一次。
  • 使用自引用指针和链表指针(头、尾、前驱尾)高效维护和更新动态规划遍历过程中的邻接链表。

实验结果

研究问题

  • RQ1是否存在一种简单且高效的算法,能够在不生成重复项的情况下计算所有不同的LCS字符串及其嵌入?
  • RQ2是否可以构建一种数据结构,实现在 O(mn) 预处理时间内,对任意前缀对支持LCS和嵌入的输出敏感型枚举?
  • RQ3如何扩展标准LCS动态规划表,以支持所有嵌入的枚举,同时避免指数级膨胀?
  • RQ4哪些匹配的结构特性(如支配性、轮廓)可以被利用以最小化冗余路径的生成?
  • RQ5是否可以在经过线性时间预处理后,以与输出大小成比例的时间实现所有LCS嵌入的枚举?

主要发现

  • 所有前缀的LCS图可通过使用链表扩展的简单动态规划方法在 O(mn) 时间内构建。
  • 图构建完成后,对于任意前缀对 A_i 和 B_j,所有不同的LCS或其所有嵌入均可在与输出大小成比例的时间内枚举。
  • 通过在邻接链表构建过程中强制执行反支配性和支配性条件,该算法避免了重复枚举。
  • 该方法同时支持不同LCS字符串的生成以及这些字符串所有嵌入的枚举,无需后续去重处理。
  • 提供了C语言实现,其输出与朴素回溯方法加去重后的结果完全一致,验证了正确性。
  • 基于轮廓的链接和 pretail 指针的使用,确保邻接链表中仅保留相关且非冗余的路径。

更好的研究,从现在开始

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

无需绑定信用卡

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