Java 提高执行时间
如何提高以下程序的执行时间。 我在“递归”和“素数”函数中都使用了动态规划。 但是没有得到有效的执行时间 问题:受害者的房子里有一堵4xN大小的墙。受害者也有无限的权利 在她的房子里提供4x1和1x4尺寸的砖块。处处 配置时,必须使用砖块完全覆盖墙壁。Gale Bertram想知道砖块在墙上的排列方式总数,以便每次都出现新的配置。 让配置的数量=MJava 提高执行时间,java,algorithm,dynamic,dynamic-programming,execution-time,Java,Algorithm,Dynamic,Dynamic Programming,Execution Time,如何提高以下程序的执行时间。 我在“递归”和“素数”函数中都使用了动态规划。 但是没有得到有效的执行时间 问题:受害者的房子里有一堵4xN大小的墙。受害者也有无限的权利 在她的房子里提供4x1和1x4尺寸的砖块。处处 配置时,必须使用砖块完全覆盖墙壁。Gale Bertram想知道砖块在墙上的排列方式总数,以便每次都出现新的配置。 让配置的数量=M 因此,他想让Patrick计算质数的个数(比如p)到M(也就是说,您在这里犯了两个主要错误(或者更确切地说,考虑到两个低效率): 你正在重新初始化并
因此,他想让Patrick计算质数的个数(比如p)到M(也就是说,您在这里犯了两个主要错误(或者更确切地说,考虑到两个低效率): <>你正在重新初始化并重新计算每一个循环中的<代码> A/Eng>数组。那些不会改变,只是通过上次分配一个大小为40的数组来重用上次的结果(你也可能想考虑更好的命名约定……)
n
对于唯一的n
-再次命名约定将是唯一的)第1部分不太可能增加太多时间,因为计算很简单,而且N您可能希望进一步优化
int prime(int N)
函数。(当然,您可以使用“net”中的任何有效算法,但是:)为了避免反复进行相同的计算,请注意,您可以计算prime(N+m)
如果您已经有了prime(n)
,速度会更快
(我认为您已经朝这个方向思考了,因为您正在对已经计算的数字使用一些“缓存”。)
编辑:
见奥杜斯的答案#2:)
编辑2:
要详细说明该想法,请执行以下操作:
问:如果我知道素数
c
的数量您是否尝试过使用cpu探查器或任何其他减少cpu时间的技术?因为您目前有正在工作的代码,并且您希望尝试并改进它,您可能会更幸运。鉴于您已经有a
的重复关系,您可以运行另一个程序我要生成a
的条目,并用它代替递归函数。你甚至可以在同一个程序中创建一个筛,但筛无论如何都很快。@Ben,你能给出关于“筛”的更多细节吗我将素数值存储在全局数组b中,并对其进行检索以避免重复计算。请您提供一些有关优化过程的详细信息。正如Ordous所说:您已经在“缓存”,例如,prime(1000)的结果
,但下次需要计算素数(1001)时,您不会使用此结果,尽管您可以这样做。我做了一些更正,但仍然没有得到。请检查代码。公共静态整型素数(int n){int count=0;如果(b[n]!=0)返回b[n];否则{for(int i=2;i@Torrtuga请不要在评论中发布代码,读起来很可怕……但是,是的,看起来好多了。你仍然有几个错误:将b[i]=count
从条件中去掉,否则你将重新计算素数的结果,同时循环到sqrt(i)
,而不是i/2
。此外,习惯上使用布尔值作为标志,而不是int
谢谢。在要求的时间内获得了输出。sqrt(i)确实起到了作用。非常感谢!!
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
class Solution{
public static int[] b = new int[217287];
public static void main(String[] args){
Scanner stdin = new Scanner(System.in);
int t = stdin.nextInt();
int[] a = new int[41];
for(int j=0;j<4;j++){
a[j] = 1; //till n<=3, number of possiblities = 1. These will work as base cases.
}
a[4] = 2;
for(int x=0;x<t;x++){
int n = stdin.nextInt();
for(int i=5;i<=n;i++){
a[i] = -1; //initialise all value in the array as -1.
}
if(n<4)
System.out.println("0"); // if n<4, number of possibilities =1. So no prime number before that is 0.
else{
//for n=4, possibilities = 2. This is a base case.
int num1 = recursive(a,n); // storing number of possibilities in num1.
int num2 = prime(num1); //calling to calculate number of prime numbers before or equal to num1.
System.out.println(num2);
}
}
}
public static int recursive(int[] a, int n){
if(a[n]!=-1) // retrieving a[n] value if already calculated.
return a[n];
else{
a[n] = recursive(a,n-1) + recursive(a,n-4); // calling recursively.If we fill with a 4*1 first tile then number
//tiles left is n-1(try visualising).If we fill 1*4 tile first
// we have n-4 tile left.
return a[n];
}
}
public static int prime(int n){
int count = 0;
if(b[n]!=0)
return b[n];
else{
for(int i=2;i<=n;i++){
if(b[i]!=0){
count = b[i];
}
else{
int flag = 0;
for(int j=2;j<=i/2;j++){
if(i%j==0){
flag = 1;
break;
}
}
if(flag==0){
count++;
b[i]=count;
}
}
}
return count;
}
}
public static int prime2( final int n ) {
int count;
if ( n <= 2 ) {
count = 1;
} else {
count = prime2(n-1);
if ( isPrime(n) ) {
count = count + 1;
}
}
return count;
}