第一篇:算法设计与分析学习报告
算法课程学习报告
持续13周的高级算法设计与分析课程结束了。选修了这门课程的同学们即将迎来最后的考试。回顾这半年以来关于这么课程的学习情况,我体会最深的是:不论是从深度还是从广度上,现在所习的算法比曾经学习的算法难度增加了很多。但是邓教授极富经验的教学和详细的课件,为我的学习提供了很大的方便。可是毕竟我以前的底子不够厚,基础不够劳,在听课中会出现跟不上教师思路的现象。我也积极的采取措施,争取处理好这种情况。总体说来,上完算法课,我还是学到了很多东西的。下面我就对所学的内容进行梳理归纳,总结一下我在学习中的体会和研究心得。
算法课程的开课阶段,邓教授为我们简单介绍了算法,课堂上可能用到的参考资料,以及一些著名的算法方面的书籍,为我的学习提供潜在的工具。我购买了一本教材——《算法导论》。这本书够厚,够详细。但是我一直没有机会仔细的研读。我想有一天希望能够好好读一下。在介绍算法的课堂上,我还了解了算法相关的一些基本概念,算法的重要性,还有算法的历史。我印象最深的就是一个叫图灵的外国人。对计算机科学与技术这个领域做出了图书贡献。我个人认为,堪比爱因斯塔发现相对论的贡献。都揭示了某个领域的本质。开辟的一个领域的发展。对于整个人类来说,他们这类人都是功不可没的。已经不能简单的用伟人来形容他们。但是人类社会需要这样的人,社会需要一些人的推动才能进步。说到这里,我不禁要想,算法到底有什么用,也许答案是简单的,为了方便写程序实现系统功能。这只是表面的用途。我觉得最本质的作用是为了社会进步。辩证唯物主义自然观中有关于科学技术的详细定义。之所以产生科学技术是为了发挥人的主观能动性去改造自然。学习和研究算法正是为了让人在一定的限度内改造自然。我不是在扯,而是在写算法报告和背自然辩证法资料的时候产生的心得体会,不知道算不算邓教授要求的心得。介绍完算法历史以后,就进入的真正的算法设计与分析的学习。首先是算法的定义和时间复杂度等。然后,为了方便以后的课程学习,我学到了一些必要的数学知识,既是为了以后的学习打基础,也是为了弥补在曾经的学习中的不足。这些数学知识包括生成函数和主定理等。这些数学知识都是连在高等数学里都没有接触过的。不知道属于哪个范畴的数学,反正用两个字形容就是“厉害”。我学的不亦乐乎,晕头转向。
几堂课后,对算法这一概念有了基本的了解,也对数学知识进行了补强。我们在邓教授的带领下,进入了实际的算法技术的学习。一共有六种常用技术:分治法,贪心法,周游法,回溯法,动态规划法,分支界定法。最先学习的是六种技术之首,应用最广泛的,分治法。分治法的算法思想真的很神奇,不止分治,这几种算法常用技术都很神奇,可以将问题的求解进行很大程度上的优化,而且有些还是反人类的想法。对我的智商着实是一个考验。当然了,算法的学习不只是靠智商的,更要靠辛勤的汗水,即便有时候汗水没有智商有用,但是你还是要付出汗水。因为这是一种福报。能力有多大,就享有多大的成果。这就好比一个人中了500万的头彩。这个人有能力享有这500万的财富吗?如果他有足够很好的驾驭这笔财富的能力,那么在未来,他会让这笔财富继续增长,直到达到他的能力的极限情形。如果他没有驾驭的能力,用不了多久,他就会分崩离析。我的思维再一次被学科外的体会占据了。言归正传,我学了很多利用分治法结局的问题,比如寻找最近点对,求数组的第k小元等。这些都是利用分治法解决的。在这之中,出现了平衡的概念,和分治法是密切相关,甚至是不可分的。在这部分
中,最后学习了离散傅立叶变换和快速傅立叶变换。
接下来的学习的算法技术是动态规划法。这种技术和分治法有很多相同点,最基本的就是都是讲问题分解为若干子问题,不同点是分治的子问题是相互独立的,动态规划的子问题是重复的,这也决定了,一个用递归的计算方式,一个用递推的计算方式。我也学到了利用动态规划法解决的很多问题,简单的如矩阵连成问题,复杂一点的有最长公共子序列问题,最有二分搜索树和流水作业问题。在这部分知识中,还有一点,就是备忘录方法,可以说是对动态规划法的一个完善和改进。
随着课程的进行,我又学到了集合算法。主要知识点有平摊分析,合并算法,2-3树,以及一些概念如字典,可并堆和可连接队列等。需要注意的是这部分留过作业的FIND()和FIND_DEPTH()两个函数。还有有穷自动机问题。
接下来学习的是随机算法。应该说这部分内容还是相当重要的,而且应用也非常广泛。在日常生活中更是随处可见。举一个最简单的例子,当我在看NBA比赛的时候,每节的休息时间都要抽奖,那个随机显示的中奖观众就是基于随机算法实现的功能。在这部分内容中,我学到了3个重要的随机算法:KMP、Monte Carlo和Las Vegas算法的评价和比较。这也是作为作业研究过的。也学习的素数判定随机算法。这里,要明白Miller-Rabin算法,是Rabin在Miller提出的基础上,研究出来的很常用的算法。
在课程的最后阶段,我学到了RAM和RASP这两个概念。应该说这部分知识是我学的最不好的地方。算法本质还没有了解。还需要进一步的研究。最后是NP-C和NP-hard问题。
以上简单回顾的整个算法过程中学到的知识和自己的一些心得体会。都是一字一字码出来的。觉悟抄袭。当然,有很多不足也有很多不全面的地方。但是,总的说来还是收货颇丰的。这也归功于邓教授优秀的教学质量。在这里感谢教授的教导,祝春节快乐,身体健康。
第二篇:数据结构算法设计与分析
数据结构算法设计与分析、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;
网页制作、程序设计Java、JSP程序设计、Oracle、XML程序设计、计算机网络、SSH(Struts+Spring+Hibernate)框架、Java EE程序设计、Ajax程序设计、Linux+PHP+MySQL程序设计、Android手机开发、UML系统分析与设计、性能测试、自动化软件测试、软件质量保证、毕业设计及项目综合实训等。
数据结构、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、金融学概论、西方经济学等基础理论课程;
网页制作、程序设计Java、JSP程序设计、J2EE程序设计、SQL Server数据库、Oracle数据库、Linux操作系统、UML系统分析与设计、软件工程、XML程序设计、SSH框架、金融市场学、ERP财务管理、管理信息系统、投资银行学、商业银行学、国际金融管理、毕业设计及项目综合实训等专业课程。
数据结构、计算机网络、计算机组成原理、操作系统原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;
网页制作、程序设计Java、JSP程序设计、J2EE程序设计、XML程序设计、Ajax程序设计、SSH框架、Android手机开发、Linux+PHP+MySQL程序设计、SQL Server数据库、Linux操作系统、UML系统分析与设计、软件项目管理、行业标准与规范、IT服务管理、IT职业英语、毕业设计及项目综合实训等专业课程
第三篇:算法设计与分析学习心得
算法设计与分析学习心得
班级:物联网1201 姓名:刘潇 学号:1030612129
一、实验内容:
这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。
二、学习掌握:
基本程序描述:
(1)货郎担问题:货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有(n一1)!条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。货郎担的程序实现了利用穷举法解决货郎担问题,可以在城市个数和各地费用给定的情况下利用穷举法逐一计算出每一条路线的费用,并从中选出费用最小的路线。从而求出问题的解
(2)费用矩阵:费用矩阵的主要内容是动态生成二维数组。首先由键盘输入自然数,费用矩阵的元素由随机数产生,并取整,把生成的矩阵存放在二维数组中,最后把矩阵内容输出到文件和屏幕上。它采用分支界限法,分支限界法的基本思想是对包含具有约束条件的最优化问题的所有可行解的解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解计算一个下界或上界。动态生成二维n*n的数组程序利用指针表示数组的行和列,并逐一分配空间,在输入n的数值后,系统自动分配空间,生成n*n的数组,并产生随机数填充数组,最后将结果输入到指定文件中。
(3)Mfc:在下拉列表框中添加内容程序,在下拉列表对应的函数中利用addstring添加需要的内容。首先定义下拉列表框为ccombox型,并定义其属性名,利用addstring函数可以任意添加需要的内容。a排序问题:快速排序的运行时间与划分是否对称有关,其最坏情况发生在划分过程中产生的两个区域分别包含n-1个元素和1个元素的时候。其算法的时间复杂度为O(n 2),在最好的情况下每次划分的基准恰好为中值,可得其算法时间复杂度为O(n㏒n)。算法的实现和理解和代码实现完全是两回事,想要完全掌握一种算法,需要动手实践,用代码实现,才能理解透彻,真正掌握。b对话框下拉列表:这个项目简单易懂,轻松实现。三.疑问与总结:
货郎担的问题,我认为穷举法相对比而言是比较初级的方法,费时耗力,适合在练习时选用,但是在实际问题中不建议采用。克鲁斯卡尔或者普里姆算法求取最小生成树的方法来解决货郎担的问题是更适合现实解决问题的。我认为程序可以用switch函数来将函数分成几个部分更人性化,比如分为解决问题的的选项,输出结果选项,退出程序选项等。再有就是费用矩阵的值可以从文件中读取,而结果也可以直接放在指定文件中,这样在实际应用中比较广泛。
动态生成二维数组的程序我认为如果按照规范性,我的方法是中规中矩的,毕竟再向下延伸,生成三维的数组,需要三层的指针来实现。但是就程序的简化程度和计算机处理时间来说,我认为这样双层指针的算法有些太占用内存,毕竟要给行和列各分配n个空间。我通过与同学的交流,我发现可以用1位数组来实现二维的n*n的数组。首先分配n*n的空间,然后通过循环在一行的数据达到n时自动换行。这样程序得到了一定的简化,并且减少了一定的内存使用。我认为这种方法是比较贴合实际的。
四.心得体会
在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。
如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。
第四篇:算法设计与分析试题1
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
算法设计与分析试题1
一、单选题(每题2分,共40分)1、0518号台风“达维”过后,要对各个单位捐款救灾情况进行分组制表,并进行积分排序,一般使用的专业电子处理软件有(B)
A、powerpoing B、Excel C、Word D、Visual Basic
2、一位爱好程序设计的同学,想通过程序设计解决“韩信点兵”的问题,他制定的如下工作过程中,更恰当的是(C)
A、设计算法,编写程序,提出问题,运行程序,得到答案
B、分析问题,编写程序,设计算法,运行程序,得到答案
C、分析问题,设计算法,编写程序,运行程序,得到答案
D、设计算法,提出问题,编写程序,运行程序,得到答案
3、交通警察到达案发现场,一般按照下列哪种思路开展工作(D)
①观察、分析现场 ②收集必要的信息 ③进行判断、推理 ④按一定的方法和步骤解决
A、②①③④ B、①③②④ C、③①②④ D、①②③④
4、下面说法正确的是(A)
A、算法+数据结构=程序 B、算法就是程序
C、数据结构就是程序 D、算法包括数据结构
5、下列常量说明中,符合语法的是(D)
A、CONST color=red B、CONST const=10*5
C、CONST xl:=3.9; D、CONST color=”abcd”
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
6、VB中将两个字符串连接起来的运算符有:+和&,那么“123”+45结果是(A)
A、168 B、12345 C、”123” D、45
7、字符串”ABCD”和字符串”DCBA”进行比较,如果让比较的结果为真,应选用关系运算符(B)
A、> B、< C、= D、>=
8、设a,b,c,d,e均为整型变量,且a=13,b=2,c=10,d=3,e=2,则表达式“a-b*c d MOD e”的值是(A)
A、13 B、-7 C、ll D、0
9、已知A,B,C,D是简单变量,且都已有互不相同的值,执行语句B=8;A=C;D=A;D=B;后,其值相等的变量是(B)
A、A,D B、A,C C、C,B D、B,A
10、结构化程序设计由三种基本结构组成,下面哪个不属于这三种基本结构(B)
A、顺序结构 B、输入、输出结构 C、选择结构 D、循环结构
11、下列结果为真的关系表达式是(C)
A、”A”<100 B、23.5<20 C、23<45 AND 72>8 D、5 12、以下运算符中运算优先级最高的是(D) A、+ B、OR C、> D、13、整除运算时,若运算量为实数,则先取整,后相除,结果为整型或长整型。下列哪种是整除运算符(D) A、+ B、Mod C、/ D、精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 14、VB结束程序的运行可以单击程序窗体的“关闭”按钮,或单击VB工具栏上的“结果”按钮,哪种是“结束”按钮(B) A、B、C、D、15、图标控件属于哪种基本控件(B) A、标签 B、文本框 C、按钮 D、图像 16、要交换变量A和B之值,应使用的语句组是(B) A、A=B;B=C;C=A B、C=A;A=B;B=C C、A=B;B=A D、C=A;B=A;B=C 17、执行下面的程序段后,x 的值为(A) x=5 For i=1 To 20 Step 2 x=x+i5 Next i A、21 B、22 C、23 D、24 18、在窗体上画一个命令按钮,然后编写如下事件过程: Private Sub Command1_Click() Dim I as integer,j as integer,x as integer x=4 For i=1 To 4 For j =1 To 3 x=x+6 Next j 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 Next i Print x End Sub 程序运行后,单击命令按钮,程序循环次数是(B) A、4 B、12 C、3 D、6 19、在窗体上画一个命令按钮,然后编写如下事件过程: Prevate Sub Command1_Click() Dim a as integer,b as integer, x as integer x=0 Do Until x=-1 a = InputBox(“请输入A的值”) a = Val(a) b = InputBox(“请输入B的值”) b = Val(b) x = InputBox(“请输入x的值”) x = cint(x) a = a+b+x Loop Print a End Sub 程序运行后,单击命令按钮,依次在输入对话框中输入5、4、3、2、1、-1,则输出结果为(A) 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 A、2 B、3 C、14 D、15 20、在窗体上画一个文本框(其中Name属性为Text1),然后编写如下事件过程: Private Sub Form_Load() Dim i as integer,sum as integer Text1.Text=“" For i=1 To 10 Sum=Sum+i Next i Text1.caption=Sum End Sub 上述程序的运行结果是(C) A、在文本框Text1中输出55 B、在文本框Text1中输出0 C、出错 D、在文本框Text1中输出不定值 二、多选题(每题2分,共20分) 1、算法描述可以有多种表达方法,下面哪些方法可以描述“水仙花数问题”的算法(ABC) A、自然语言 B、流程图 C、伪代码 D、机器语言 2、程序设计语言的发展经历哪几个过程(ABC) A、机器语言 B、汇编语言 C、高级语言 D、自然语言 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 3、“闰年问题”的算法可以用哪些语言实现(ABCD) A、Basic B、Pascal C、C++ D、C 语言 4、算法应该具有哪些重要的特征(ABCD) A、有穷性 B、确定性 C、输入、输出 D、可行性 5、“今有物不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?”这个问题属于(ABD) A、“韩信点兵问题” B、“鬼谷算法问题” C、“水仙花数问题” D、“闰年问题” 6、编制计算机程序解决问题的过程有:描述问题、算法设计、编写计算机程序和调试等,其中,对算法描述正确的是(AD) A、算法是解决问题的步骤 B、解题的步骤是有限的 C、算法就是解题的算式 D、算法是可以被表述和实现 7、以下属非法用户自定义标识符(常量和变量命名)的是(ACD) A、8ad B、ad C、_ad D、const 8、为了便于数据的表示与处理,VB提供哪几种基本数据类型(ABCD) A、数值型 B、字符串型 C、布尔型 D、日期型 9、日期型数据专门用来处理日期和时间,哪种属于日期型数据(AB) A、#2005/10/23# B、#2005/01/02# C、2005/10/23 D、“2005/1/2” 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 10、哪些文件属于某一VB工程中的文件(ABCD) A、.vbp B、.frm C、.ocx D、.bas 三、判断题(每题1分,共10分) 1、Visual Basic是美国微软公司于1991年推出的基于Basic的可视化程序设计语言。(1) 2、一个算法可以被认为是用来解决一个计算问题的工具。(1) 3、一个算法可以用多种程序设计语言来实现。(1) 4、计算机是人制造的,所以,它和人脑解决问题没有什么区别。(2) 5、字符串型数据是指用‘ ’括起来的一串字符。(2) 6、我们常说的程序设计语言就是程序设计。(2) 7、控件是应用程序的基本元素,与窗体共同构成应用程序的界面。(1) 8、面向对象的程序设计以对象为中心,以事件为过程的执行起点。(1) 9、MsgtBox函数反回值的类型为数值。(1) 10、Ctrl+T能打开属性窗口。(2) 四、简答题(每题10分,共30分) 1、说说人类和计算机解决问题的区别? 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 2、用流程图描述出“闰年问题”的算法。 算法描述: 输入年份Y IF Y能被4整除 THEN IF Y不能被100整除 THEN 输出“是闰年” ELSE IF Y能被400整除 THEN 输出“是闰年” ELSE 输出“不是闰年” END IF END IF ELSE 输出“不是闰年” END IF 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 3、在“神州号”程序中,我们只判断了飞船成功飞行的条件。当飞船速度继续加大时,飞船将达到第二宇宙、第三宇宙速度。。。。(见下表) 试编写程序,输入不同的飞船速度,判断它的各种飞行状况。 飞船速度(V)单位(km/s) 飞行状况 7.91<=V<11.19 飞船绕地球似做匀速圆周运动 11.19<=V<16.67 飞船离开地球的控制 ,围绕太阳转 V>16.67 飞船挣脱太阳引力飞出太阳系 编程: 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 方法一:Prevate Sub Command1_Click() Dim v As Integer v = InputBox(”请输入飞船速度的值“) If(v >= 7.91)And(v <= 11.19)Then Label1.Caption = ” 飞船绕地球似做匀速圆周运动“ Else If(v >= 11.19)And(v <= 16.67)Then Label1.Caption = ” 飞船离开地球的控制,围绕太阳转“ Else If v >= 16.67 Then Label1.Caption = ” 飞船挣脱太阳引力飞出太阳系“ Else If v <= 7.91 Then Label1.Caption = ” 输入数据错误!“ End If End If End If End If End Sub 方法二:(课本P36) Private Sub Form_Load() Dim v As single 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 v = InputBox(”请输入飞船速度的值“) select case v case is>16.67 Label1.Caption = ”飞船挣脱太阳引力飞出太阳系“ case is >= 11.19 Label1.Caption = ” 飞船离开地球的控制,围绕太阳转“ case is <= 7.91 Label1.Caption = ” 飞船离开地球的控制,围绕太阳转“ Case else Label1.Caption = ” 输入数据错误!" End select End Sub 精心收集 精心编辑 精致阅读 如需请下载! 第一章 概述 算法的概念:算法是指解决问题的一种方法或过程,是由若干条指令组成的有穷序列。算法的特征: 可终止性:算法必须在有限时间内终止; 正确性:算法必须正确描述问题的求解过程; 可行性:算法必须是可实施的; 算法可以有0个或0个以上的输入; 算法必须有1个或1个以上的输出。 算法与程序的关系: 区别:程序可以不一定满足可终止性。但算法必须在有限时间内结束; 程序可以没有输出,而算法则必须有输出; 算法是面向问题求解的过程描述,程序则是算法的实现。 联系:程序是算法用某种程序设计语言的具体实现; 程序可以不满足算法的有限性性质。 算法描述方式:自然语言,流程图,伪代码,高级语言。 算法复杂性分析: 算法复杂性的高低体现运行该算法所需计算机资源(时间,空间)的多少。 算法复杂性度量: 期望反映算法本身性能,与环境无关。 理论上不能用算法在机器上真正的运行开销作为标准(硬件性能、代码质量影响)。 一般是针对问题选择基本运算和基本存储单位,用算法针对基本运算与基本存储单位的开销作为标准。 算法复杂性C依赖于问题规模N、算法输入I和算法本身A。即C=F(N, I, A)。 第二章递归与分治 分治法的基本思想: 求解问题算法的复杂性一般都与问题规模相关,问题规模越小越容易处理。 分治法的基本思想是,将一个难以直接解决的大问题,分解为规模较小的相同子问题,直至这些子问题容易直接求解,并且可以利用这些子问题的解求出原问题的解。各个击破,分而治之。 分治法产生的子问题一般是原问题的较小模式,这就为使用递归技术提供了方便。递归是分治法中最常用的技术。 使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。(这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。) 递归的概念: 直接或间接地调用自身的算法称为递归算法,用函数自身给出定义的函数称为递归函数。 反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 第三章动态规划 动态规划的基本思想: 动态规划算法与分治法类似,其思想把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。最后一个阶段或子问题的解就是初始问题的解。 分治法求解时,子问题数目太多,从而导致解决原问题需要耗费指数级时间。与分治法不同的是,动态规划中分解得到的子问题往往不是互相独立的。 但不同子问题的数目常常只有多项式级。用分治法求解时,有些子问题被重复计算了许多次。 动态规划的适用条件: 动态规划法解所能解决的问题一般具有以下两个基本因素: 一、最优子结构性质 当问题的最优解包含着其子问题的最优解时,称该问题具有最优子结构性质。 二、重叠子问题性质 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 其它同分治法。 动态规划问题的特征: 求解的问题是组合优化问题; 求解过程需要多步判断,从小到大依次求解; 子问题目标函数最优解之间存在依赖关系; 动态规划算法设计的基本步骤和要素: 基本步骤: (1)找出最优解的性质,并刻画其结构特征。(考察是否适合采用动态规划法。) (2)递归地定义最优值。(建立递归式或动态规划方程) (3)以自底向上的方式(或以自顶向下的备忘录方法)计算出最优值。 (4)根据计算最优值时得到的信息,构造最优解。 要素: 最优子结构 重叠子问题 备忘录(表格) 应用实例分析: 1、矩阵连乘问题: (1)分析最优解结构: 计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的。矩阵连乘计算次序问题的最优解包含着其子问题的最优解,满足最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。 (2)建立递归关系; (3)计算最优值—递归求解(递归求解最优值复杂度较高的原因是:子问题重复度高);计算最优值—迭代查表求解 计算最优值—备忘录求解 (4)构造最优解 第四章贪心法 贪心算法的基本思想: 当一个问题具有最优子结构性质时,可用动态规划方法求解,但有时会有更简单有效的方法。 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。贪心算法中,较大子问题的解恰好包含了较小子问题的解作为子集,这与动态规划算法设计中的优化原则本质上是一致的。 动态规划算法在某一步决定优化函数的最大或最小值时,需要考虑到它的所有子问题的优化函数值,然后从中选出最优的结果;贪心算法的每步判断时,不考虑子问题的计算结果,而是根据当时情况采取“只顾眼前”的贪心策略决定取舍。 贪心算法的设计要素: 可以用贪心算法求解的问题一般具有2个重要的性质: 1、最优子结构性质: 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征 2、贪心选择性质: 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法与动态规划算法的主要区别。 动态规划算法通常以自底向上的方式求解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。 应用实例: 1、活动安排问题: 第五章回溯法 回溯法的基本思想: 回溯法的使用条件: 回溯法适用于搜索问题和优化问题。 回溯法的设计要素: 针对问题定义解空间: 问题解向量 解向量分量取值集合构造解空间树 两类典型的解空间树: 子集树:当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。子集树通常有2n个叶结点 排列树:当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。排列树通常有n!个叶结点。 判断问题是否满足多米诺性质。 搜索解空间树,确定剪枝函数。 确定存储搜索路径的数据结构。 第六章分支限界法 分支限界法的基本思想: 分支界限法类似与回溯法,也是在问题解空间中搜索问题解的一种算法。 分支界限法与回溯法思想对比: 求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 常见的两种分支界限法: 队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 最大堆:最大效益优先 最小堆:最小耗费优先第五篇:算法分析与设计知识点总结