簡體   English   中英

如何以大O(N)的時間復雜度對循環中的數組部分求和

[英]How to Sum array parts within a loop with time-complexity of Big O(N)

我有一個函數,該函數根據數組划分的位置P返回數組兩部分之和之間的最小差。 經測試,該程序可以在O(N * N)時間復雜度和0%的性能下運行,盡管預期為O(N)。

問題:我可以在此方面進行任何改進以改善性能嗎? 有沒有更好的方法可以在不使用子循環的情況下對循環中的數組求和? 謝謝

任何整數P,例如0 <P <N,都會將此磁帶分割為兩個非空部分:A [0],A [1],...,A [P − 1]和A [P],A [ P + 1],...,A [N − 1]。

這兩個部分之間的差為:|(A [0] + A [1] + ... + A [P-1])-(A [P] + A [P + 1] + .. 。+ A [N − 1])|

https://jsbin.com/mehisi/edit

function solution(A) {

  'use strict';

  if(arguments.length === 1 && typeof A === "object" && A.length > 1 ){
    try{
      const N = A.length;

      let diff;
      for( let P =1 ; P < N ; P++) {
        // For each value of P, calc the difference 
        //|(A[0] + A[1] + ... + A[P − 1]) − (A[P] + A[P + 1] + ... + A[N − 1])|

        // use slice to prevent modification of oraginal copy
        var A2 = A.slice(0) ; 
        //splice array into two A1 and A2
        let A1 = A2.splice(0, P);  // All Element from start up to P
        console.log("From Array " + A  + " Remove "+ A1 + " Remaining " + A2);
        // reduce((a, b) => a + b, 0); 
        let diffp = Math.abs((A1.reduce(function(a, b) { return a + b; }, 0)) - 
            (A2.reduce(function(a, b) { return a + b; }, 0))) ;

        if(diff > diffp || diff === undefined ){
          diff = diffp ;
        }
        console.log(P + "Difference ="+ diff + " Instead of " + diffp + " \r\n " );
      }

      // Return the Minimum value of P
      return diff  ;
    }
    catch(err){
     console.log("Error: " + err );
    return 0 ; // undefined ;
    }
  }else{
     console.log("Invalid parameter(s)");
    return 0 ; // undefined ;
  }

}

var A = [] ;
  A[0] = 5
  A[1] = 1
  A[2] = 2
  A[3] = 7
  A[4] = 4
console.log(solution(A)) ;

是的,在線性時間(甚至恆定的空間)中以連續的總和來執行此操作非常簡單。

function solution(arr) {
    var leftSum = 0; // sum from 0 to P
    var rightSum = arr.reduce((a, b) => a + b, 0); // sum from P to N
    var min = Math.abs(leftSum - rightSum); // initial value for p=0
    for (var p = 0; p < arr.length; p++)
        // move the element from the right to the left side
        leftSum += arr[p];
        rightSum -= arr[p];
        // then update minimum difference
        min = Math.min(min, Math.abs(leftSum - rightSum));
    }
    return min;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM