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

标签 javascript algorithm recursion

我已经编写了一个函数并在其中调用了另一个函数,但我的测试表明它没有进行时间优化。我怎样才能使下面的代码更快?

    function maxSum(arr, range) {


        function sumAll(array1, myrange) {

            var total = 0;

            if (Array.isArray(myrange)) {
                for (var i = myrange[0]; i <= myrange[1]; i++) {

                    total += array1[i];
                }

                return total;
            } else return array1[myrange];
        }

        var mylist = [];
        var l = range.length;


        for (var n = 0; n < l; n++) {
            mylist.push(sumAll(arr, range[n]));
        }

        return Math.max.apply(null, mylist);


    }

最佳答案

算法优化:用从索引 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

附言如果您的数组可能已更新,请考虑 Fenwick tree数据结构

关于javascript - 函数内 JavaScript 函数调用的更快算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45486991/

相关文章:

c - 将 X 转换为 Y 的步骤数。(整数)

javascript - JQuery Flot x 轴上的非本地化时间

javascript - Plotly.js 在悬停在图表标题上时显示工具提示

javascript - 如何在wordpress中为类 "contentclass"的div设置ID?

c# - 使用单循环在数组中查找重复项

c++ - 卷影复制 (VSS)

javascript - window.postMessage 在 React 中没有 setTimeOut 的情况下无法在 componentDidMount 中工作

algorithm - 查找数组中元素 >= k 的最大连续范围的次线性算法

c++ - C++中的Euler 8项目,我不知道怎么了

Java 中的 java.util.Random 和递归