阅读《编程珠玑》,书中讨论了一个算法的实现效率问题,这个问题之前在某本书上见到过,但重新遇到时,却还是无法让思维发散来思考,自我反省下先。

问题描述:一个具有n个浮点数字的向量x;其输出是在输入的任何相邻子向量中找出的最大和。
输入:31,-14,59,26,-53,58,97,-93,-23,84
输出:返回的是x[2,...,6]的总和,或187.

思路一:采用三层循环,直接暴力计算,算法复杂度O(n^3)。很没技术含量,很傻很天真。
思路二:考虑到x[i,..,j]中的总和与前面已计算的x[i,...,j-1]相关,所以可快速计算总和,减少循环。复杂度为O(n^2)。
伪代码:
maxsofar=0
for i = [0,n)
    sum = 0
    for j = [i,n) 此处我认为应该是[0,i],有空看看先
    sum += x[j]
            maxsofar = max(maxsofar,sum)
思路三:采用分治算法的思想,复杂度为O(nlogn)。
伪代码:
float maxsum3(l,u)
if(l>u)
return 0
if(l == u)
return max(0,x[l])
m = (l + u)/2
lmax = sum = 0
for (i = m; i >= l; i--)
sum += x[i]
lmax = max(lamx,sum)
rmax = sum = 0
for i =(m,u]
sum += x[i]
rmax = max(rmax,sum)
return max(lmax+rmax,maxsum3(l,m),maxsum3(m+1,u))
最初的调用方法为answer = maxsum3(0,n-1)