您好,欢迎访问三七文档
《算法设计与分析》课程设计报告题目:最大子段和问题院(系):信息科学与工程学院专业班级:0学生姓名:0学号:0指导教师:02014年12月29日至2015年1月9日华中科技大学武昌分校制算法设计与分析课程设计任务书一、设计题目最大子段和问题问题描述:给定n个整数(可能有负整数)a1,a2,…,an。求形如ai,ai+1,…aji=1,2,…n,j=1,2,…n,i≤j,求出ai,ai+1,…aj子段和的最大值。当所有整数均为负值时定义其最大子段还和为0。例如:当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,2)时,最大子段和为(a2,a3,a4)=20即=20i=2,j=4二、设计主要内容具体要求如下:(1)使用蛮力算法实现(2)使用分治策略算法实现(3)使用动态规划算法实现(4)对各种算法的时间复杂度进行分析和比较。(5)设计出相应的菜单,通过菜单的选择实现各个功能三、原始资料杨克昌《计算机常用算法与程序设计案例教程》清华大学出版社2011.7四、要求的设计成果(1)实现该系统功能的程序代码(2)撰写符合规范要求的课程设计报告jikka五、进程安排序号课程设计内容学时分配备注1选题与搜集资料1天2分析与设计1天3模块实现4天4系统调试与测试2天5撰写课程设计报告2天合计10天六、主要参考资料[1]吕国英.算法设计与分析.第2版.北京:清华大学出版社,2011.[2]王晓东.算法设计与分析.北京,清华大学出版社,2009.[3]徐士良.计算机常用算法.第2版.北京,清华大学出版社出版,2010.指导教师(签名):20年月日目录1.常用算法…………………………………………………………………………………页码1.1蛮力算法………………………………………………………………………………页码1.2××××××××………………………………………………………………………页码1.3××××××××………………………………………………………………………页码2.问题分析与算法设计……………………………………………………………………页码2.1××××××××………………………………………………………………………页码2.2××××××××………………………………………………………………………页码2.3××××××××………………………………………………………………………页码3.算法实现…………………………………………………………………………………页码3.1××××××××………………………………………………………………………页码3.2××××××××………………………………………………………………………页码3.3××××××××………………………………………………………………………页码4.测试与分析………………………………………………………………………………页码4.1××××××××………………………………………………………………………页码4.2××××××××………………………………………………………………………页码4.3××××××××………………………………………………………………………页码4.4××××××××………………………………………………………………………页码4.5××××××××………………………………………………………………………页码4.6××××××××………………………………………………………………………页码4.7××××××××………………………………………………………………………页码5.总结………………………………………………………………………………………页码………………………………………参考文献………………………………………………………………………………………页码附录(源代码)………………………………………………………………………………页码11常用算法1.1蛮力算法1.1.1蛮力算法的基本思想:蛮力法是一种简单直接解决问题的方法基于问题描述和所涉及的概念定义。1.1.2适用该算法的问题特点:第一、可以应用蛮力法来解决广阔领域的各种问题。第二、对于一些重要的问题来说(比如:排序、查找、矩阵乘法和字符串的匹配)蛮力法可以产生一些合理算法。第三、蛮力法可以用来解决能够接受速度较慢对实例求解第四、效率通常很低,仍可以用来解决小规模的问题实例1.1.3蛮力算法求解的步骤和算法的框架例如枚举法步骤1找出枚举范围:分析问题所涉及的各种情况。步骤2找出约束条件:分析问题的解需要满足的条件,并用逻辑表达式表示。因此蛮力算法都有寻找问题范围寻找约束条件等步骤。1.2分治算法分治算法的基本思想、适用该算法的问题特点、算法求解的步骤和算法的框架等几个方面进行叙述。1.2.1分治算法思想把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。21.2.2适用该算法的问题特点:分治法所能解决的问题一般具有以下几个特征:1)该问题的规模缩小到一定的程度就可以容易地解决2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。3)利用该问题分解出的子问题的解可以合并为该问题的解;4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;、第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。分治法的基本步骤分治法在每一层递归上都有三个步骤:step1分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;step2解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题step3合并:将各个子问题的解合并为原问题的解。它的一般的算法设计模式如下:Divide-and-Conquer(P)1.if|P|≤n02.thenreturn(ADHOC(P))3.将P分解为较小的子问题P1,P2,...,Pk4.fori←1tok5.doyi←Divide-and-Conquer(Pi)△递归解决Pi6.T←MERGE(y1,y2,...,yk)△合并子问题7.return(T)其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1,P2,...,Pk的相应的解y1,y2,...,yk合并为P的解。31.2.4分治法的复杂性分析一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:T(n)=kT(n/m)+f(n)通过迭代法求得方程的解:递归方程及其解只给出n等于m的方幂时T(n)的值,但是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而当mi≤nmi+1时,T(mi)≤T(n)T(mi+1)。1.2.5可使用分治法求解的一些经典问题(1)二分搜索(2)大整数乘法(3)Strassen矩阵乘法(4)棋盘覆盖(5)合并排序(6)快速排序(7)线性时间选择(8)最接近点对问题(9)循环赛日程表(10)汉诺塔1.2.6依据分治法设计程序时的思维过程实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。1、一定是先找到最小问题规模时的求解方法2、然后考虑随着问题规模增大时的求解方法3、找到求解的递归函数式后(各种规模或因子),设计递归程序即可。.41.3动态规划算法1.3.1基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。1.3.2基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。1.3.3适用的情况能采用动态规划求解的问题的一般要具有3个性质:(1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。(2)无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)51.3.4求解的基本步骤动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。初始状态→│决策1│→│决策2│→…→│决策n│→结束状态图1动态规划决策过程示意图(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。实际应用中可以按以下几个简化的步骤进行设计:(1)分析最优解的性质,并刻画其结构特征。(2)递归的定义最优解。(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值(4)根据计算最优值时得到的信息,构造问题的最优解61.3.5算法实现的说明使用动态规划求解问题,最重要的就是确定动态规划三要素:(1)问题的阶段(2)每个阶段的状态(3)从前一个阶段转化到后一个阶段之间的递推关系。因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是
本文标题:课程设计报告
链接地址:https://www.777doc.com/doc-6015659 .html