迅速理解 LCS 最长公共子序列问题

news/2025/3/13 0:47:27/文章来源:https://www.cnblogs.com/ofnoname/p/18768981

在算法与数据结构的经典问题中,最长公共子序列(Longest Common Subsequence,简称 LCS)问题占据着重要的地位。给定两个序列,我们需要找到它们最长的公共子序列,而子序列要求保持原序列元素的顺序但不需要连续。LCS 问题在文本比较、生物信息学中的基因序列比对等领域有着广泛的应用。

例如,对于序列 X = "ABCBDAB" 和序列 Y = "BDCABB",它们的最长公共子序列为 "BCAB",长度为4。

LCS 的标准解法可以通过动态规划在相对高效的时间内解决,但在某些特殊情境下,我们可以通过巧妙的转化进一步优化其效率,尤其当其中一个序列中元素不重复时。

动态规划

动态规划是解决 LCS 问题的标准方法。设序列 $ X $ 和序列 $ Y $ 的长度分别为 $ m $ 和 $ n $。我们定义二维数组 $ dp[i][j] $ 为 $ X $ 的前 $ i $ 个元素和 $ Y $ 的前 $ j $ 个元素的最长公共子序列长度,则状态转移方程为:

  • 若 $ X[i-1] = Y[j-1] $,则 $ dp[i][j] = dp[i-1][j-1] + 1 $;
  • 还可从之前状态取,$ dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) $。

每一个 $ dp[i][j] $ 都可直接得出,时间复杂度 \(O(mn)\)

每一个 $ dp[i][j] $ 仅由 $ dp[i-1]$ 推出,通过滚动数组或交替数组的技巧,将空间复杂度降低至 $ O(\min(m,n)) $。具体实现时,仅维护当前和上一行(或列)的信息即可。

代码略。

无重复元素的 LCS 问题

当问题中有额外的限制条件时,我们常能发现优化的可能性。具体而言,当序列 $ X $ 中的元素是唯一的,即每个元素至多出现一次时,LCS 问题可转化为最长递增子序列(Longest Increasing Subsequence,简称 LIS)问题,从而实现高效求解。

具体转化过程为:

  1. 建立序列 $ Y $ 中元素到其索引位置的映射;
  2. 用序列 $ X $ 中的元素依次检查该元素是否存在于 $ Y $ 中,若存在,则用其在 $ Y $ 中的位置替代;
  3. 形成新的序列 $ Z $,序列 $ Z $ 中的每个元素均为序列 $ Y $ 中的索引位置。

转化后问题变为寻找序列 $ Z $ 的 LIS。该转化之所以成立,其正确性源于如下两个核心事实:

  • 保序性:原LCS要求序列顺序匹配,这与转化后的序列 $ Z $ 中元素位置索引的严格递增特性一致。
  • 唯一性保证映射的单射性:由于序列 $ X $ 中出现,一定只能出现在唯一的位置, 中元素的唯一性,映射过程中不会出现元素位置的歧义,确保新序列 $ Z $ 能够精确代表 $ X $ 和 $ Y $ 的顺序关系。

由于 $ Y $ 中元素,若在 $ X $ 中出现,一定只能出现在唯一的位置,所以可以把 $ Y $ 转化为索引,求“索引的递增序列”,一个递增的索引序列就代表一个公共子序列。

因此,此转化将原本朴素的 LCS 问题优化为 $ O(m \log m) $ 的 LIS 问题,使得在特定场景下的算法效率大大提高。LIS 的代码实现可以参考往期文章。

