关于卡丹的算法的困惑?

时间:2017-04-28 22:18:44

标签: algorithm time-complexity

我找到了寻找最大连续子阵列的最佳解决方案。而且这种算法称为Kadane算法。这是我在geeksforgeeks上找到的pseduocode。

 Initialize:
     max_so_far = 0
     max_ending_here = 0

 Loop for each element of the array
   (a) max_ending_here = max_ending_here + a[i]
   (b) if(max_ending_here < 0)
             max_ending_here = 0
   (c) if(max_so_far < max_ending_here)
             max_so_far = max_ending_here
 return max_so_far

我不理解的部分是(b),当max_ending在这里小于0时,为什么max_ending设置为0?这背后的直觉是什么?

2 个答案:

答案 0 :(得分:2)

您希望重置最大值,因为可能会偏移最大值的任何潜在负数组元素

例如,

2 3 -6 4 2

在元素-6,如果你没有在这里重置最大值,那么你将-1的最大值带到下一次迭代中。

答案 1 :(得分:0)

如果max_ending_here小于0进入(b)部分,则意味着使用此元素的最大总和小于0.这里的结尾总和比这里结束的更好,这是只需要一个长度为0的子阵列。这就是我们在(b)部分所做的事情。

基本上,如果我们在(b)部分输入if,我们就会丢弃所有先前的元素并从头开始创建子阵列。