【问题标题】:Kadane's Algorithm not returning correct value for largest consecutive sum?Kadane的算法没有返回最大连续总和的正确值?
【发布时间】:2018-08-25 01:34:22
【问题描述】:

尝试使用 Kadane 的算法,如下所述:https://www.youtube.com/watch?v=OexQs_cYgAQ&t=721s

在这个数字数组上:[-5, 10, 2, -3, 5, 8, -20]

答案是10 + 2 – 3 + 5 + 8 = 22


但是,当我运行以下代码时,我得到了这个:

sumArray = [ 0, 20, 24, 24, 28, 44, 44 ]

不知道24 和更高的数字是如何进入那里的:( 并且22 不见了。

代码如下:

const myArray = [-5, 10, 2, -3, 5, 8, -20];

const findMaxConsecutiveSum = (arr) => {
  const sumArray = [];
  let max_so_far = 0;
  let max_ending_here = 0;

  for (let i = 0; i < arr.length; i++) {
    max_ending_here = max_ending_here + arr[i];
    // console.log('position:', i, arr[i]);
    // console.log(max_ending_here = max_ending_here + arr[i]);
    // console.log('max_ending_here', max_ending_here);

    if (max_ending_here < 0) {
      max_ending_here = 0;
    }
    else if (max_so_far < max_ending_here) {
      max_so_far = max_ending_here;
    }

    // console.log('max_so_far', max_so_far);
    sumArray.push(max_so_far);
  }

  return sumArray;
}

console.log(findMaxConsecutiveSum(myArray));

我的想法是我只需填写 sumArray 然后按最大数对其进行过滤。 但是我没有得到22 而是一大堆更大的数字?

有什么想法吗?

【问题讨论】:

    标签: javascript arrays algorithm math kadanes-algorithm


    【解决方案1】:

    您使实现变得比需要的复杂得多。从Kadane's algorithm 上的帖子来看,代码应如下所示:

    def max_subarray(A):
        max_ending_here = max_so_far = A[0]
        for x in A[1:]:
            max_ending_here = max(x, max_ending_here + x)
            max_so_far = max(max_so_far, max_ending_here)
        return max_so_far
    

    那里所述的算法希望返回一个单个数字,而不是一个数组。翻译成 JS,应该是这样的:

    const myArray = [-5, 10, 2, -3, 5, 8, -20];
    const findMaxConsecutiveSum = (arr) => {
      let max_so_far = 0;
      let max_ending_here = 0;
      for (let i = 0; i < arr.length; i++) {
        max_ending_here = Math.max(arr[i], max_ending_here + arr[i]);
        max_so_far = Math.max(max_so_far, max_ending_here)
      }
      return max_so_far;
    }
    console.log(findMaxConsecutiveSum(myArray));

    请注意,重新分配 max_ending_here 需要在 arr[i]max_ending_here + arr[i] 上调用 Math.max

    【讨论】:

    • 谢谢,我缺少的部分是Math.max
    【解决方案2】:

    据我了解 Kadane 的算法(来自 Wikipedia 帖子),实现它的方式是这样的:

    const myArray = [-5, 10, 2, -3, 5, 8, -20];
    console.log(myArray.reduce((t, v) => { t.here = Math.max(v, v + t.here);
                                           t.max = Math.max(t.max, t.here); 
                                           return t; },
                               { here : 0, max : 0})['max']);

    【讨论】:

    • 谢谢!我知道有一种方法可以使用reduce 来做到这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2019-10-13
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多