最大字段和问题.DOCVIP

  • 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时,由蛮力法要等很久才输出,所先把蛮力去掉,就比较分治法和动态规划法: 明显可以动态规划法所用的时间要少。

文档评论(0)

1亿VIP精品文档

相关文档