如何针对速度优化此javascript函数?

时间:2015-06-18 18:04:10

标签: javascript

我刚接受了Codility磁带均衡测试here

从你的分数中我可以看出,我对这个功能的执行速度不够好。任何人都可以给我一些指示,以便我可以优化此代码并接近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;
}

2 个答案:

答案 0 :(得分:4)

您不想优化速度。您想要降低algorithmic complexity。您当前的算法为O(n²),而目标说明明确指出

  
      
  • 预期最坏情况时间复杂度为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;
}

答案 1 :(得分:0)

///这是快速版本4中的解决方案,具有完美的100%任务分数,正确性和性能。您也可以很容易地以O(N)的复杂性来理解它。

public func solution(_ A : inout [Int]) -> Int {
    var sumR = 0
    for i in 1..<A.count {
         sumR += A[i]
    }
    var sumL = A[0]
    var min = abs(sumL - sumR)
    for i in 1..<(A.count-1) {
        sumL += A[i]
        sumR -= A[i]
        var diff = abs(sumL-sumR)
        if min > diff {
            min = diff
        } 
   }
   return min
}