求最长公共子序列长度(nlogn)【 包含了求最长上升子序列长度(nlogn)】

这里只说步骤吧,至于原理,可以自己百度找找;

假设两个序列   A,B,找两者的最长公共子序列;

第一步: 我们要去找出 A中所有与 B 相同的元素,这些元素在 B中的位置,各自为一个集合;比如 A = { a c f  d }  ,B = { c f g c a } , 则有  (从 i = 1 开始 )a ={ 5 } , c = { 1 ,4  } , f = { 2 }; a 这个元素对应B的第 5 个位置,c 对应B 第1 个和第 4 个位置,以此类推;

第二步: 如果元素对应B位置的集合的数字有多个,要给集合从高到低排好序,比如 c = { 4 ,1 } (排完序后)

第三步: 用这些元素的集合,替换序列 A , A 中 a这个元素换成 (5),c这个元素换成 (4,1),f这个元素换成(2),d没有对应的集合,去掉,最后得出的序列是  A = 5 4 1 2 ;

第四步: 求A = 5412 的最长上升子序列的长度,如果这里的求最长上升子序列长度的算法仍然用 复杂度为(n*n)的话,那这个求最长公共子序列长度的方法就没意义了,这里用求最长上升子序列长度(nlogn) 的方法求解,得出的长度就是最长公共子序列的长度;

上面就是全部的求解步骤;

这里也顺便把 nlogn的求最长上升子序列长度的方法说一下;

除了放要求解的序列的数组外,还需要准备另一个数组去放一条递增的序列,并时刻记录长度;

我们假设有一个数组  a  ={ 1 3 4 2 7 6 8 } ,求这个数组的最长上升子序列的长度 ,另外有一个 b[ ] 的空数组,一个记录 b数组长度的变量  p = 0; 先放a 中的第一个元素 1 到b数组里面, 然后从 i = 1 开始(数组从 0 开始遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值