- 5
- 0
- 约小于1千字
- 约 3页
- 2020-04-15 发布于天津
- 举报
最大字段和问题.DOC
最大字段和问题
1.实验题目
给定由N个整数(可能有负整数)组成的序列(,,…,),求该序列形如的子段和的最大值,当所有整数均为负整数是,其最大子段和为0。
2.实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。
3.实验分析
蛮力法:利用3个for的嵌套(实现从第1个数开始计算子段长度为1,2,3…n的子段和,同理计算出第2个数开始的长度为1,2,3…n-1的子段和,依次类推到第n个数开始计算的长为1的子段和)和一个if(用来比较大小),将其所有子段的和计算出来并将最大子段和赋值给summax1。
用了3个for嵌套所以时间复杂性为○(n3)。
分治法:
(1)划分:按照平衡子问题的原则,将序列(,,…,)划分成长度相同的两个字序列(,…,)和(,…,)。
(2)求解子问题:对于划分阶段的情况分别的两段可用递归求解,如果最大子段和在两端之间需要分别计算s1=,s2=,则s1+s2为最大子段和。若然只在左边或右边,那就好办了,前者视s1为summax2,后者视s2 o summax2。
(3)合并:比较在划分阶段的3种情况下的最大子段和,取三者之中的较大者为原问题的解。
(4)时间复杂性分析: f(n) = 2*f(n/2) + ○(n/2), 最后为○(nlogn)。
动态规划法:
动态规划法求解最大字段和问题的关键是要确定动态规划函数。记
则
由b(j)的定义,当b(j-1)0是,b(j)=b(j-1)+a,否则,b(j)=a。可得如下递推式:
代码实现过程中只用了一个for, 时间复杂性为:○(n)
三种方法写在同一cpp上,比较其时间,由于分治法和动态规划法,要用比较比长的序列,故把程序设计成有手动输入和随机输入,对于随机生成函数rand()只生成正数,故引入了rand()/13-1129,使其既有正数生成,也有负数生成。程序运行如下:
首先先用手动输入:
由于要比较时间,故要用到大量数据,所以用随机输入:
至于序列在此不作输出,若输出将会造成截屏不方便,
可见蛮力法只可以处理小理的数据。
当数据量超过10000时,由蛮力法要等很久才输出,所先把蛮力去掉,就比较分治法和动态规划法:
明显可以动态规划法所用的时间要少。
您可能关注的文档
最近下载
- 【部编统编版语文】四下语文 全册教材分析(解析)PPT课件合集.pptx VIP
- 泄密事件应急预案(通用版).docx VIP
- 一元二次方程十字相乘法练习100题及答案.docx VIP
- 2025圆锥曲线中档题100道(试题版).pdf VIP
- 2025年演出经纪人演出项目广告投放策略与效果评估专题试卷及解析.pdf VIP
- 2023年广州育才实验学校小升初入学数学真卷附参考答案 .pdf VIP
- 环境科学与工程专业英语第四版(有道文档翻译版).docx VIP
- 2025年特许金融分析师ESG在大宗商品与基础设施投资中的应用专题试卷及解析.pdf VIP
- 2025年江西新能源科技职业学院单招职业技能测试题库及完整答案1套.docx VIP
- 2025年演出经纪人国际演出结算中的国际保险费用处理专题试卷及解析.pdf VIP
原创力文档

文档评论(0)