int main() {int n;cin >> n;vector<int> a(n), tail;unordered_map<int, int> mp;mp.reserve(n);for (int i = 0; i < n; i++) {Cin >> a[i];mp[a[i]] = i;}for (int i = 0; i < n; i++) {int x;Cin >> x;if (!mp.count(x)) continue;x = mp[x];auto it = lower_bound(tail.begin(), tail.end(), x);if (it == tail.end()) {tail.push_back(x);} else {*it = x;}} printf("%d\n", tail.size());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 icon使用

icon使用:https://cn.element-plus.org/zh-CN/component/icon.html 1.安装icon2.配置main.js点击查看代码 import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.cssimport App from ./App.vue import router from ./routerim…

第一周实验:已有程序二次开发

一. 来源 代码来源于室友大一期末大作业。该程序模拟实现了一个简易的图书管理系统,功能有用户注册登录,查询,购买书籍,管理员对书籍的增删改查功能。 二.程序原来的代码及运行结果 运行环境:Windows 11 + Visual Studio 2022点击查看代码 #include<iostream> #incl…

知识点系列——基础数据结构

1.1 链表 洛谷-P1996 约瑟夫问题我就直接模拟void solve() {cin>>n>>k;int id=0;for(int i=1;i<=n;i++){int p=0;while(p<k){bool f=false;while(vis[id]){id++;f=1;if(id>n)id=1;}if(!f){id++;if(id>n)id=1;while(vis[id]){id++;if(id>n)id=1;}}p+…

Laravel11 从0开发 Swoole-Reverb 扩展包(七) - 发布laravel-swoole-reverb

开篇 这一篇,我做了过度,因为正好也完成第一个版本的laravel swoole reverb服务。因此,先做个🧐,我们后面还会继续分享整个实现流程。 关于laravel-swoole-reverb laravel-swoole-reverb是一个将 Swoole 与 Laravel Reverb 集成的包,采用php8.2版本编写,可用于高性能的…

TinyWebServer全解

项目地址 原理合集 把链接都放在这里,可以一次看个爽 epoll main 首先是main函数: #include "config.h"int main(int argc, char *argv[]) {//需要修改的数据库信息,登录名,密码,库名string user = "ct";string passwd = "123456";string data…

推送数据解决

自动批量提交的介绍 在线URL链接自动批量提交工具介绍链接提交工具是网站主动向百度搜索推送数据的工具,本工具可缩短爬虫发现网站链接时间,网站时效性内容建议使用链接提交工具,实时向搜索推送数据。本工具可加快爬虫抓取速度,无法解决网站内容是否收录问题URL链接自动批量…

常用的base.css文件

一、常用的base.css文件(也是比较简略的,但按需增加)body,ul,li,ol,dl,dd,h1,h2,h3,h4,h5,h6,input,p{ margin:0;} ul,ol { padding:0;} img { border:none;} .clear{zoom:1;} .clear:after{display:block; content:"";clear:both; visibility:hidden; height:0;}…

Easysearch 磁盘水位线注意事项

Easyearch 为了防止索引将磁盘空间完全占满,使用磁盘水位线进行磁盘空间控制。具体来说有三条磁盘水位线:low、high、flood。 低水位线 通过参数 cluster.routing.allocation.disk.watermark.low 进行设置,默认值 85%。也可设置成一个具体值,比如:400mb,代表须保留 400mb…

最好的百度提交每日自动提交工具【免费】

原文链接 JavaGuide最好的百度提交每日自动提交工具【免费】github https://github.com/nogeek-cn/baidu-seo-auto-push-dailygitee https://gitee.com/nogeek-cn/baidu-seo-auto-push-daily本工具比别的工具好的地方【免费:你只需要在你的网站中添加我的网站友链,我就可以帮…

定义了一个实现了toDo()抽象方法

定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 结构 策略模式的主要角色…

《AI帮你赢:人人都能用的AI方法论》 PDF免费下载

本书强调“把 AI作为方法”(AI即 Artifcial Intelligence,人工智能)这一核心理念,旨在引导读者掌握与 AI对话的关键技巧,并将AI融入工作和生活真正体验 AI带给人类的高效与便捷。 本书适合对 AI有研究兴趣、有使用需求、有产品研发需求或有投资意向的读者阅读。读者可扫描文…