我被要求将除1以外的因素和数组中每个数字的数字本身相加.问题是它必须能够处理非常大数量的非常大的数组,而我目前的实现对于大小为100,000,000的数组花费的时间非常长.我计算每个数字因素的代码是
static long countFactors(long num){
long count=0;
long max =(long) Math.floor(Math.sqrt(num));
for(int i=2; i<=max;i++){
if(num%i==0&&(i*i)!=num){
// count i and n/i as a factor
count+=2;
if(num/i
max=num/i;
}
}
else if(num%i==0){
// just add one factor since it is the numbers root.
count+=1;
}
}
return count;
}
是否有人有任何优化建议.
解决方法:
我在这篇文章的开头提出了最好的主意:
被n整除的数字可以被n的所有因子整除.
也许这是降低时间复杂度的关键.现在剩下的:
现在,您只需要执行一次测试(i * i)!= num O(max)次. (对于(int i = 2; i **
还有这是什么if(num / i< max){
max = num / i;
如果我没看错,那是多余的.在这个循环中,永远不会发生因数i大于num的平方根的情况.
最后,在空间允许的情况下,您可以使外部循环通过我将循环通过内部的数组.由于不需要重复i * i,因此可以节省一点点.这些只是您当前算法的微优化.
标签:optimization,java,algorithm
来源: https://codeday.me/bug/20191122/2062295.html