算法导论15.4-6题:O(nlgn)时间复杂度的算法求最长递增子序列

首先对题目的提示进行说明:

一个长度为i的子序列的尾元素至少不比一个长度为i-1的候选子序列的尾又元素小,这里的“一个”不是任一个,而是存在至少一个

英文原版也说得不是很清楚:

The last element of a candidate subseuqence of length i is at least as large as the last element of a candidate subseuqence of length i-1。粗体是指存在一个这样的i-1长度子串,不是anyone而是someone,我就是纠结了好久没明白……

对于这部分内容,参考博客:最长递增子序列的三种算法中的第三种,有很好的说明,并求到了最长子序列的长度,本文是基于此对进一步求出子序列的简单说明。

得到“长度为i的递增子序列的最小尾元素B[i]”的数组B后,基于此“在输入序列中将候选子序列链接起来”的做法是:从输入序列最后开始逆序查找,取大于或等于B[i]的数作为目标序列的第i位,可知输入序列往前的部分必定含有长度为i-1的递增子序列(回顾题目的提示,并确定了引用博客最后将B[4]从8更新到7的必要性。

引用原博客的举例:

原数组A=[2,1 ,5 ,3 ,6,4, 8 ,9, 7],

“长度为i的递增子序列的最小尾元素B[i]”的数组B=[1,3,4,7,9],

(再强调一下,注意B[4]=7的那一步是为什么!为了保证The last element of a candidate subseuqence of length i is at least as large as the last element of a candidate subseuqence of length i-1!

逆推目标,最长(例子中为5)递增子序列C:C[5] >=9 —>9;C[4] >=7 —>8;C[3] >=4 —>4(或6);C[2] >=3 —>3;C[1] >=1 —>1(或2)。(当然,C[4] < C[5]这种事不用特地说明吧?

我对题目的理解就是这样子,明天可以愉快地交作业了哈哈哈。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值