算法导论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]这种事不用特地说明吧?

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

你可能感兴趣的:(Notes)