看《编程珠玑》一书,讲解求序列的最大子序列。
问题: 给定一个实数序列x1,x2,…,xn(不必是正数),寻找一个连续的子序列xi,x(i+1),…,xj,使得其数值之和在所有连续子序列数值之和中是最大的。
算法1
思路:比较所有连续序列数值的和,找到最大的。
1. maxsofar=0;
2. for i=[0,n)
3. sum=0;
4. for j=[i,n)
5. sum=sum+x[j];
6. maxsofar=max(sum,maxsofar);
算法复杂度是O(n2)。
算法2
思路:在算法1的基础上改进。算法1中,第5行要重复求和。用一个数组预先存放从数组第一个元素开始到各个元素之间所有元素的和。比如定义数组 a[n+1],
a[0]=0,a[i]=x0+x1+…+x(i-1),(1=<i<=n)。
a[0]=0;
for i=[1..n]
a[i]=a[i-1]+x[i-1];
maxsofar=0;
for i=[0,n)
sum=0;
for j=[i,n)
sum=a[j+1]-a[i];
maxsofar=max(sum,maxsofar).
算法复杂度是O(n2)。
算法3
思路:运用归纳法的思想。如果已知x[0…i-1]的最大子序列,那么能知道x[0…