簡體   English   中英

如何優化我的JavaScript程序?

[英]How can I optimize my javascript program?

我正在嘗試解決此javascript問題,並提出了此解決方案,該解決方案提供了正確的解決方案,但在線判斷顯示超出了時間限制。 我想優化算法。 我的算法可以更改什么?

問題描述:整數數組的特殊分數(ssc)將是每個整數的總和乘以其對應的索引再加上一個整數。

例如:隨着

array [6, 12, -1]

arr =   [6,      12,       -1 ]
ssc =   1*6  +  2* 12 +  3.(*1) = 6 + 24 - 3 = 27

示例中給出的數組具有六個(6)排列,並具有相應的ssc:

排列特殊分數(ssc)[6,12,-1] 1 * 6 + 2 * 12 + 3 *(-1)= 27 [6,-1,12] 1 * 6 + 2 *(-1)+ 3 * 12 = 40 [-1,6,12] 1 *(-1)+ 2 * 6 + 3 * 12 = 47 [-1,12,6] 1 *(-1)+ 2 * 12 + 3 * 6 = 41 [12,-1,6] 1 * 12 + 2 *(-1)+ 3 * 6 = 28 [12,6,-1] 1 * 12 + 2 * 6 + 3 *(-1)= 21所有可能排列的ssc的總和為:27 + 40 + 47 + 41 + 28 + 21 = 204

ssc的最大值為47。

ssc的最小值是21。

我們需要一個特殊的函數ssc_forperm(),該函數接收不確定數量的元素的數組(這些元素可能出現多次),並可能輸出包含以下數據的字典列表:

[{"total perm":__}, {"total ssc": ___}, {"max ssc": __}, {"min ssc":__}]

我的解決方案:

function permute(input) {
    var permArr = [],
        usedChars = [];
    return (function main() {
        for (var i = 0; i < input.length; i++) {
            var ch = input.splice(i, 1)[0];
            usedChars.push(ch);
            if (input.length === 0) {
                permArr.push(usedChars.slice());
            }
            main();
            input.splice(i, 0, ch);
            usedChars.pop();
        }
        return permArr;
    })();
}

function sscForperm(arr){
  var perm=permute(arr);
  var perm_arr=[];
  var temp_arr=[];
  var j=0;
  while(j<perm.length)
  {
      if(temp_arr.indexOf(perm[j].toString())===-1)
      {
          perm_arr.push(perm[j]);
          temp_arr.push(perm[j].toString());
      }
      j++;
  }
  var total_perm=perm_arr.length;

  var total=0;
  var max= 0;
  var k=0;
  while(k<perm_arr[0].length)
  {
      max+=perm_arr[0][k]*(k+1);
      k++;
  }
  var min=max;
  total+=max;

  var i=1;
  while(i<total_perm)
  {
      var l=0;
      var temp=0;
      while(l<perm_arr[0].length)
      {
          temp+=perm_arr[i][l]*(l+1);
          l++;
      }
      total+=temp;
      if(temp>max)
      {
          max=temp;
      }
      if(temp<min)
      {
          min=temp;
      }
      i++;
  }
  var dict1 = {"total perm":total_perm};
  var dict2 = {"total ssc":total};
  var dict3 = {"max ssc":max};
  var dict4 = {"min ssc":min};
  var ans=[];
  ans.push(dict1);
  ans.push(dict2);
  ans.push(dict3);
  ans.push(dict4);
  return ans;
}

優化代碼的一種簡單方法是使用Google Closure編譯器。

Google Closure編譯器

我預編譯了您的代碼,得到的代碼在

http://closure-compiler.appspot.com/code/jsc23712967d5b5fa4f457b1638ec432b22/default.js

這既快速又容易。 現在應該運行得更快

total perm = n!

因為每個數組元素都出現在總和(n - 1)!中,所以total ssc可以從公式中得出(n - 1)! 每個索引的時間:

total ssc = array sum * (n - 1)! * index sum
(6 + 12 - 1) * 2! * 3 * (3 + 1) / 2 = 204

可以通過簡單地對數組排序並在任一方向上應用索引倍數來計算max sscmin ssc :升序生成最大值,而降序生成最小值。

暫無
暫無

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

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