算法分析与设计实践(作业九):最长公共子序列

本文详细解析了最长公共子序列(LCS)算法,并通过实例演示了如何用不同于教材的数据进行推导。通过两重循环分析,探讨了算法的时间复杂度,并提供了两种实现方式:一种是直接动态规划求解,另一种是借助ans存储输出子序列。最后给出了对应的源码供读者参考。
摘要由CSDN通过智能技术生成

算法分析与设计实践(作业九):最长公共子序列

1. 问题

LCS算法和背包算法,特别要求举例时采用不同于讲义的数据进行推导。
在这里插入图片描述

2. 解析

在这里插入图片描述
在这里插入图片描述
例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 分析

两重循环,故该算法时间复杂度为O(mn)

4. 设计

在这里插入图片描述
3.2实例

X=<A,B,C,B,D,A,B> m=7
Y=<B,D,C,A,B,A> n=6
C[] 初始化
在这里插入图片描述

算法1:

(1)i=1 X.A

j=1 ≠B C[1,1]=max(C[1,0],C[0,1])=max(0,0)=0 删除y

j=2 ≠D C[1,2]=max(C[1,1],C[0,2])=max(0,0)=0 删除y

j=3 ≠C C[1,3]=max(C[1,2],C[0,3])=max(0,0)=0 删除y

j=4 =A C[1,4]=C[0,3]+1=1 删除两个

j=5 ≠B C[1,5]=max(C[1,4],C[0,5])=max(1,0)=1 删除y

j=6 =A C[1,6]=C[0,5]+1=1 删除两个

(2)i=2 X.B

j=1 =B C[2,1]=C[1,0]+1=1 删除两个

j=2 ≠D C[2,2]=max(C[2,1],C[1,2])=max(1,0)=1 删除y

j=3 ≠C C[2,3]=max(C[1,2],C[0,3])=max(0,0)=0 删除y

j=4 ≠A C[2,4]=C[0,3]+1=1 删除两个

j=5 =B C[2,5]=max(C[1,4],C[0,5])=max(1,0)=1 删除y

j=6 ≠A C[2,6]=C[0,5]+1=1 删除两个

(3)i=3 X.C

j=1 ≠B C[3,1]=max(C[3,0],C[2,1])=max(0,1)=1 删除x
j=2 ≠D C[3,2]=max(C[3,1],C[2,2])=max(1,1)=1 删除y
j=3 =C C[3,3]=C[2,2]+1=2 删除两个
j=4 ≠A C[3,4]=max(C[3,3],C[2,4])=max(2,1)=2 删除y
j=5 ≠B C[3,5]=max(C[3,4],C[2,5])=max(2,2)=2 删除y
j=6 ≠A C[3,6]=max(C[3,5],C[2,6])=max(2,2)=2 删除y

(4)i=4 X.B

j=1 =B C[4,1]=C[3,0]+1=1 删除两个
j=2 ≠D C[4,2]=max(C[4,1],C[3,2])=max(1,1)=1 删除y
j=3 ≠C C[4,3]=max(C[4,2],C[3,3])=max(1,2)=2 删除x
j=4 ≠A C[4,4]=max(C[4,3],C[3,4])=max(2,2)=2 删除y
j=5 =B C[4,5]=C[3,4]+1=3 删除两个
j=6 ≠A C[4,6]=max(C[4,5],C[3,6])=max(3,2)=3 删除y

(5)i=5 X.D

j=1 ≠B C[5,1]=max(C[5,0],C[4,1])=max(0,1)=1 删除x
j=2 =D C[5,2]=C[4,1]+1=2 删除两个
j=3 ≠C C[5,3]=max(C[5,2],C[4,3])=max(2,2)=2 删除y
j=4 ≠A C[5,4]=max(C[5,3],C[4,4])=max(2,2)=2 删除y
j=5 ≠B C[5,5]=max(C[5,4],C[4,5])=max(2,3)=3 删除x
j=6 ≠A C[5,6]=max(C[5,5],C[4,6])=max(3,3)=3 删除y

(6)i=6 X.A

j=1 ≠B C[6,1]=max(C[6,0],C[5,1])=max(0,1)=1 删除x
j=2 ≠D C[6,2]=max(C[6,1],C[5,2])=max(1,2)=2 删除x
j=3 ≠C C[6,3]=max(C[6,2],C[5,3])=max(2,2)=2 删除y
j=4 =A C[6,4]=C[5,3]+1=3 删除两个
j=5 ≠B C[6,5]=max(C[6,4],C[5,5])=max(3,3)=3 删除y
j=6 =A C[6,6]=C[5,5]+1=4 删除两个

(7)i=7 X.B

j=1 =B C[7,1]=C[7,0]+1=1 删除两个
j=2 ≠D C[7,2]=max(C[7,1],C[6,2])=max(1,2)=2 删除x
j=3 ≠C C[7,3]=max(C[7,2],C[6,3])=max(2,2)=2 删除y
j=4 ≠A C[7,4]=max(C[7,3],C[6,4])=max(2,3)=3 删除x
j=5 =B C[7,5]=C[6,4]+1=4 删除两个
j=6 ≠A C[7,6]=max(C[7,5],C[6,6])=max(4,4)=4 删除y
得到C[i,j]:B[i,j]表格如下(B[i,j] 1表示删除x;2删除y;3删除两个):

C初始化
算法2:

string ans
用于存储输出的子序列,因为直接输出为逆序,所以借助ans

(1)X=7,Y=6

查表(7,6) 4:2 即删除y

得X=<A,B,C,B,D,A,B>

Y=<B,D,C,A,B>

(2)删除y后X=7,Y=5

查表(7,5) 4:3 即删除两个
得X=<A,B,C,B,D,A>
Y=<B,D,C,A>
ans = B+ ans;

(3)X=6,Y=4

查表(6,4) 3:3 即删除两个
得X=<A,B,C,B,D>
Y=<B,D,C>
ans = A + ans;

(4)X=5,Y=3

查表(5,3) 2:2 即删除y
得X=<A,B,C,B,D>
Y=<B,D>

(5)X=5,Y=2

查表(5,2) 2:3 即删除两个
得X=<A,B,C,B>
Y=< B >
ans = D + ans;

(6)X=4,Y=1

查表(4,1) 1:3 即删除两个
得X=<A,B,C>
Y=<>
ans = B + ans;

算法结束,最终输出ans,即BDAB

5. 源码

源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值