如何优化此javascript函数以提高速度?

如何优化此javascript函数以提高速度?,javascript,Javascript,我刚参加了Codibility平衡测试 正如你从我的分数中可以看到的,我在函数执行速度方面做得不够好。有谁能给我一些建议,让我可以优化这段代码并接近100% 这是代码 function solution(A) { var minimumAbsDiff = null; for(var currentIndex =1;currentIndex < A.length;currentIndex ++){ var bottomHalf = getTotal(0,c

我刚参加了Codibility平衡测试

正如你从我的分数中可以看到的,我在函数执行速度方面做得不够好。有谁能给我一些建议,让我可以优化这段代码并接近100%

这是代码

function solution(A) {

    var minimumAbsDiff = null;

    for(var currentIndex =1;currentIndex < A.length;currentIndex ++){
        var bottomHalf = getTotal(0,currentIndex-1,A);
        var topHalf = getTotal(currentIndex,A.length-1,A);

         var absDiff = Math.abs(bottomHalf - topHalf);
         if(minimumAbsDiff == null){
            minimumAbsDiff = absDiff;
         }else{
            if(absDiff < minimumAbsDiff) minimumAbsDiff = absDiff;
         } 
    }

    return minimumAbsDiff;
}

function getTotal(start,end,arrayTocheck){
    var total = 0;
    for(var currentIndex = start;currentIndex <= end;currentIndex++){
        total = total + arrayTocheck[currentIndex];
    }
    return total;
}
函数解决方案(A){
var minimumAbsDiff=null;
对于(var currentIndex=1;currentIndex对于(var currentIndex=start;currentIndex,您不想优化速度。您想降低速度。您当前的算法是
O(n²)
,而taks说明明确指出

  • 期望最坏情况时间复杂度为O(N)
  • 预计最坏情况下的空间复杂度为O(N),超出了输入存储 (不计算输入参数所需的存储)
那么是什么让这成为可能呢?对于
p
,每个总的差异与其他的只有很小的距离。如果你比较
|(a[0]+…+a[p-1])-(a[p]+…+a[N-1])|
对于
p
p+1
,只需要做恒定量的功差

function solution(A) {
     var left = 0,
         right = A.reduce(function(a, b) { return a + b; }, 0);
     var min = Infinity;
     for (var p = 0; p<A.length-1; p++) {
         left += A[p];
         right -= A[p];
         min = Math.min(min, Math.abs(left - right));
     }
     return min;
}
函数解决方案(A){
左向量=0,
right=A.reduce(函数(A,b){返回A+b;},0);
var min=无穷大;

对于(var p=0;p您不想优化速度。您想降低速度。您当前的算法是
O(n²)
,而taks的描述明确指出

  • 期望最坏情况时间复杂度为O(N)
  • 预计最坏情况下的空间复杂度为O(N),超出了输入存储 (不计算输入参数所需的存储)
那么是什么让这成为可能呢?对于
p
,每个总的差异与其他的只有很小的距离。如果你比较
|(a[0]+…+a[p-1])-(a[p]+…+a[N-1])|
对于
p
p+1
,只需要做恒定量的功差

function solution(A) {
     var left = 0,
         right = A.reduce(function(a, b) { return a + b; }, 0);
     var min = Infinity;
     for (var p = 0; p<A.length-1; p++) {
         left += A[p];
         right -= A[p];
         min = Math.min(min, Math.abs(left - right));
     }
     return min;
}
函数解决方案(A){
左向量=0,
right=A.reduce(函数(A,b){返回A+b;},0);
var min=无穷大;

对于(var p=0;phow)我应该将我的帖子移动到它吗?试试这个,它表明O(N)是最坏的可接受时间,所以我会在一个循环中重新访问一个循环的前提。@Exitos:你需要重新发布它。只需复制/粘贴。@skint你确定那个url吗?我如何将我的帖子移动到它?试试这个,它表明O(N)最坏的情况是可以接受的时间,所以我会重新访问循环中循环的前提。@Exitos:你需要重新发布它。只需复制/粘贴。@xdevel:你确定该url吗?@xdevel:谢谢,我错过了
P
必须既不是
0
也不是
N
又酷又快的修复方法。!太棒了。@Exitos:查看维基百科链接“算法复杂性”在回答中你知道有什么在线工具可以让我运行函数吗?它们会告诉我运行函数需要多长时间而不需要我编写计时器?@xdevel:谢谢,我错过了
P
必须既不是
0
也不是
N
又酷又快的修复方法。!太棒了。@Exitos:查看维基百科链接”“算法复杂性”在回答中,你知道我可以运行函数的任何在线工具吗?它们会告诉我在不需要我编写计时器的情况下运行函数需要多长时间?