Java 最长递增子序列_最长递增子序列问题 Java

Java 最长递增子序列_最长递增子序列问题 Java最长递增子序列问题LIS(longestincreasingsubsequence)例如给定一个数列,长度为N,求这个数列的最长上升(递增)子数列(LIS)的长度.以1,7,2,8,3,4为例。这个数列的最长递增子数列是1234,长度为4;次长的长度为3,包括178;123等.设数组为:arr设foo(k)为:以数列中第k项(为了与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)为例,可以画成下面这棵树

f89dbd0539d4

可以发现,相同参数的方法被重复计算了多遍,我们可以建立一个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;

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132492.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • 阿里云服务器使用freessl配置免费证书Nginx

    阿里云服务器使用freessl配置免费证书Nginx环境:阿里云服务器购买的域名服务器:linux+nginxSSL证书:FreeSSL申请的免费证书步骤1、申请ssl证书具体参考二哥的“五分钟搞定HTTPS配置,二哥手把手教”https://blog.csdn.net/qing_gee/article/details/90031376博客,这位大佬写的很详细了2、配置阿里云服务器2.1、上传证书登陆阿里云控制台,搜索“ssl证书应用安全”,上传原有证书,注意一定要将证书转换为pem格式2.2、开启服务器443.

  • 新手安卓开发详细教程视频_安卓手机解锁激活成功教程教程

    新手安卓开发详细教程视频_安卓手机解锁激活成功教程教程安卓一、安卓工程构建及第一个安卓程序运行一、安卓工程构建及第一个安卓程序运行使用的软件-eclipse(ADT)在PackageExplorer栏右键点击,New→AndroidApplicationProjectApplicationName:在安装到手机上时应用程序显示的名字(例如微信,QQ)ProjectName:在PackageExplorer栏里面显示的工程名字PackageName:包名(包名不能带有中文,会构建失败),大部分都是公司域名的倒

  • Python之requests的安装

    在windows系统下,只需要输入命令pipinstallrequests,即可安装。   在linux系统下,只需要输入命令sudo  pipinstallrequests,即可安装。   注:关于python第三方库的安装最好少使用easy_install,因为easy_install只能安装不能卸载,如果要卸载需要进入到python的安装

  • mysql语句怎么拼接字符串_MySQL执行拼接字符串语句实例[通俗易懂]

    mysql语句怎么拼接字符串_MySQL执行拼接字符串语句实例[通俗易懂]–以下是一个MySQL执行拼接字符串语句实例:–为需要拼接的变量赋值SET@VARNAME=–以下是一个MySQL执行拼接字符串语句实例:–为需要拼接的变量赋值SET@VARNAME=’李’;–拼接字符串,其中?是执行拼接字符串语句的参数,@TestName是结果值SET@SQLStr0=CONCAT(‘SELECTTestNameINTO@TestNameFRO…

  • linux安装yarn

    linux安装yarn这里介绍使用yum的方式:先要安装node.js,用node-v可以查看是否安装了node。1、添加yarn仓库wgethttps://dl.yarnpkg.com/rpm/yarn.repo-O/etc/yum.repos.d/yarn.repo2、安装yarnyum-yinstallyarn安装完成后,yarn-v可以查看版本。…

  • springcloudfeign原理面试题_微服务feign作用

    springcloudfeign原理面试题_微服务feign作用Feign原理简述启动时,程序会进行包扫描,扫描所有包下所有@FeignClient注解的类,并将这些类注入到spring的IOC容器中。当定义的Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate。 RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。 RequestTemplate声明Request,然后将Request交给cl…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号