最长递增子序列问题 LIS(longest increasing subsequence) 例如

给定一个数列,长度为N,

求这个数列的最长上升(递增)子数列(LIS)的长度.

1, 7, 2, 8, 3, 4

为例。

这个数列的最长递增子数列是 1 2 3 4,长度为4;

次长的长度为3, 包括 1 7 8; 1 2 3 等.

设数组为:arr

设 foo(k) 为:以数列中第k项 (为了与java数组逻辑一致,这里的k从0开始计算) 结尾的最长递增子序列的长度

则:

foo(0) == 1

foo(k) == max(arr[k]>arr[0]?foo(0)+1:foo(0),

arr[k]>arr[1]?foo(1)+1:foo(1) ,

... ,

arr[k]>arr[k-1]?foo(k-1)+1:foo(k-1))

java代码

public class LISDemo {

public static void main(String[] args){

int[] arr = new int[10];

Random random = new Random();

for (int i = 0; i < arr.length; i++) {

arr[i] = random.nextInt(100);

}

System.out.println("数组"+Arrays.toString(arr));

long time = System.currentTimeMillis();

System.out.println("结果: "+foo(arr, arr.length-1));

System.out.println("耗时: "+(System.currentTimeMillis()-time));

}

private static int foo(int[] arr,int end){

if (end==0) {

return 1;

}

int len = 0;

for (int i = 0; i < end; i++) {

int temp = foo(arr,i);

len = Math.max(len,arr[end]>arr[i]?temp+1:temp);

}

return len;

}

}

这段代码能计算出正确的结果,但是存在问题:

要计算 foo(n)必须先得到 foo(0)~foo(n-1)的值

要计算 foo(n-1)必须先得到 foo(0)~foo(n-2)的值

...

以此类推,可以把他画成一颗多叉树,时间复杂度达到O(2^n)

运行这段代码就会发现 每当数组长度+1 运行耗时大致翻倍,数组长度为几十的时候,运行时间已经无法容忍的长了。

以foo(3)为例,可以画成下面这棵树

可以发现,相同参数的方法被重复计算了多遍,我们可以建立一个hashmap把参数和对应的值存入其中,当结果已经计算过,就直接从hashmap中取出结果不再计算,修改代码为如下,保留了原来的方法做个对比,执行效率天差地别:

public class LISDemo {

public static void main(String[] args){

int[] arr = new int[31];

Random random = new Random();

for (int i = 0; i < arr.length; i++) {

arr[i] = random.nextInt(100);

}

System.out.println("数组"+Arrays.toString(arr));

LIS lis = new LIS(arr);

long time = System.currentTimeMillis();

System.out.println("结果1: "+lis.foo());

System.out.println("耗时1: "+(System.currentTimeMillis()-time));

time = System.currentTimeMillis();

System.out.println("结果2: "+foo(arr, arr.length-1));

System.out.println("耗时2: "+(System.currentTimeMillis()-time));

}

// 最长递增子序列 longest increasing subsequence

private static class LIS{

int[] arr;

HashMap values = new HashMap<>();

LIS(int[]arr){

this.arr = arr;

}

int foo(){

return foo(arr,arr.length-1);

}

private int foo(int[] arr,int end){

Integer value = values.get(end);

if (value != null) {

return value;

}

if (end==0) {

values.put(0,1);

return 1;

}

int len = 0;

for (int i = 0; i < end; i++) {

int temp = foo(arr,i);

len = Math.max(len,arr[end]>arr[i]?temp+1:temp);

}

values.put(end,len);

return len;

}

}

private static int foo(int[] arr,int end){

if (end==0) {

return 1;

}

int len = 0;

for (int i = 0; i < end; i++) {

int temp = foo(arr,i);

len = Math.max(len,arr[end]>arr[i]?temp+1:temp);

}

return len;

}

}

