当前位置: 首页 > news >正文

最长公共子序列(LCS)问题——动态规划法

最长公共子序列问题

  • 问题描述
  • 动态规划法
    • 划分子问题: 找出最优解的性质,并刻划其结构特征;
    • 递归式推导:递归地定义最优解的值,找出最优解的递归式;
    • 计算最优值:按自底向上的方式计算最优解的值。
    • 构造最优解:由计算出的结果构造一个最优解。
  • 例子

问题描述

给定序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,,xm ,序列 𝑍 = 𝑧 1 , 𝑧 2 , … , 𝑧 𝑘 𝑍 = {𝑧_1, 𝑧_2, … , 𝑧_𝑘} Z=z1,z2,,zk是𝑋的子序列,是指:存在一个严格递增下标序列 𝑖 1 , 𝑖 2 , … , 𝑖 𝑘 {𝑖_1, 𝑖_2, … , 𝑖_𝑘} i1,i2,,ik,使得对于所有 j = 1 , 2 , … , k j=1,2,…,k j=1,2,,k 𝑧 𝑗 = 𝑥 i j 𝑧_𝑗 = 𝑥_{i_j} zj=xij

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的
公共子序列

给定2个序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,,xm 𝑌 = 𝑦 1 , 𝑦 2 , … , 𝑦 𝑛 𝑌 = {𝑦_1, 𝑦_2, … , 𝑦_𝑛} Y=y1,y2,,yn,找出𝑋和𝑌的最大长度公共子序列。

动态规划法

划分子问题: 找出最优解的性质,并刻划其结构特征;

设序列 X = ( x 1 , x 2 , … , x m ) X = (x_1, x_2, \ldots, x_m) X=(x1,x2,,xm) Y = ( y 1 , y 2 , … , y n ) Y = (y_1, y_2, \ldots, y_n) Y=(y1,y2,,yn) Z = ( z 1 , z 2 , … , z k ) Z = (z_1, z_2, \ldots, z_k) Z=(z1,z2,,zk)是 X 和 Y 的任意一个 LCS,则:

(1) 若 x m = y n x_m = y_n xm=yn,则 (z_k = x_m = y_n) 且 z k − 1 z_{k-1} zk1 X m − 1 X_{m-1} Xm1 Y n − 1 Y_{n-1} Yn1 的一个 LCS;

(2) 若 x m ≠ y n x_m \neq y_n xm=yn z k ≠ x m z_k \neq x_m zk=xm,则 Z 是 X m − 1 X_{m-1} Xm1 和 Y 的一个 LCS;

(3) 若 x m ≠ y n x_m \neq y_n xm=yn z k ≠ y n z_k \neq y_n zk=yn,则 Z 是 X 和 Y n − 1 Y_{n-1} Yn1 的一个 LCS。

最长公共子序列问题具有最优子结构性质。

递归式推导:递归地定义最优解的值,找出最优解的递归式;

请添加图片描述

计算最优值:按自底向上的方式计算最优解的值。

请添加图片描述

构造最优解:由计算出的结果构造一个最优解。

数据结构设计:

  • c[m][n] 存放最优解值,计算时行优先
  • b[m][n] 为解矩阵,存放构造最优解信息请添加图片描述
    当构造解时,从𝑏[𝑚, 𝑛]出发,上溯至𝑖 = 0或者𝑗 = 0止。
    上溯过程中,当𝑏[𝑖,𝑗]包含“ ↖ ”时打印出 𝑥 𝑖 ( 𝑦 𝑗 ) 𝑥_𝑖(𝑦_𝑗) xi(yj)

请添加图片描述
说明:

  1. 每当在表项𝑏[𝑖,𝑗]中遇到一个“ ↖ ”时,即意味着 𝑥 𝑖 = 𝑦 𝑗 𝑥_𝑖 = 𝑦_𝑗 xi=yj是LCS的一个元素;
  2. 时间复杂度:𝜃(𝑚 + 𝑛)

例子

若X = <A, B, C, B, D, A, B> ,Y=<B, D, C, A, B, A>,则

请添加图片描述
最优解为BCAB 或 BCBA

相关文章:

  • 动静态库的制作
  • MYSQL备份恢复知识:第六章:恢复原理
  • 排查Oracle文件打开数过多
  • 万字详解RTR RTSP SDP RTCP
  • 内网穿透系列五:自建SSH隧道实现内网穿透与端口转发,Docker快速部署
  • es6 函数解构
  • 不打架的协议互通,modbus转profibus网关的总线的高效互通方案
  • 通用大数据可视化展示平台模板 – 免费HTML源码
  • 解锁 AI 开发新境界:OPE Pod 开放平台深度解析
  • 云服务器系统盘满了,但是其他正常,是否可能是被攻击了
  • BSS / OSS 是什么
  • 软件测试环境搭建及测试过程
  • 软件测试的潜力与挑战:从“质量守门员”到“工程效能催化剂”的进化
  • [Vue组件]半环进度显示器
  • 三十一、面向对象底层逻辑-SpringMVC九大组件之RequestToViewNameTranslator接口设计哲学
  • pycharm找不到高版本conda问题
  • window 显示驱动开发-处理 E_INVALIDARG 返回值
  • Vert.x学习笔记-什么是Context
  • Django数据库连接报错 django.db.utils.NotSupportedError: MySQL 8 or later is required
  • 系统思考:心智模式与业务创新
  • 右键网站 选择添加ftp站点/域名查询万网
  • 以中文做域名的网站/网络优化工作应该怎么做
  • 宠物商店的网站开发论文/网络游戏推广员
  • 网站宣传软文/推广营销大的公司
  • 深圳做网站哪个好/百度热搜关键词排名
  • 做片视频在线观看网站/上海关键词排名手机优化软件