更快的函数内JavaScript函数调用算法

时间:2017-08-03 14:22:39

标签: javascript algorithm recursion

我已经编写了一个函数并调用了另一个函数,但是我的测试显示它没有时间优化。如何更快地制作以下代码?

<TextBox Text="{Binding .}" />

3 个答案:

答案 0 :(得分:3)

算法优化:使用从索引0到每个索引

的累积总和创建新数组
cumsum[0] = 0;
for (var i = 1; i <= arr.Length; i++) {
  cumsum[i] = cumsum[i-1] + arr[i-1]

现在你不需要计算每个范围的总和 - 只是得到差异

 sum for range (i..j) = cumsum[j+1] - cumsum[i];
用您的条款

    function sumAll(array1, myrange) {
            return cumsum[myrange[1]+1] - cumsum[myrange[0]];
    }

示例:

arr = [1,2,3,4]
cumsum = [0,1,3,6,10]
sum for range 1..2 = 6 - 1 = 5

P.S。如果您的阵列可能已更新,请考虑Fenwick tree数据结构

答案 1 :(得分:1)

1)您可以在函数sumAll之外定义函数maxSum,因为每次调用maxSum时,javascript引擎都会重新创建一个全新的函数sumAll。< / p>

2)您可以将myrange[1]定义为初始化部分中的变量,以避免javascript在每次迭代时查找myrange[1]

            for (var i = myrange[0]; i <= myrange[1]; i++) {

                total += array1[i];
            }

成为这个:

            for (var i = myrange[0], len = myrange[1]; i <= len; i++) {

                total += array1[i];
            }

答案 2 :(得分:-2)

基于@ MBo优秀优化的完整工作代码。这通过了https://www.codewars.com/kata/the-maximum-sum-value-of-ranges-challenge-version/train/javascript的所有测试,我收集的是这个问题的来源。

function maxSum(arr, ranges) {
  var max = null;

  var sums = [];
  var sofar = 0;
  for (var i = 0; i <= arr.length; i++) {
    sums[i] = sofar;
    sofar += arr[i];
  }

  for (var i = 0; i < ranges.length; i++) {
    var sum = sums[ranges[i][1]+1] - sums[ranges[i][0]];
    if (max === null || sum > max) {
      max = sum;
    }
  }

  return max;
}