当第一个数字为负数时,Kadane的算法无法满足条件

时间:2018-03-12 11:37:07

标签: python kadanes-algorithm

我的算法如下所示:

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

在此基础上,我编写的代码如下所示:

def maxSubArraySum(a,size):

    max_so_far = 0
    max_ending_here = 0

    for i in range(0, size):
        max_ending_here = max_ending_here + a[i]
        if max_ending_here < 0:
            max_ending_here = 0

        # Do not compare for all elements. Compare only   
        # when  max_ending_here > 0
        elif (max_so_far < max_ending_here):
            max_so_far = max_ending_here

    return max_so_far

# Driver function to check the above function 
a = [-1,-2,-3,-4]
print ("Maximum contiguous sum is", maxSubArraySum(a,len(a))).

这段代码在output 0时以某种方式给了我array is [-1,-2,-3,-4]。我现在的代码中有什么要纠正的吗?

3 个答案:

答案 0 :(得分:1)

  

Kadane算法的简单概念是寻找所有正面的   数组的连续段(max_ending_here用于此)。   并跟踪所有正数之间的最大和连续段   段(max_so_far用于此)。

因此,具有所有负数的列表将使算法跳闸。 如果你考虑一下,所有负整数列表的最大总和只不过是max(list_of_negative_integers)

但是,如果要创建通用解决方案,

  • 添加另一个变量max_in_arrayflag
  • 设置标志
  • 循环浏览项目
    • 在循环时保持max_in_array最新。
    • 如果您找到正数,请将标志设置为关闭。
    • 执行现有逻辑以更新已有的两个变量
  • 如果该标志已关闭,则返回max_so_far,否则max_in_array

以下是一个参考实现:

def max_sub_array_sum(arr):
    max_so_far = max_ending_here = 0
    max_in_arr = arr[0]
    flag = True

    for item in arr:
        if flag:
            max_in_arr = max(max_in_arr, item)

        max_ending_here = max(0, max_ending_here + item)
        max_so_far = max(max_so_far, max_ending_here)

        if item > 0:
            flag = False

    return max_in_arr if flag else max_so_far

另一种没有额外变量的方法:

def max_sub_array_sum(arr):
    max_so_far = curr_max = arr[0]

    for item in arr[1:]:
        curr_max = max(item, curr_max + item)
        max_so_far = max(max_so_far, curr_max)

    return max_so_far

答案 1 :(得分:1)

Python以更短,更易读的代码而闻名,而3.0解决方案可能会对您有所帮助。 为了更好地了解算法,请观看以下视频:-https://www.youtube.com/watch?v=2MmGzdiKR9Y

def max_sub_array_sum(arr):

    kadance=[]
    #kadance[i]=arr[0]
    kadance.append(arr[0])

    for i in range(1,len(arr)):
        #kadance[i] = max(kadance[i-1]+arr[i],arr[i])
        temp = max(kadance[i-1]+arr[i],arr[i])
        kadance.append(temp)

    ans = kadance[0]

    for i in range(1,len(kadance)):
        ans = max(ans,kadance[i])

    return ans

print(max_sub_array_sum([-1,-2,-3,-4]))

答案 2 :(得分:0)

只需反转if语句-在更新数组之前检查max即可。

if (max_so_far < max_ending_here) 
                max_so_far = max_ending_here; 
if (max_ending_here < 0) 
                max_ending_here = 0;