算法分析与设计实验报告最大字段和问题.docx
- 文档编号:23327014
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:10
- 大小:258.41KB
算法分析与设计实验报告最大字段和问题.docx
《算法分析与设计实验报告最大字段和问题.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告最大字段和问题.docx(10页珍藏版)》请在冰豆网上搜索。
算法分析与设计实验报告最大字段和问题
实验报告
课程名称算法分析与设计
实验项目名称最大字段和问题
班级与班级代码
实验室名称(或课室)实验楼802
专业:
计算机科学与技术
任课教师:
李绍华
学号:
姓名:
实验日期:
2016年11月25日
广东财经大学教务处制
姓名实验报告成绩
评语:
等级
项目
优
良
中
差
算法描述的正确性
算法时间分析正确性
实验结果的正确性
附程序代码正确性
报告格式的正确性
指导教师(签名)
年月日
说明:
指导教师评分后,实验报告交院(系)办公室保存。
一、实验目的
(1)能够熟悉最大字段和问题这个算法
(2)分别使用三种不同算法:
暴力算法、分治算法、动态规划算法,体会其算法思想并比较时间复杂度。
二、实验设备
硬件:
P42.0G1G内存60G硬盘以上电脑
软件:
C、C++编程环境,Java编程环境,windows7
三、问题与算法描述
1、问题描述
给定由n个整数(可能为负整数)组成的序列a1、a2、……an,求该序列形如
的字段和的最大值。
当所有整数均为负整数时定义其最大字段和为0。
依次定义,所求的最优值为max{0,
}。
2、算法描述
BF算法
对于起点i,遍历所有长度为1,2,…,n-i+1的子区间和,遍历所有的字
段,找出最大字段和。
分治算法
求子区间及最大和,从结构上是非常适合分治法的,因为所有子区间
[start,end]只可能有以下三种可能性:
1.在[1,n/2]这个区域内
2.在[n/2+1,n]这个区域内
3.起点位于[1,n/2],终点位于[n/2+1,n]内
以上三种情形的最大者,即为所求.前两种情形符合子问题递归特性,所
以递归可以求出.对于第三种情形,则必然包括了n/2和n/2+1两个位置,
这样就可以利用第二种穷举的思路分别向左右扩张求出。
动态规划
扩展到二维空间令b[j]表示以位置j为终点的所有子区间中和最大的一
个子问题:
如j为终点的最大子区间包含了位置j-1,则以j-1为终点的最
大子区间必然包括在其中,如果b[j-1]>0,那么显然b[j]=b[j-1]+
a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含;如果
b[j-1]<=0,那么b[j]=a[j],因为既然最大,前面的负数必然不能使你
更大。
3、算法时间复杂性分析
BF算法:
经过两次嵌套循环时间复杂度:
O(n2)
分治算法:
每递归一次需logn,全部需要n次运算量,时间复杂度:
O(nlogn)动态规划算法:
只经历了一次循环,时间复杂度:
O(n)
四、实验调试过程中出现的问题
实验过程中,主要遇到了两个问题,随机函数和时间计算函数不知如何进行,虽然之前在以前的课程中学习过,但是由于时间长已经忘记,通过查阅和同学帮助最终解决。
五、实验结果
1.源代码
package算法实验2;
importjava.util.Random;
publicclassMaxfield{
staticinta[]=newint[1001];
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Randomran=newRandom();
for(inti=1;i<=1000;i++){
a[i]=ran.nextInt(21)-7;
if(i%10==0)
System.out.print("");
}
longstarttime=System.nanoTime();
intsum1=maxSum1();
longendtime=System.nanoTime();
longstarttime1=System.nanoTime();
intsum2=maxSum2(1,a.length-1);
longendtime1=System.nanoTime();
longstarttime2=System.nanoTime();
intsum3=maxSum3();
longendtime2=System.nanoTime();
System.out.println("BF算法所求最大字段和为:
"+sum1+"BF算法所用时间:
"+(endtime-starttime));
System.out.println("分治算法所求最大字段和为:
"+sum2+"分治算法所用时间:
"+(endtime1-starttime1));
System.out.println("动态规划所求最大字段和为:
"+sum3+"动态规划所用时间:
"+(endtime2-starttime2));
}
publicstaticintmaxSum1(){
longsysDate1=System.currentTimeMillis();
intn=a.length-1;
intsum=0;
intbesti=0;intbestj=0;
for(inti=1;i<=n;i++){
intthissum=0;
for(intj=i;j<=n;j++){
thissum+=a[j];
if(thissum>sum){
sum=thissum;
besti=i;
bestj=j;
}
}
}
longsysDate2=System.currentTimeMillis();
returnsum;
}//BF算法
publicstaticintmaxSum2(intleft,intright){
intsum=0;
if(left==right)sum=a[left]>0?
a[left]:
0;
else{
intcenter=(left+right)/2;
intleftsum=maxSum2(left,center);
intrightsum=maxSum2(center+1,right);
ints1=0;
intlefts=0;
for(inti=center;i>=left;i--){
lefts+=a[i];
if(lefts>s1)s1=lefts;
}
ints2=0;
intrights=0;
for(inti=center+1;i<=right;i++){
rights+=a[i];
if(rights>s2)s2=rights;
}
sum=s1+s2;
if(sum if(sum } returnsum; }//分治算法 publicstaticintmaxSum3(){ intn=a.length-1; intsum=0; intb=0; for(inti=1;i<=n;i++){ if(b>0)b+=a[i]; elseb=a[i]; if(b>sum)sum=b; } returnsum;//动态规划 } } 2.结果截图 时间单位: ns (1)10个数据 (2)50个数据 (3)100个数据 (4)500个数据 (5)1000个数据 (6)5000个数据 (7)10000个数据 (8)100000个数据 通过时间复杂度的分析和实验结果可以看出各算法的好坏依次是动态规划算法、分治算法,BF算法,当数据较小时各算法之间的差距并不大,甚至有时BF算法还优于分治,而且数据越大,BF算法的缺点越明显,与动态规划的差距越大。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告 最大 字段 问题