一, 最长递增子序列问题的描述
  设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
  二, 第一种算法:转化为LCS问题求解
  设序列X=<b1,b2,…,bn>是对序列L=<a1,a2,…,an>按递增排好序的序列。那么显然X与L的最长公共子序列即为L的最长递增子序列。这样就把求最长递增子序列的问题转化为求最长公共子序列问题LCS了。
  最长公共子序列问题用动态规划的算法可解。设Li=< a1,a2,…,ai>,Xj=< b1,b2,…,bj>,它们分别为L和X的子序列。令C[i,j]为Li与Xj的最长公共子序列的长度。则有如下的递推方程:
  这可以用时间复杂度为O(n2)的算法求解,由于这个算法上课时讲过,所以具体代码在此略去。求最长递增子序列的算法时间复杂度由排序所用的O(nlogn)的时间加上求LCS的O(n2)的时间,算法的最坏时间复杂度为O(nlogn)+O(n2)=O(n2)。
  三, 第二种算法:动态规划法
  设f(i)表示L中以ai为末元素的最长递增子序列的长度。则有如下的递推方程:
  这个递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。
  这个算法由Java实现的代码如下:
  public void lis(float[] L)
   {
   int n = L.length;
   int[] f = new int[n];//用于存放f(i)值;
   f[0]=1;//以第a1为末元素的最长递增子序列长度为1;
   for(int i = 1;i<n;i++)//循环n-1次
   {
   f[i]=1;//f[i]的最小值为1;
   for(int j=0;j<i;j++)//循环i 次
   {
   if(L[j]<L[i]&&f[j]>f[i]-1)
   f[i]=f[j]+1;//更新f[i]的值。
   }
   }
   System.out.println(f[n-1]);
   }
  这个算法有两层循环,外层循环次数为n-1次,内层循环次数为i次,算法的时间复杂度
  所以T(n)=O(n2)。这个算法的最坏时间复杂度与第一种算法的阶是相同的。但这个算法没有排序的时间,所以时间复杂度要优于第一种算法。
  四, 对第二种算法的改进
  在第二种算法中,在计算每一个f(i)时,都要找出最大的f(j)(j<i)来,由于f(j)没有顺序,只能顺序查找满足aj<ai最大的f(j),如果能将让f(j)有序,就可以使用二分查找,这样算法的时间复杂度就可能降到O(nlogn)。于是想到用一个数组B来存储“子序列的”最大递增子序列的最末元素,即有
  B[f(j)] = aj
  在计算f(i)时,在数组B中用二分查找法找到满足j<i且B[f(j)]=aj<ai的最大的j,并将B[f[j]+1]置为ai。下面先写出代码,再证明算法的证明性。用Java实现的代码如下:
  lis1(float[] L)
  {
   int n = L.length;
   float[] B = new float[n+1];//数组B;
   B[0]=-10000;//把B[0]设为最小,假设任何输入都大于-10000;
   B[1]=L[0];//初始时,最大递增子序列长度为1的最末元素为a1
   int Len = 1;//Len为当前最大递增子序列长度,初始化为1;
   int p,r,m;//p,r,m分别为二分查找的上界,下界和中点;
   for(int i = 1;i<n;i++)
   {
   p=0;r=Len;
   while(p<=r)//二分查找最末元素小于ai+1的长度最大的最大递增子序列;
   {
   m = (p+r)/2;
   if(B[m]<L[i]) p = m+1;
   else r = m-1;
   }
   B[p] = L[i];//将长度为p的最大递增子序列的当前最末元素置为ai+1;
   if(p>Len) Len++;//更新当前最大递增子序列长度;
  
  
   }
   System.out.println(Len);
  }

hobo 2008-08-10 14:46 发表评论

转载于:https://www.cnblogs.com/zhouweiwei/archive/2008/08/10/1866501.html

最长递增子序列问题的求解相关推荐

  1. 转]最长递增子序列问题的求解

    最长递增子序列问题是一个很基本.较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法.由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能 ...

  2. 动态规划法求解最长递增子序列问题

    问题描述 给定一个无序的整数序列a[0-n-1],求其中最长递增子序列的长度. 例如,a[]={2,1,5,3,6,4,8,9,7},n=9,其最长递增子序列为{1,3,4,8,9},结果为5. 问题 ...

  3. 洛谷P2766-最长递增子序列问题

    chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...

  4. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  5. 动态规划算法-04最长递增子序列问题

    最长递增子序列问题 简述 经典的动态规划问题. 问题描述 给定一个序列,求解其中长度最长的递增子序列. 问题分析 这种可以向下查询答案的很容易想到动态规划的解法. 要求长度为i的序列Ai={a1,a2 ...

  6. vue3源码中的最长递增子序列

    求解最长递增子序列是一道经典的算法题, 多数解法是使用动态规划的思想,算法的时间复杂度是O(); 而Vue.js内部使用的是维基百科提供的一套"贪心+二分查找"的算法; 贪心算法的 ...

  7. leetcode - 673. 最长递增子序列的个数

    给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7] ...

  8. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  9. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

最新文章

  1. smali to java_Smali —— 数学运算,条件判断,循环
  2. Day 18: BoilerPipe —— Java开发者的文章提取工具
  3. python温度转换代码分析_Python温度转换实例分析
  4. 使用EHCache需要注意的几个问题(转)
  5. 复习一下日志等级类型
  6. Quartz使用总结、Cron表达式
  7. 计算机三级之嵌入式系统学习笔记1
  8. Reading query string values in JavaScript
  9. Kettle下载与安装
  10. PDFDOC365工具箱
  11. 电脑硬件测试软件哪一个准一点,什么软件测试cpu温度准确_测试cpu温度准确软件汇总 - 系统家园...
  12. wordpress建站我们如何选择虚拟主机和VPS服务器呢?
  13. 初来乍到,还请多多关照
  14. STM32cubemx教程 DAC+TIM+DMA
  15. android otg连接单反
  16. i9300一键root——工具百度一键root
  17. mr time android 最新版,MR.TIME MAKER for Android Wear
  18. python3or5的值_详解python中and和or的返回值
  19. matlab mcr调用,mcr环境下,vs调用matlab,报错access violation
  20. Win11安装怎么跳过TPM-Win11安装跳过TPM的方法介绍

热门文章

  1. ApplicationId 与 PackageName 的区别
  2. sql server 数据库性能忧化
  3. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
  4. 浅谈ES6原生Promise
  5. 非交互模式修改Ubuntu密码的命令
  6. 在Solaris系统中,查看tcp/ip配置
  7. 盛大 牛人 blog
  8. 如何首次在 Exchange Server 2003 SP1 上部署 RPC over HTTP
  9. 金融科技创业公司Revolut增加对BCH和XRP支持
  10. 逢低买入?比特币、莱特币和比特币现金反弹行情一触即发?