Our first algorithm for the maximum subarray problem, which we call MaxsubSlow,
is shown in Algorithm 1.14. It computes the maximum of every possible
subarray summation, sj,k, of A separately
It isn’t hard to see that the MaxsubSlow algorithm is correct. This algorithm
calculates the partial sum, sj,k, of every possible subarray, by adding up the values
in the subarray A[j : k]. Moreover, for every such subarray sum, it compares that
sum to a running maximum and if the new value is greater than the old, it updates
that maximum to the new value. In the end, this will be maximum subarray sum.
Incidentally, both the calculating of subarray summations and the computing of
the maximum so far are examples of an accumulator pattern, where we incrementally
accumulate values into a single variable to compute a sum or maximum (or
minimum). This is a pattern that is used in a lot of algorithms, but in this case it is
not being used in the most efficient way possible.
Analyzing the running time of the MaxsubSlow algorithm is easy. In particular,
the outer loop, for index j, will iterate n times, its inner loop, for index k, will
iterate at most n times, and the inner-most loop, for index i, will iterate at most n
times. Thus, the running time of the MaxsubSlow algorithm is O(n3). Unfortunately,
in spite of its use of the accumulator design pattern, giving the MaxsubSlow
algorithm as a solution to the maximum subarray problem would be a bad idea during
a job interview. This is a slow algorithm for the maximum subarray problem.