Java 最长递增子序列_最长递增子序列问题 Java相关推荐

  1. 求序列最长不下降子序列_最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

  2. hwd分别是长宽高_衣柜长宽高标准尺寸一般是多少 衣柜怎么保养

    一般的话,我们在市面上购买衣柜的时候会考虑尺寸的问题,因为家里房子的大小不相同,所以选择的尺寸也不一样,如果买的太大了家里就放不下,所以,大家一定要看一下衣柜长宽高的标准尺寸一般是多少,大家可以根据标 ...

  3. java通过比较大小排序_排序算法的比较与java实现

    冒泡排序 基本思想: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上 ...

  4. 用Java代码实现日志记录器_如何在此简单的Java日志记录实现中附加到日志文件? - java...

    我得到了以下用于创建和管理Logger的类.每当执行代码和程序时,都会使用对静态getLogger()捕获块的调用进行记录. public class Log { private static fin ...

  5. java中解密的思想_北大青鸟翔天解密,Java核心思想两大点

    Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少.对核心概念和思想的掌握可以帮助我们举一反三.触类旁通,有助于提升我们对整个J ...

  6. java超出gc开销限制_超出了GC开销限制– Java堆分析

    java超出gc开销限制 这篇文章是我们原来的GC开销超出问题模式的延续. 正确的Java堆分析对于消除O​​utOfMemoryError:GC开销问题至关重要. 如果您不熟悉此Java HotSp ...

  7. java能调用python吗_如何使用运行时在Java中调用python程序 - java

    我想用来自Java的参数调用python程序.但是我的输出是空白.代码在这里. Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public ...

  8. java 存储过程返回结果集_通过SQL“select * from”从java存储过程返回结果集

    我可以直接通过SQL select * from语句从java存储过程(oracle)获取结果吗? 在数据库上,我将有一个java存储过程/函数,当它被调用时返回一个多列,多行结果集. 我想直接通过s ...

  9. java程序设计 第三版_清华大学出版社-图书详情-《Java语言程序设计(第3版)》...

    第3版前言 Java语言是目前应用最广泛的编程语言之一,学习和使用Java的人越来越多.为了帮助初学者尽快掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,笔者根据长期Java授课 ...

  10. java小马哥百度网盘_思否编程(小马哥):Java 微服务实践 - Spring Boot / Spring Cloud全套,完整版下载 - VIPC6资源网...

    小马哥 Java 微服务实践 – Spring Boot 系列 pptx segmentfault-lessons-master 03Java 微服务实践 – Spring Boot 系列(三)Web ...

最新文章

  1. IDC Future Scape : 2018年全球物联网十大趋势性预测,5G将加速IoT发展
  2. notepad++ 设置常用快捷键
  3. arthas-boot.jar 工具的简单使用
  4. [Python unittest] 3-Organizing test code
  5. URAL-1982 Electrification Plan 最小生成树
  6. android集成genymotion
  7. mysql三高讲解(二):2.4 InnoDB数据表是如何存储的
  8. python 论文插图_插图论文
  9. CentOS6.5安装教程
  10. VirtualBox 安装 CentOS 7.6 操作记录
  11. redis5 外部不能连接_基本拧紧技术,螺纹连接也有大不同!
  12. linux安装 soapui_SOAP测试工具-SoapUI For Linux下载V5.2.1免费版-西西软件下载
  13. Flutter 静态挂载腾讯X5WebView(Tbs)浏览器内核
  14. python绘图工具reportlab介绍
  15. 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
  16. 基于质谱的蛋白质鉴定,第3节:基于MALDI-MS肽指纹图谱的蛋白质质谱鉴定
  17. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年10月份最新版)
  18. 网页中图片无法显示解决方法
  19. IT-RS-IPV6-EUI-64
  20. 关于开展2022年重庆市第一批高新技术企业认定申报工作的通知

热门文章

  1. python中基础知识_Python中的一些基础知识
  2. WPF中INotifyPropertyChanged用法与数据绑定
  3. 使用WebDeployment Project改善VS2005发布网站
  4. maven解决“Could not calculate build plan”问题
  5. Pandas DataFrame 函数应用和映射
  6. ROW_NUMBER() OVER的用法
  7. 由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结
  8. JQuery中操作Css样式
  9. Vmware虚拟机全屏
  10. 知识管理是一门很深的学问