Javascript 最大素因子函数运行太慢
我已经写了一个函数,它可以找到某个数的最大素因子。这个函数可以工作,但问题是它太慢了。e、 g当我输入600851475143作为参数时,查找最大素因子的过程持续时间太长。如何修改它以使其工作更快? 这是我的密码:Javascript 最大素因子函数运行太慢,javascript,function,primes,Javascript,Function,Primes,我已经写了一个函数,它可以找到某个数的最大素因子。这个函数可以工作,但问题是它太慢了。e、 g当我输入600851475143作为参数时,查找最大素因子的过程持续时间太长。如何修改它以使其工作更快? 这是我的密码: class test { static addArray(someArray, member) { for (var i = 0; i <= someArray.length; i++) { if (i == someArray.length) {
class test {
static addArray(someArray, member) {
for (var i = 0; i <= someArray.length; i++) {
if (i == someArray.length) {
someArray[i] = member;
return someArray;
}
}
}
static someLength(someArray) {
var i = 0;
while (someArray[i] !== undefined) {
var lastItem = i;
i++;
}
return i;
}
static testPrime(i) {
for (var k=2; k < i; k++) {
if (i % k == 0) {
return false;
}
}
return true;
}
}
var primeArray = [];
function largestPrime(n) {
for (var i=2; i < n; i++) {
//var k = n / i;
if (n % i == 0 && test.testPrime(i) == true) {
test.addArray(primeArray, i);
n == n / i;
}
}
return primeArray[test.someLength(primeArray) - 1];
}
document.write(largestPrime(600851475143));
类测试{
静态addArray(someArray,member){
对于(var i=0;i好的,在我们开始之前,让我们先整理一下理论。从数学上讲,衡量一段特定代码运行所需时间的方法是用O(n)
表示法(big-O表示法),其中n
是输入的大小
您的测试素数函数具有所谓的线性复杂度
,这意味着它将随着n
的大小(在本例中,您的数字输入)变大而线性变慢
对于编号15
,执行上下文如下所示:
15 % 2 == 0 (FALSE)
15 % 3 == 0 (TRUE)
...
15 % 14 == 0 (FALSE)
这意味着对于数字100
,将有98(2-99)个步骤。这将随着时间而增长。让我们考虑一下您的数字:600851475143
。程序将执行600851475143
;循环将触发600851475141
次
现在,让我们考虑一个时钟周期。假设每个指令占用代码>1个时钟周期< /代码>,并且循环的一个哑下版本占2,数字<代码> 600851475143 /代码>将执行<代码> 1201702950286 > /代码>时间。考虑每个时钟周期占用<代码> 0 0000000 625 < /代码>秒(对于16 MHz平台,例如),仅该代码所用的时间为:
0.0000000625 * 1201702950286 = ~75,106 seconds
或大约20小时
你知道我要说什么了
要使此程序更快地运行,最好使用a,并使用此数字(或其BigInteger变体)确认您的发现
您的方法更为线性,因为for循环
检查素性的迭代次数随着次数的增加而增加。您可以将CPU周期时间与次数一起绘制,您会发现这是一种效率相当低的方法
我在我的大学里有离散数学,所以只要一句警告的话——当你进入越来越快的测试的乌托邦时,素性测试和它们的变体会变得非常混乱。这是一条充满数学荆棘的道路,你应该在丛林中骑行时系好安全带!)
如果您需要更多关于这方面的信息,我很乐意提供帮助!我希望这有帮助!:)这是一个很好的代码检查问题,而不是StackOverflow问题。@Chrisharp对于相对较小的数字,它工作得更快,我已经看完了代码,我认为没有多余的大括号。最后一个属于类这是一个绝对优秀的问题答案是,正如我所知,一开始使用语法可能有点奇怪。当您进入算法时,您必须向CLRS.xD低头