在做java编程刷题的时候遇到的一个问题。
对于满足该式子的数字(x,y,n):
求满足该式子的不同x,y组合解的个数超过的某值最小数字n。
比如满足解的个数超过nums=100的时候,n=1260(此时有113个不同解),即(x,y,1260)。
实现了一下,求解的个数超过100能够很快求出,但课题要求的是求40000个不同解的时候的n,根本执行不出来。
想了一下暴力遍历应该时间复杂度太高了,考虑过用二分法之类的算法降低复杂度,但是无法实现。
想请问一下大家有什么降低执行时间的办法么。
class Kadai7_2{
public static void main(String[] args){
final int num_of_solution = 500;
int n = num_of_solution / 2 - 1;
int ans = 0;
do{
ans = findnums(++n);
}
while(ans <= num_of_solution);{
System.out.println("不同解的个数超过" + num_of_solution + "的最小n为 " + n);
}
}
public static int findnums(int n){
int nums = 0;
for(int x = n + 1 ; x <=2 * n; x++){
if((x * n)% (x - n) == 0){
nums++;
int y = (x * n)/ (x - n);
System.out.println("(" + x + ", " + y + ", " + n + ")");
}
}
return nums;
}
}
时间复杂度O,空间复杂度,看下能否空间换时间
这个需要做动态规划,找出规律就好解决了
嗯,提供三个大方向,供你参考:
方向一:减少数据量
1、分批处理:例如:如果有一个定时任务一月度执行,那么就拆分到天进行分批处理。每天定时任务,均摊到每时每刻。
2、多线程并行处理。【需要考虑并发问题以及服务器与数据库能力。】
3、排除不必要的输入参数。【已执行定时任务不再处理,只处理增量数据。同一份数据,减少重复计算。】
方向二:优化代码
1、增加缓存数据,配置性数据静态化
2、减少IO次数,批量更新数据
3、增加事务,单次执行过程中,执行sql后需立即提交更新。
4、优化循环代码,大循环放在最里面一层
5、多线程处理。【需要考虑并发问题以及服务器与数据库能力。】
方向三:优化数据库表,减少IO时间
1、数据库增加索引
2、大数据量进行分库分表