求最大和连续子向量问题的算法分析
1 问题描述 这是从《编程珠玑(第 2 版)》的第 8 章“算法设计技术”中看到的一个问题。问题的描述是这样的, “问题的输入是具有 n 个浮点数的向量 x,输出是输入向量的任何连续子向量中的最大和。例如,如果输入向量包含下面 10个元素:(31,-41,59,26,-53,58,97,-93,-23,84) 那么该程序的输出为x[2...6] 的总和,即 187。” 当所有的数都是正数时,问题很容易解决,此时最大的子向量就是输入向量本身。但如果输入向量中含有负数时就不好处理了。另外,为了使问题的定义更加完整,我们认为当所有的输入都是负数时,总和最大的子向量为空向量,总和为 0。 2 问题分析 2.1 最简单直接算法 看到问题,想到的最简单直接的算法就是双层嵌套循环遍历所有的连续子向量,记录下遇到过的最大和,并持续更新。该算法的伪代码为, 1 maxSum = 0; 2 for i = 0 -> n-1 3 subVecSum = 0; 4 for j = i+1 -> n-1 5 subVecSum = subVecSum + x[j]; 6 if (subVecSum > maxSum) then 7 maxSum = subVecSum; 8 endif 9 endfor 10 endfor 这是一种简单粗暴的算法,算法复杂度为 O(n2 ),效率太低了。 如何进行改进呢