首页 技术 正文
技术 2022年11月8日
0 收藏 969 点赞 1,513 浏览 1290 个字

LIS(Longest Increasing Subsequence)是一类典型的动态规划类问题,简化描述如下:

给定$N(n) = \{1,2…,n\}$的一个排列$P(n)$,求$P(n)$中最长上升子列的长度。

譬如令$n = 6$, $N(6) = \{1,2,3,4,5,6\}$,$P(n) = \{1,4,2,5,3,6\}$。

容易发现$LIS(P(n)) = \{1,2,3,6\} or \{1,4,5,6\}…$。

起初我们拿到问题的思路是这样的,我们试着先分析序列的前缀,考虑P(n)中前k项的LIS,即试图分析$LIS(P(k)), k <= n$,

记$P(n) = A$,考虑由$k->k+1$的递推,若$A(k+1) > A(k)$,我们显然有$LIS(P(k+1)) = 1 + LIS(P(k))$,但若$A(k+1) < A(k)$,

则有$A(k+1) = max{LIS(P(i))} + 1, (A(i) < A(k+1), i <= k)$,那么这样做的复杂度为$O(n)$,求$LIS(P(n))$的复杂度为$O(n^2)$。

能不能更快点呢,我们的计算是否有冗余呢?我们知道答案是肯定的。

比如我们在检查到A(k)项时希望知道所有已经检查过的项对应的LIS的最大值,这样我们取其值加一即可得$LIS(P(k))$。

我们试图维护这样的一个数据结构,以线段树为例,我们构建一颗覆盖区间$[1…n]$的线段树,所有叶子结点value值初始化为$-∞$。

假设在检查$A(k)$之间线段树上储存了之前所有已访问过的项计算LIS时的信息,那么在计算$LIS(P(k))$时,我们取$[1,…A(k) – 1]$区间的最大值,

那么有区间内未访问项的值仍未$-∞$,已访问项的最大值即为所取,我们将其加一得到$LIS(P(k))$,为了维护该结构,将叶子结点A(k)对应的值更新为$LIS(P(k))$,

每次操作的复杂度为$O(logn)$,总复杂度为$O(nlogn)$。

虽然复杂度降低了,但是我们觉得使用线段树解决这个问题可能并非必要,能不能用更简单的方法实现同样复杂度的算法?

或者说,我们之前$O(n^2)$算法其使用的数据结构有何改进之处,如何重新组织信息才能使其更有利于解题?

------------------------------------------------------------

注意到我们之前关心的是项所对应位置,然后根据其位置查找其LIS并更新答案,实际上我们关心的只是满足$A(i) < A(k)$对应的最大LIS值,然而我们需要认识到

的是$A(k)$是在不断变化的,然而右边LIS的值则是便于处理的,并且具有单调可更新性。这就是问题解决的入口。

考虑固定LIS值,储存LIS值等于它的最小项,那么在检查A(k)时,只需用二分查找便可求得可以最为当前项前导项对应的LIS最大值,其后再对该序列用当前LIS更新即可。

时间复杂度为$O(nlogn)$,空间复杂度为$O(n)$。

高效的算法需要对原始数据加以更充分的利用,使之更容易呈现出实际问题的本质,使子问题更加主动地成为整个个问题解决的关键有效部分。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,996
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,510
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,353
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,137
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848