【发布时间】:2014-02-06 17:36:56
【问题描述】:
我有一段代码在时钟速度方面必须运行得非常快。该算法已经在 O(N) 中。需要2秒,需要1秒。对于大多数 A.length 输入 ~ 100,000 需要 0.3 秒,除非特定的代码行被调用了极端次数。 (对于深奥的编程挑战)
它使用算术级数的计算,即 1,2,..N -> 1,3,4,10,15.. 可以表示为 n*(n+1)/2 我循环这个方程几十万次。 我无权访问输入,也无法显示它。我能得到的唯一信息是运行时间。 特别是等式是:
s+=(n+c)-((n*(n+1))/2);
s 和 c 的取值范围为 0 到 10 亿
n 的范围可以是 0 到 100,000
就时钟速度而言,编写此语句的最有效方法是什么? 我听说除法比乘法花费更多时间,但除此之外,我无法确定将其写在一行或多行中是否更有效。 除法和乘法与乘法然后除法? 创建自定义整数类型也会有很大帮助吗?
根据要求进行编辑,输入小写的完整代码(对不起,如果它很难看,我只是一直在剥离它):
public static void main(String[] args) {
int A[]={3,4,8,5,1,4,6,8,7,2,2,4};//output 44
int K=6;
//long start = System.currentTimeMillis();;
//for(int i=0;i<100000;i++){
System.out.println(mezmeriz4r(A,K));
//}
//long end = System.currentTimeMillis();;
// System.out.println((end - start) + " ms");
}
public static int mezmeriz4r(int[]A,int K){
int s=0;
int ml=s;
int mxl=s;
int sz=1;
int t=s;
int c=sz;
int lol=50000;
int end=A.length;
for(int i=sz;i<end;i++){
if(A[i]>A[mxl]){
mxl=i;
}else if(A[i]<A[ml]){
ml=i;
}
if(Math.abs(A[ml]-A[mxl])<=K){
sz++;
if(sz>=lol)return 1000000000;
if(sz>1){
c+=sz;
}
}else{
if(A[ml]!=A[i]){
t=i-ml;
s+=(t+c)-((t*(t+1))/(short)2);
i=ml;
ml++;
mxl=ml;
}else{
t=i-mxl;
s+=(t+c)-((t*(t+1))/(short)2);
i=mxl;
mxl++;
ml=mxl;
}
c=1;
sz=0;
}
}
if(s>1000000000)return 1000000000;
return s+c;
}
挑战归来:
检测到的时间复杂度:
O(N)
测试时间结果
示例 示例测试 0.290 秒。好的
单人 单个元素 0.290 秒。好的
双倍 两个元素 0.290 秒。好的
small_functional 小型功能测试 0.280 秒。好的
small_random 小随机序列长度 = ~100 0.300 s。好的
small_random2 小随机序列长度 = ~100 0.300 s。好的
medium_random 混沌中等序列长度 = ~3,000 0.290 s。好的
大范围 大范围测试,长度 = ~100,000 2.200 s。超时错误 运行时间:>2.20 秒,时限:1.02 秒。
大随机 随机大序列长度 = ~100,000 0.310 s。好的
large_answer 大答案测试 0.320 秒。好的
large_extreme 所有最大值 = ~100,000 0.340 秒。好的
【问题讨论】:
-
发布你的代码,然后我可以尝试改进它
-
既然您知道
n>0,您可以将/2替换为>>1。与此相比,其他一切都微不足道。 -
对于真正的测量,使用预热:启动循环两次,第一次不测量时间。这使 JVM 有时间正确编译您的方法。
-
@SargeBorsch:是的,还不够。我应该推荐一个基准测试框架,但是对于像这样复杂的事情,花一秒钟的时间进行一次微不足道的预热就足够了。如果您的意思是重复计数,是的,如果我对精确值感兴趣,我会让它等待一两分钟。但同样,这可能就足够了。
-
@woodlumhoodlum 如果更改顺序,您不需要 Math.abs。平均值而不是 if(Math.abs(A[ml]-A[mxl])
标签: java algorithm optimization mathematical-optimization