Java 最长递增子序列_最长递增子序列问题 Java
最长递增子序列问题 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相关推荐
- 求序列最长不下降子序列_最长不下降子序列nlogn算法详解
今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...
- hwd分别是长宽高_衣柜长宽高标准尺寸一般是多少 衣柜怎么保养
一般的话,我们在市面上购买衣柜的时候会考虑尺寸的问题,因为家里房子的大小不相同,所以选择的尺寸也不一样,如果买的太大了家里就放不下,所以,大家一定要看一下衣柜长宽高的标准尺寸一般是多少,大家可以根据标 ...
- java通过比较大小排序_排序算法的比较与java实现
冒泡排序 基本思想: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上 ...
- 用Java代码实现日志记录器_如何在此简单的Java日志记录实现中附加到日志文件? - java...
我得到了以下用于创建和管理Logger的类.每当执行代码和程序时,都会使用对静态getLogger()捕获块的调用进行记录. public class Log { private static fin ...
- java中解密的思想_北大青鸟翔天解密,Java核心思想两大点
Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少.对核心概念和思想的掌握可以帮助我们举一反三.触类旁通,有助于提升我们对整个J ...
- java超出gc开销限制_超出了GC开销限制– Java堆分析
java超出gc开销限制 这篇文章是我们原来的GC开销超出问题模式的延续. 正确的Java堆分析对于消除OutOfMemoryError:GC开销问题至关重要. 如果您不熟悉此Java HotSp ...
- java能调用python吗_如何使用运行时在Java中调用python程序 - java
我想用来自Java的参数调用python程序.但是我的输出是空白.代码在这里. Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public ...
- java 存储过程返回结果集_通过SQL“select * from”从java存储过程返回结果集
我可以直接通过SQL select * from语句从java存储过程(oracle)获取结果吗? 在数据库上,我将有一个java存储过程/函数,当它被调用时返回一个多列,多行结果集. 我想直接通过s ...
- java程序设计 第三版_清华大学出版社-图书详情-《Java语言程序设计(第3版)》...
第3版前言 Java语言是目前应用最广泛的编程语言之一,学习和使用Java的人越来越多.为了帮助初学者尽快掌握Java编程,感受到Java语言的魅力,领会到Java编程的快乐,笔者根据长期Java授课 ...
- java小马哥百度网盘_思否编程(小马哥):Java 微服务实践 - Spring Boot / Spring Cloud全套,完整版下载 - VIPC6资源网...
小马哥 Java 微服务实践 – Spring Boot 系列 pptx segmentfault-lessons-master 03Java 微服务实践 – Spring Boot 系列(三)Web ...
最新文章
- IDC Future Scape : 2018年全球物联网十大趋势性预测,5G将加速IoT发展
- notepad++ 设置常用快捷键
- arthas-boot.jar 工具的简单使用
- [Python unittest] 3-Organizing test code
- URAL-1982 Electrification Plan 最小生成树
- android集成genymotion
- mysql三高讲解(二):2.4 InnoDB数据表是如何存储的
- python 论文插图_插图论文
- CentOS6.5安装教程
- VirtualBox 安装 CentOS 7.6 操作记录
- redis5 外部不能连接_基本拧紧技术,螺纹连接也有大不同!
- linux安装 soapui_SOAP测试工具-SoapUI For Linux下载V5.2.1免费版-西西软件下载
- Flutter 静态挂载腾讯X5WebView(Tbs)浏览器内核
- python绘图工具reportlab介绍
- 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
- 基于质谱的蛋白质鉴定,第3节:基于MALDI-MS肽指纹图谱的蛋白质质谱鉴定
- 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年10月份最新版)
- 网页中图片无法显示解决方法
- IT-RS-IPV6-EUI-64
- 关于开展2022年重庆市第一批高新技术企业认定申报工作的通知
热门文章
- python中基础知识_Python中的一些基础知识
- WPF中INotifyPropertyChanged用法与数据绑定
- 使用WebDeployment Project改善VS2005发布网站
- maven解决“Could not calculate build plan”问题
- Pandas DataFrame 函数应用和映射
- ROW_NUMBER() OVER的用法
- 由sqlite在手机上的存储位置,引发的onCreate在哪里执行的小结
- JQuery中操作Css样式
- Vmware虚拟机全屏
- 知识管理是一门很深的学问