最大子段和问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s1=0;
lefts=0;
fori=center:-1:left
c1=c1+1;
lefts=lefts+a(i);
iflefts>s1
s1=lefts;
end
end
s2=0;
rights=0;
forj=center+1:1:right
c1=c1+1;
rights=rights+a(j);
ifrights>s2
fori=1:1:n
ifb>0
b=b+v(i);
else
b=v(i);
end
ifb>sum
sum=b;
end
end
R3=sum
调用函数:
v=[-20 11 -4 13 -5 -2];
tic;
MaxSum1(v)
toc;
tic;
MaxSum1(v)
toc;
tic
MaxSum3(v)
toc;
一十、运行结果
n=length(v);
left=v(1);
right=v(n);
ifleft==right
ifv(left)>0
sum=v(left);
else
sum=0;
end
else
center=(left+right)/2;
leftsum=MaxSum(v,left,center);
rightsum=MaxSum(v,center+1,right);
实验五:最大子段和问题
一、实验环境
windows xp
Matlab R2010b
二、实验内容
给定由n个整数组成的序列(a1, a2,…, an),求该序列形如的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
三、实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
1、实验数据特殊,数据样本太小。
2、因为蛮力算法程序只是一个两层循环,而分治算法的代码过长,导致我们的计时器得到的结果产生错误。
八、实验结论:
根据自己程序的算法的分析得到时间复杂性如下
蛮力算法:O(n2)
分治算法:O(nlog n )
动态规划:O(n)
九、程序源代码
算法一(蛮力法):
functionMaxSum1(v)%蛮力法O(n^2)
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解;。
伪代码:算法MaxSum2(v)
输入:一组数列v
输出:最大字段和
1.sum=0;
2.计算数组长度n=length(v);
3.设置两部分的初始值left=v(1),right=v(n);
14
0.003990
14
0.00124
14
0.003062
平均时间
0.0060002
0.001315
0.0047295
七、实验结果分析:
通过时间复杂度的分析,可以看出动态规划算法是最优的,其次是分治算法,最差的是蛮力算法,从计数得到的结果与预期的结果一致。
但是本次试验出现的问题是在计时器里显示的数据分治算法的用时比蛮力算法的长,我认为造成这种结果的因素有两个:
s2=rights;
end
end
sum=s1+s2;
ifsum<leftsum
sum=leftsum;
ifsum<rightsum
sum=rightsum;
end
end
end
R2=sum
算法三(动态规划法):
functionMaxSum3(v)%动态规划法O(n)
sum=0;
b=0;
n=length(v);
sum=0;
n=length(v);
fori=1:1:n
thissum=0;
forj=i:1:n;
thissum=thissum+v(j);
ifthissum>sum
sum=thissum;
end
end
end
R1=sum
算法二(分治法):
functionMaxSum2(v)%分治法O(nlogn)
sum=0;
4.比较left和right
4.1如果left==right
4.2则判断v(left)>0?
4.3如果大于0,则sum=v(left);
4.4否则sum=0;
算法三(动态规划法):
可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。。
输出:最大字段和及运行时间
1.sum=0;
2.计算数组长度n=length(v);
3.循环i从1—n
3.1thissum=0;
3.2循环j从i—n
3.2.1thissum=thissum+v(j);
3.2.2如果thissum>sum,则sum=thissum;
4.输出最大字段和sum;
算法二(分治法):
(3)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法;
(4)比较不同算法的时间性能;
(5)给出测试数据,写出程序文档。
四、问题分析
求最大子段和问题主要有3种方法,
1.蛮力法
2.分治法
3.动态规划法
五、算法描述:
算法一(蛮力法):
从一个数开始,逐个相加比较大小。
伪代码:算法MaxSum1
输入:一组数列v
伪代码:算法MaxSum3(v)
输入:一组数列v
输出:最大字段和
1.sum=0;
2.计算数组长度n=length(v);
3.循环iBiblioteka Baidu1—n
3.1如果b>0则b=b+v(i);
3.2否则b=v(i);
3.3如果b>sum则sum=b;
六、实验结果:
用Excel表格计算其平均值
实验数组
蛮力法
分治法
动态规划
R1 =
20
Elapsed time is 0.011056 seconds.
R1 =
20
Elapsed time is 0.001512 seconds.
R3 =
20
Elapsed time is 0.009128 seconds.
v=[-20 11 -4 13 -5 -2]
20
0.011056
20
0.001512
20
0.009128
v=[5 11 -4 -1 5 -2]
16
0.004243
16
0.001234
16
0.003662
v=[5 -11 4 -1 5 2]
10
0.004712
10
0.001274
10
0.003066
v=[-8 -14 14 -12 5 2]
lefts=0;
fori=center:-1:left
c1=c1+1;
lefts=lefts+a(i);
iflefts>s1
s1=lefts;
end
end
s2=0;
rights=0;
forj=center+1:1:right
c1=c1+1;
rights=rights+a(j);
ifrights>s2
fori=1:1:n
ifb>0
b=b+v(i);
else
b=v(i);
end
ifb>sum
sum=b;
end
end
R3=sum
调用函数:
v=[-20 11 -4 13 -5 -2];
tic;
MaxSum1(v)
toc;
tic;
MaxSum1(v)
toc;
tic
MaxSum3(v)
toc;
一十、运行结果
n=length(v);
left=v(1);
right=v(n);
ifleft==right
ifv(left)>0
sum=v(left);
else
sum=0;
end
else
center=(left+right)/2;
leftsum=MaxSum(v,left,center);
rightsum=MaxSum(v,center+1,right);
实验五:最大子段和问题
一、实验环境
windows xp
Matlab R2010b
二、实验内容
给定由n个整数组成的序列(a1, a2,…, an),求该序列形如的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
三、实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
1、实验数据特殊,数据样本太小。
2、因为蛮力算法程序只是一个两层循环,而分治算法的代码过长,导致我们的计时器得到的结果产生错误。
八、实验结论:
根据自己程序的算法的分析得到时间复杂性如下
蛮力算法:O(n2)
分治算法:O(nlog n )
动态规划:O(n)
九、程序源代码
算法一(蛮力法):
functionMaxSum1(v)%蛮力法O(n^2)
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解;。
伪代码:算法MaxSum2(v)
输入:一组数列v
输出:最大字段和
1.sum=0;
2.计算数组长度n=length(v);
3.设置两部分的初始值left=v(1),right=v(n);
14
0.003990
14
0.00124
14
0.003062
平均时间
0.0060002
0.001315
0.0047295
七、实验结果分析:
通过时间复杂度的分析,可以看出动态规划算法是最优的,其次是分治算法,最差的是蛮力算法,从计数得到的结果与预期的结果一致。
但是本次试验出现的问题是在计时器里显示的数据分治算法的用时比蛮力算法的长,我认为造成这种结果的因素有两个:
s2=rights;
end
end
sum=s1+s2;
ifsum<leftsum
sum=leftsum;
ifsum<rightsum
sum=rightsum;
end
end
end
R2=sum
算法三(动态规划法):
functionMaxSum3(v)%动态规划法O(n)
sum=0;
b=0;
n=length(v);
sum=0;
n=length(v);
fori=1:1:n
thissum=0;
forj=i:1:n;
thissum=thissum+v(j);
ifthissum>sum
sum=thissum;
end
end
end
R1=sum
算法二(分治法):
functionMaxSum2(v)%分治法O(nlogn)
sum=0;
4.比较left和right
4.1如果left==right
4.2则判断v(left)>0?
4.3如果大于0,则sum=v(left);
4.4否则sum=0;
算法三(动态规划法):
可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。。
输出:最大字段和及运行时间
1.sum=0;
2.计算数组长度n=length(v);
3.循环i从1—n
3.1thissum=0;
3.2循环j从i—n
3.2.1thissum=thissum+v(j);
3.2.2如果thissum>sum,则sum=thissum;
4.输出最大字段和sum;
算法二(分治法):
(3)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法;
(4)比较不同算法的时间性能;
(5)给出测试数据,写出程序文档。
四、问题分析
求最大子段和问题主要有3种方法,
1.蛮力法
2.分治法
3.动态规划法
五、算法描述:
算法一(蛮力法):
从一个数开始,逐个相加比较大小。
伪代码:算法MaxSum1
输入:一组数列v
伪代码:算法MaxSum3(v)
输入:一组数列v
输出:最大字段和
1.sum=0;
2.计算数组长度n=length(v);
3.循环iBiblioteka Baidu1—n
3.1如果b>0则b=b+v(i);
3.2否则b=v(i);
3.3如果b>sum则sum=b;
六、实验结果:
用Excel表格计算其平均值
实验数组
蛮力法
分治法
动态规划
R1 =
20
Elapsed time is 0.011056 seconds.
R1 =
20
Elapsed time is 0.001512 seconds.
R3 =
20
Elapsed time is 0.009128 seconds.
v=[-20 11 -4 13 -5 -2]
20
0.011056
20
0.001512
20
0.009128
v=[5 11 -4 -1 5 -2]
16
0.004243
16
0.001234
16
0.003662
v=[5 -11 4 -1 5 2]
10
0.004712
10
0.001274
10
0.003066
v=[-8 -14 14 -12 5 2]