最长递增子序列

✍ dations ◷ 2025-07-22 07:14:41 #组合数学,动态规划

在计算机科学中,最长递增子序列(longest increasing subsequence)问题是指,在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。最长递增子序列中的元素在原序列中不一定是连续的。许多与数学、算法、随机矩阵理论(英语:random matrix theory)、表示论相关的研究都会涉及最长递增子序列。解决最长递增子序列问题的算法最低要求O( log )的时间复杂度,这里表示输入序列的规模。

对于以下的原始序列

最长递增子序列为

值得注意的是原始序列的最长递增子序列并不一定唯一,对于该原始序列,实际上还有以下两个最长递增子序列

最长递增子序列问题与最长公共子序列问题密切相关,后者具有动态规划解决方案(时间复杂度为O):序列S的最长递增子序列是S和T的最长公共子序列,其中T是对S进行排序的结果。但对于特殊情况,输入是整数 1, 2, ..., , 的排列,解决方案可以进一步改进,从而使时间复杂度降为O( log ) 。

排列图(permutaion graph)中的最大团是由'定义该图的排列中最长的递减子序列'定义的, 求最长的递减子序列在计算复杂度上(通过对所有数取它的负数)等同于求最长的递增子序列。 因此,最长递增子序列算法可用于有效地解决排列图中的分团问题。

下面概述的算法使用数组和二分查找算法有效地解决了最长递增子序列问题。 它依次处理序列元素,保存当前找到的最长的递增子序列, 比如: ,X ]。在处理X之后,算法会将值存储在两个数组中:

另外,该算法还存储了一个变量L,该变量L表示到目前为止找到的最长的递增子序列的长度。 下面的算法使用基于零的编号,为了清楚起见,M用M 填充,而M 未使用,因此M 对应于长度j的子序列。 实际的实现可以跳过M 并相应地调整索引。

请注意,在算法的任何时候,序列

是递增的。 因为,如果长度的子序列以X ]结尾,则长度的子序列以较小的值结尾:即以X 结尾的子序列 ]。 因此,我们可以使用二分查找在时间内完成搜索。

伪代码如下:

P = array of length NM = array of length N + 1L = 0for i in range 0 to N-1:    // Binary search for the largest positive j ≤ L    // such that X] <= X    lo = 1    hi = L    while lo ≤ hi:        mid = ceil((lo+hi)/2)        if X] < X:            lo = mid+1        else:            hi = mid-1    // After searching, lo is 1 greater than the    // length of the longest prefix of X    newL = lo    // The predecessor of X is the last index of     // the subsequence of length newL-1    P = M    M = i        if newL > L:        // If we found a subsequence longer than any we've        // found yet, update L        L = newL// Reconstruct the longest increasing subsequenceS = array of length Lk = Mfor i in range L-1 to 0:    S = X    k = Preturn S

由于该算法对每个序列元素都执行二分查找,因此时间复杂度为O( log )。 弗雷德曼 Fredman (1975)讨论了该算法的一种变体,他将其归功于高德纳。 在他研究的变体中,该算法在进行二分查找之前,测试每个值X 是否可以在常数时间内扩展当前最长的递增序列。 通过这种修改,算法在最坏的情况下只会进行 log2 − log2log2 + O()个比较,对于比较算法(最高为O() 项中的恒定因子)而言,这是最佳选择。

相关

  • Dy4f10 6s22, 8, 18, 28, 8, 2蒸气压3, 2, 1 (弱第一:573.0 kJ·mol−1 第二:1130 kJ·mol−1 第三:2200 kJ·mol主条目:镝的同位素.mw-parser-output ruby>rt,.mw-parser-out
  • 安东尼奥·加西亚-贝利多安东尼奥·加西亚-贝利多(西班牙语:Antonio García-Bellido,1936年4月30日-),西班牙生物学家。他在发育生物学界极具影响力。
  • 契尔西切尔西(英语:Chelsea)是美国马萨诸塞州沙福克县的一个城市,位于波士顿东北。面积6.4平方千米,是该州面积最小的城市。根据美国2000年人口普查,人口35,080人。1624年白人开始殖民,17
  • Gliese 581 c格利泽581c(英语:Gliese 581 c)是一颗绕行位于天秤座格利泽581红矮星之太阳系外行星里的“超级地球”,距离地球约20.5光年(193.9万亿千米)。它环绕恒星的轨道恰好处于其行星系的适
  • 克里斯蒂娜·泽德尔鲍姆贝娅塔·玛格丽塔·克里斯蒂娜·泽德尔鲍姆(瑞典语:Beata Margareta Kristina Söderbaum,1912年9月5日-2001年2月12日)是一位在瑞典出生的德国电影女演员、监制和摄影师。她知名
  • 源平合战日本皇室: 后白河法皇 以仁王†河内源氏: 源赖政† 源赖朝源希义† 源义基† 源光长† 安田义定其他源氏成员 甲斐源氏: 武田信义 一条忠赖† 河内源氏: 源行家 信浓
  • 苏福克县萨福克县(Suffolk County, New York)是美国纽约州的一个县,位于长岛东部,北向长岛海湾,南面大西洋,西接拿骚縣 ,是纽约州与纽约大都会区最东边的县。面积6,146平方公里。根据美国2
  • 中国海军博物馆海军博物馆,位于中国山东省青岛市市南区莱阳路8号。临近鲁迅公园、小青岛公园,与青岛栈桥隔海相望。中国海军博物馆是中国第一座反映中国人民解放军海军发展的专业性军事博物
  • 赵锡江赵锡江(1929—),男,汉族,河北省唐山市乐亭县古河乡大捞鱼庄村人。中国人民解放军海军少将,中国人民解放军海军大连舰艇学院原政委。赵锡江1944年4月参加八路军,1945年11月加入中国
  • S/2003 J 12S/2003 J 12是环绕木星运行的一颗卫星,是已知最小的一颗卫星。它在2003年被由斯科特·谢泼德领导的夏威夷大学一个天文小组发现。S/2003 J 12的直径约1公里,公转轨道的平均半