Kadane's Algorithm

by Jakob Hackstein | Jun 04, 2021

Kadane's algorithm solves the maximum-subarray-problem, where the contiguous subarray with maximal sum in any given array A has to be determined. The algorithm uses a hidden dynamic programming pattern as local results at index (i - 1) are stored to compute the following result at index i. However, local results are stored in a single variable instead of an array, like typical dynamic programming approaches prefer.

Implementation

function kadanes(A):
    local_best = global_best = A[0]

    for i from 1 to length(A):
        local_best = max(A[i], A[i] + local_best)
        global_best = max(local_best, global_best)

    return global_best

Explanation

Although the algorithm might seem to skip certain combinations of potential maximal subarrays, the maximum-subarray-problem is always solved optimal. Let's consider the i-th iteration with current element A[i]. The local_best represents the sum of the currently viewed subarray. If local_best can be improved by adding A[i], the local_best is updated accordingly. If the current element worsens the local_best, then A[i] is considered to be the first element of a new subarray that is analysed from now on. global_best keeps track of the best sum found so far and is updated if local_best finds a better sum.

For a trivial example with an array of positive integers A = [1, 2, 3, 4] the local_best can always be improved by the following element, as they are all positive. Thus, local_best adds all elements and improves on global_best. The maximum subarray in this case is A and therefore kadanes() returns 10.

The key insight to understand the optimality of kadanes() can be illustrated with the following invariants: At iteration i > 0 of the algorithm, the maximum-subarray solution for A[0, ..., i - 1] is global_best whereas local_best represents the best sum for a currently analysed subarray starting from arbitrary j, e.g. A[j, ..., i - 1].

Usage

The function containing Kadane's algorithm needs an non-empty array as input and returns the maximum-subarray sum.

A = [3, -4, 2, 1, 0, ...]
maxSubSum = kadanes(A)

Complexity

Time

For arrays of length nn: O(n)\mathcal{O}(n)

Space

O(1)\mathcal{O}(1)