gpt4 book ai didi

javascript - Kadane 的算法没有为最大的连续总和返回正确的值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:26 28 4
gpt4 key购买 nike

尝试使用此处解释的 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 而是一大堆更大的数字?

有什么想法吗?

最佳答案

您使实现变得比需要的复杂得多。来自 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

关于javascript - Kadane 的算法没有为最大的连续总和返回正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013351/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com