算法设计与分析学习心得

时间:2019-05-12 12:14:25下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《算法设计与分析学习心得》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《算法设计与分析学习心得》。

第一篇:算法设计与分析学习心得

算法设计与分析学习心得

班级:物联网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时自动换行。这样程序得到了一定的简化,并且减少了一定的内存使用。我认为这种方法是比较贴合实际的。

四.心得体会

在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。

如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。

第二篇:数据结构算法设计与分析

数据结构算法设计与分析、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;

网页制作、程序设计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职业英语、毕业设计及项目综合实训等专业课程

第三篇:算法设计与分析试题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)原则选取下一个节点为扩展节点。

优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

最大堆:最大效益优先

最小堆:最小耗费优先

第五篇:算法学习心得

算法设计与分析学习心得

班级:物联网1201 姓名:刘潇 学号:1030612129

一、实验内容:

这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。

二、学习掌握:

基本程序描述:

(1)货郎担问题:货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有(n一1)!条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。货郎担的程序实现了利用穷举法解决货郎担问题,可以在城市个数和各地费用给定的情况下利用穷举法逐一计算出每一条路线的费用,并从中选出费用最小的路线。从而求出问题的解

(2)费用矩阵:费用矩阵的主要内容是动态生成二维数组。首先由键盘输入自然数,费用矩阵的元素由随机数产生,并取整,把生成的矩阵存放在二维数组中,最后把矩阵内容输出到文件和屏幕上。它采用分支界限法,分支限界法的基本思想是对包含具有约束条件的最优化问题的所有可行解的解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解计算一个下界或上界。动态生成二维n*n的数组程序利用指针表示数组的行和列,并逐一分配空间,在输入n的数值后,系统自动分配空间,生成n*n的数组,并产生随机数填充数组,最后将结果输入到指定文件中。

三.疑问与总结:

货郎担的问题,我认为穷举法相对比而言是比较初级的方法,费时耗力,适合在练习时选用,但是在实际问题中不建议采用。克鲁斯卡尔或者普里姆算法求取最小生成树的方法来解决货郎担的问题是更适合现实解决问题的。我认为程序可以用switch函数来将函数分成几个部分更人性化,比如分为解决问题的的选项,输出结果选项,退出程序选项等。再有就是费用矩阵的值可以从文件中读取,而结果也可以直接放在指定文件中,这样在实际应用中比较广泛。

动态生成二维数组的程序我认为如果按照规范性,我的方法是中规中矩的,毕竟再向下延伸,生成三维的数组,需要三层的指针来实现。但是就程序的简化程度和计算机处理时间来说,我认为这样双层指针的算法有些太占用内存,毕竟要给行和列各分配n个空间。我通过与同学的交流,我发现可以用1位数组来实现二维的n*n的数组。首先分配n*n的空间,然后通过循环在一行的数据达到n时自动换行。这样程序得到了一定的简化,并且减少了一定的内存使用。我认为这种方法是比较贴合实际的。

四.心得体会

在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。

如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。篇二:算法个人心得

算法学习心得: 算法这个词是在我在大学第一次c语言课上听到的,当时老师讲的是程序=算法+数据结构,算法是一个程序的灵魂。当时我什么也不懂,不知道什么叫数据结构,什么叫算法,它们是干什么的我也不明白。然而经历了大学四年的学习,现在的我对算法有了一个较为清晰的认识,对于它的作用也有了深刻的体会。

所谓算法简单来说就是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,也就是说算法告诉计算机怎么做,以此来解决问题。同一个问题存在多种算法来解决它,但是这些算法存在着优劣之分,好的算法速度快,效率高,占用空间小,差的算法不仅复杂难懂,而且效率低,对机器要求还高,当然,有时候算法之间存在一种互补关系,有些算法效率高,节省时间,但浪费空间,另外一些算法可能速度上慢些,但是空间比较节约,这时候我们就应该根据实际要求,和具体情况来采取相应的算法来解决问题。

这学期算法课上我们主要讲了七部分内容.第一章主要讲的是算法的基本概念,算法时间复杂度分析,算法的渐近时间复杂度等内容。因为算法之间的比较就是通过时间复杂度和空间复杂度来来比较的,第一章的主要目的就是让我们学会去分析一个算法的复杂度,以后就可以通过对复杂度的分析来评价算法的好坏。

第二章讲的是分治法,任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少,分治法的设计思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。在这一章中我们讲到了寻找第k个元素,矩阵相乘,寻找最近点对等几个使用分治法的经典例子,最后还将讲到了傅里叶变换的问题。以前我们学到的归并排序,二分搜索其实也是基于分治法思想的。能采用分治法来解决的问题通常有如下几个特征: 1)该问题的规模缩小到一定的程度就可以容易地解决 2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子

结构性质。

3)利用该问题分解出的子问题的解可以合并为该问题的解; 4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公

共的子子问题。

在用分治法解决实际问题时,我们疑问究竟各个子问题的规模应该怎样才为适当?从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的,这就是一种平衡的思想。

第三章主要讲动态规划问题。这一章的内容我觉得是算法设计思想中最难,也最有趣的这部分。什么叫动态规划,动态规划的思想是什么?动态规划采用自顶向下的方式分析问题,自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。“多阶段决策问题是根据问题本身的特点,将其求解的过程划分为若干个相互独立又相互联系的阶段,在每一个阶段都需要做出决策,并且在一个阶段的决策确定以后再转移到下一个阶段,在每一阶段选取其最优决策,从而实现整个过程总体决策最优的目的”(引用)。还记得期末考试中的最后一道关于任意给定一个数,从所给的牌中用最少的牌组成这个数,这个问题其实就可以用动态规划来解决。本科期间,在算法课上老师在动态规划这一章不布置的一个作业跟这个题目类似,当时的题目是找钱问题,问题是这样描述的:有n种不同面值的硬币,各硬币面值存于数组t[1:n],现用这些面值的钱来找钱,编程计算找钱m的最少硬币数及各个面值。分析如下:假设对于i = 1...n-1,所需最少的硬币数count(i)已知,那么对于n,所需的硬币数为min(count(i)+ count(n-i)), i=1...n-1;于是一个直观的方法是用递归计算。

但是,递归过程中,每次计算count(i),都会重复计算 count(1)....count(i-1);这样时间复杂度就是o(n^2);我们可以从1开始记录下每个钱数所需的硬币枚数,避免重复计算,为了能够输出硬币序列,我们还需要记录下每次新加入的硬币。下面给出用动态规划解决此问题的递推式:

参数说明: 当只用面值为t[1],t[2],„t[n]来找出钱j时,所用的硬币的最小个数记为c(i,j),则c(i,j)的递推方程为:

运用这个递推式,我们可以从下往上记录各个j所需要的应兵书i,最后当j=m时,所对应的i就是我们要求的。第四章讲的是集合算法,这一章的内容是我第一次接触,以前没有学过。这一章主要讲了平摊分析,union-find,finding the depth,以及2-3树等内容,平摊分析教会我们如何从整体的角度去更精确的分析算法的时间复杂度,union-find sets是一种简单的用途广泛的集合,并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速,finding the depth 确定深度问题。为了既能求得各点在原先树中的正确深度、又能使时间复杂度较小,需要使用具有路径压缩功能的find-depth指令,同时还需要采取一些辅助手段来保证深度计算的正确性。2-3树具有以下几个特点:

1、任一内结点(非叶结点)均有2个或3个儿子。

2、从根到每片树叶的路径长度相等。

3、内结点中只存放便于查找的信息,而叶结点中存放原始数据。

第五章主要讲了随机算法。在随机算法中,我们不要求算法对所有可能的输入均正确计算,只要求出现错误的可能性小到可以忽略的程度。另外我们也不要求对同一输入算法每次执行时给出相同的结果。我们所关心的是算法在执行时,是否能够产生真正随机的结果。有不少问题,目前只有效率很差的确定性求解算法,但用随机算法去求解,可以很快地获得相当可信的结果。随机算法通常分为两大类:las vegas算法、monte carlo算法。las vegas算法总是给出正确的结果,但在少数应用中,可能出现求不出解的情况。此时需再次调用算法进行计算,直到获得解为止.mont carlo算法通常不能保证计算出的结果总是正确,一般只能断定所给解的正确性不小于p(1/2<p<1)。通过反复执行算法(即以增大算法的执行时间为代价),能够使发生错误的概率小到可以忽略的程度。第五章还讲到素数测试,其中介绍了相关定理,重点讲了miller-rabin算法。

第六章介绍了计算模型,这一章主要介绍了有关计算的一些本质问题,random access machines(随机存取机,简称ram),存储程序模型rasp(random access stored program),图灵机(turning machine)以及各个计算模型之间的关系。

第七章介绍了np完全问题,主要包括近似算法(approximation algorithms),非确定性turing机 ndtm,确定性turing机 dtm,以及之间的区别,np完全经典问题等内容。

经过一学期的算法学习,我对算法的了解进一步加深,曾经学习过的内容得到进一步巩固,同时没有接触的内容也让我有了新的认识。作为一名计算机专业的学生,算法是一门基础学科,它里面包含的思想无处不在,学好算法分析,对于在自己的方向上获得启示,体会更深有着重大作用。所以,我们应该培养对算法的兴趣,将算法的运用融入到生活当中,比如找钱问题就是个很好的例子,通过具体的生活实例来让算法变得更加有魅力,有吸引力,以此来激发对算法的兴趣。篇三:算法设计与分析学习总结 算法分析与设计 学习总结

题目:算法分析与设计学习总结

学 院 信息科学与工程学院

专 业 届 次

学生姓名 学 号

二○一三年一月十五日

算法分析与设计学习总结

本学期通过学习算法分析与设计课程,了解到:算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。算法能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。

设计的算法要具有以下的特征才能有效的完成设计要求,算法的特征有:(1)有穷性。算法在执行有限步后必须终止。(2)确定性。算法的每一个步骤必须有确切的定义。(3)输入。一个算法有0个或多个输入,作为算法开始执行前的初始值,或初始状态。(4)输出。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。(5)可行性。在有限时间内完成计算过程。

算法设计的整个过程,可以包含对问题需求的说明、数学模型的拟制、算法的详细设计、算法的正确性验证、算法的实现、算法分析、程序测试和文档资料的编制。算法可大致分为基本算法、数据结构的算法、数论与 代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法和并行算法。经典的算法主要有:

1、穷举搜索法

穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,bing从中找出那些符合要求的候选解作为问题的解。

穷举算法特点是算法简单,但运行时所花费的时间量大。有些问题所列举书来的情况数目会大得惊人,就是用高速计算机运行,其等待运行结果的时间也将使人无法忍受。我们在用穷举算法解决问题是,应尽可能将明显不符合条件的情况排除在外,以尽快取得问题的解。

2、迭代算法

迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或方程组)的过程,为实现这一过程所使用的方法统称为迭代法。迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:

(1)选一个方程的近似根,赋给变量x0。(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0。(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

3、递推算法

递推算法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的。

4、递归算法

递归算法是一种直接或间接的调用自身的算法。

能采用递归描述的算法通常有这样的特征:为求解规模为n的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规

模较大问题的解。特别的,当规模n=0或1时,能直接得解。

递归算法解决问题的特点有:

(1)递归就是在过程或函数里调用自身

(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口

(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低

(4)在递归调用的过程中系统为每一层的返回点、局部变量等开辟堆栈来存

储。

举例如下: fibonacci数列

int fib[50];//采用数组保存中间结果 void fibonacci(int n){ fib[0] = 1;fib[1] = 1;for(int i=2;i<=n;i++)fib[i] = fib[i-1]+fib[i-2];}

5、分治算法

分治算法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单地直接求解,原问题的解即子问题解的合并。

如果原问题可分割成k个子问题,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

分治策略的算法设计模式 divide_and_conquer(p){ if(|p|<=n0)return adhoc(p); divide p into smaller substances p1,p2,„,pk; for(i=1;i<=k;k++)yi=divide-and-conquer(pi)//递归解决pi return merge(y1,y2,„,yk)//合并子问题 }

6、贪心算法

贪心算法也称贪婪算法。它在对问题求解时,总是做出在当前看来是最好的选择。它不从整体最优上考虑,所得出的仅是在某种意义上的局部最优解。贪心算法的基本思路如下:(1)建立数学模型来描述问题

(2)把求解的问题分成若干个子问题

(3)对每一子问题求解,得到子问题的局部最优解

(4)把子问题的局部最优解合成原来问题的一个解

贪心算法的一般流程: greedy(a){ s={ };//初始解集合为空集 while(not solution(s))//集合s没有构成问题的一个解 { x = select(a);//在候选集合a中做贪心选择 if feasible(s, x)//判断集合s中加入x后的解是否可行 s = s+{x};a = a-{x};} return s;}

(1)候选集合a:问题的最终解均取自于候选集合a。(2)解集合s:解集合s不断扩展,直到构成满足问题的完整解。

(3)解决函数solution:检查解集合s是否构成问题的完整解。

(4)选择函数select:贪心策略,这是贪心算法的关键。

(5)可行函数feasible:解集合扩展后是否满足约束条件。

7、动态规划算法

动态规划算法是一种在数学和计算机科学中用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。

动态规划算法的步骤

(1)找出最优解的性质,并刻画其结构特征;(2)递归地定义最优值(写出动态规划方程);(3)以自底向上的方式计算出最优值;(4)根据算法最优值时得到的信息,构造一个最优值。

动态规划算法的有效性依赖于问题本身所具有的两个重要的性质:最优子结构性质和子问题重叠性质。(1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

(2)重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。

8、回溯算法 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。当探索到某一步时,发现原先的选择并不优或达不到目标,就回退一步重新选择,这种走不通就退回再走的技术成为回溯法,满足回溯条件的某个状态的点称为“回溯点”。迷宫问题算法所采用的就是回溯算法。

回溯算法解决问题的过程是先选择某一可能的线索进行试探,每一步试探都有多种方式,将每一方式都一一试探,如有问题就返回纠正,反复进行这种试探在反复纠正,直到得出全部符合条件的答案或是问题无解为止。由于回溯方法的本质是深度优先的方法在解的空间树中搜索,就要从堆栈中找到回溯的前一个位置继续试探。

装载问题回溯算法数据结构 #define num 100 int n;//集装箱的数量 int c;//轮船的载重量 int w[num];//集装箱的重量数组 int x[num];//当前搜索的解向量 int r;//剩余集装箱的重量 int cw;//当前轮船的载重量 int bestw;//当前最优载重量

int bestx[num];//当前最优解 算法实现 //形参表示搜索第t层结点 void backtrack(int t){ //到达叶子结点 if(t>n){ //更新最优解 if(cw>bestw){ for(int i=1;i<=n;i++)bestx[i] = x[i];bestw = cw;} return;} //更新剩余集装箱的重量 r-= w[t];//搜索左子树

if(cw+w[t]<=c){ x[t] = 1;cw += w[t];backtrack(t+1);cw-= w[t];} //搜索右子树

if(cw+r>bestw){ x[t]=0;backtrack(t+1);} r += w[t];//恢复状态 }

9、分支限界算法 分支限界算法是一种在表示问题解空间的树上进行系统搜索的方法。该方法使用了广度篇四:算法设计与实现个人课程总结 算法课程总结

指导教师

所在院(系)

班 级

学生姓名

学 号

一、算法概述 1.什么是算法?

算法是解一确定类问题的任意一种特殊的方法。在计算机科学中,算法是使用计算机解一类问题的精确、有效方法的代名词。算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。

2.算法的五个重要特性:确定性、能行性、输入、输出、有穷性/有限性。1)确定性:算法每种运算必须有确切定义,不能有二义性。2)能行性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在有限的时间内完成。3)输入:每个算法有0个或多个输入。这些输入是在算法开始之前给出的量,取自于特定的对象集合——定义域

4)输出:一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量。5)有穷性/有限性:一个算法总是在执行了有穷步的运算之后终止。3.计算过程:只满足确定性、能行性、输入、输出四个特性但不一定能终止的一组规则。4.准确理解算法和计算过程的区别:不能终止的计算过程:操作系统;算法是“可以终止的计算过程”;算法的时效性:只能把在相当有穷步内终止的算法投入到计算机上运行。5.算法的语言主要有:自然语言,流程图,盒图,pad图,伪代码,计算机程序设计语言。

6.算法分类: 1)多项式时间算法:可用多项式(函数)对其计算时间限界的算法。常见的多项式限界函数有:ο(1)< ο(logn)< ο(n)< ο(nlogn)< ο(n2)< ο(n3)2)指数时间算法:计算时间用指数函数限界的算法。常见的指数时间限界函数:ο(2n)< ο(n!)< ο(nn)7.算法基本工具:循环与递归,算法与数据结构,优化算法的数学模型。8.主要算法:迭代算法,蛮力法,分治法,动态规划法,贪婪算法,图搜索基础。

二、算法的核心是思想

我们学习这门课不是仅仅掌握那几个经典算法例子,更重要的是为了学习蕴含在其中的思想方法。为什么呢?举个例子。有同学曾问我这样一个问题:1000只瓶子装满水,但有一瓶有毒,且毒发期为1个星期。现在用10只老鼠在一个星期内判断那只瓶子有毒,每只老鼠可以喝多个瓶子的水,每个瓶子可以只喝一点。问如何解决?其实一开始我也一头雾水,但是他提醒我跟计算机领域相关,我就立马有了思路,运用二进制。因为计算机的最基本思想就是二进制。所以说,我们不仅要学习算法,更得学习思想方法。

①算法最基本的设计方法包括分治法,动态规划法,贪婪算法,周游法,回溯法,分支定界法。我们可利用分治法做快速排序,降低找n个元素中最大元和最小元的量级,降低n位二进制x和y相乘的量级,做strassen矩阵乘法等等。它的思想就是规模很大的问题分解为规模较小的独立的子问题,关键是子问题要与原问题同类,可以采取平衡法来提高性能。

动态规划法是把大问题分解为子问题,但是子问题是重复的,后面的问题可

以利用前面解决过的问题的结果。如构造最优二叉查找树,解决矩阵连乘时最小计算次数问题,寻找最长公共子序列等等。

贪婪算法就是局部最优法,先使局部最优,再依次构造出更大的局部直至整体。如kruscal最小生成树算法,求哈夫曼编码问题。

周游法就是简单理解就是采取一定的策略遍历图中所有的点,典型的应用就是图中的深度优先搜索(dfs)和广度优先搜索(bfs)。

回溯法就是就是在满足一定的条件后就往前走,当走到某步时,发现不满足条件就退回一步重新选择新的路线。典型的应用就是8皇后问题,平面点集的凸包问题和0-1背包问题。

分支定界法:它是解决整数规划问题一种最常用的方法。典型应用就是解决整数规划问题。

②评价算法性能的方法如平摊分析中的聚集法,会计法和势能法。聚集法就是把指令分为几类,计算每一类的消耗,再全部叠加起来。会计法就是计算某个指令时提前将另一个指令的消耗也算进去,以后计算另一个指令时就不必再算了。势能法计算每一步的势的变化以及执行这步指令的消耗,再将每一步消耗全部累计。

这几种方法都是平摊分析法,平摊分析的实质就是总体考虑指令的消耗时间,尽管某些指令的消耗时间很大也可以忽略不计。上述三种方法难易程度差不多,每种方法都有属于它的难点。如聚集法中如何将指令有效分类,会计法中用什么指令提前计算什么指令的消耗,势能法中如何选取势能。因此掌握这些方法原理还不够,还要学会去应用,在具体的问题中去判断分析。

三、重点学习 1.贪婪算法

贪婪+其他算法:由于贪婪往往能大幅化简状态,利用问题的某些“单调性”,加上贪婪的思想,往往能是问题大幅简化,从而结合其他算法解决问题经典例题:田忌赛马,利用贪婪来确定状态。2.分治法

分而治之的思想在信息学竞赛中是非常重要的,下面主要介绍一下分治的经典应用 1)二分查找

思想很简单,功能很强大,边界要注意,负数要特判(noi2010 piano)在非负数范围内的二分一般写法

如果是l := mid1 或 +1则 mid :=(l + r + 1)div 2 2)快速幂

a^b =(a^(b div 2))^2 + ord(odd(b))*a取模也适用 3)快速排序,归并排序

任何一本算法书上都会讲的,这里就略过了,值得一提的是快排记得加上随机化 k := a[random(rg(x)*ans = 0 重构权,将f(i)-g(i)*ans作为新权值,用相应算法求出一个“最小值”,判断是否>=0,接着二分即可 5)树的分治

一般用来解决树上的路径或统计类问题,每次只考虑跟树根有关的信息,然后递归分治处理

树的分治通常有基于点或基于边的分治,基于点的难合,基于边的复杂度太高,这里只介绍基于点的分治

步骤:处理跟当前树根有关的信息,重新计算子树大小,在子树中选择重心为根,递归到相应子树处理。

因为每次选了重心,所以递归总共logn层,每层o(n)的复杂度,总复杂度就是o(nlogn)6)二分搜索

直接搜的复杂度是指数级的的话,一般是40左右的数据量,hash一半,搜一半,搜后面的时候利用之前的hash信息合并出原问题的解。

而直接搜的复杂度达到阶乘级的话n一般就不超过20了,做法一般差不多 经典例题:poi02szy,noi2001方程的解数。3.搜索

作为信息学竞赛中的所谓“万能算法”,搜索可以说是计算机学科所具有的最大特点了,自然地,搜索算法的应用自然也是非常之广泛,除了专门的搜索题,搜索一般可以用来部分预处理,打表找规律,当然还有骗分。

搜索的一般步骤:确定状态——选择搜索方式(dfs、bfs)——确定产生式规则——开始搜索。搜索的常见优化方式: 1)改变状态表示

这个需要根据题目而定,确定一个漂亮的状态表示,可能就有希望转向记忆化了,即使不行,搞出一个漂亮的状态表示是解决一道麻烦题的最重要的一步,再者,调试起来也会容易许多。

2)优化搜索顺序

这个优化在多数搜索中能起到摧枯拉朽的提速效果,通常我们选择枝叶较少的儿子先扩展,例如大名鼎鼎的dancing links,除了利用双向十字链表去除冗余状态,每次选择可扩展数最少的儿子扩展同样给它的神速创造了条件。3)可行性剪枝以及最优性剪枝

这是非常常用的剪枝思路之一,因题目而异,在迭代加深搜索中尤为重要 一般思路:考虑每次解最多变优多少,从当前的层数来看还有多少改进空间,如果已经不可能成为解或更新答案则可以剪枝了

——a*及ida*算法:本质就是给搜索加上一个满足相容性的估价函数,然后用估价函数剪枝,理论上很牛b,实际上不常用,因为考场上很难想出满足那么多条件的估价函数,但记得一些常见模型的估价函数还是有价值的。例如15 数码的估价函数就可以选择除了0之外每个元素到自己该到的位置的曼哈顿距离之和,因为每次最多使一个数距离减少1,所以这个估价函数是相容的,再例如求k短路的a*算法就是用个堆维护 min{ f(s)+ g(s)}估价函数就是从汇点反搜的“反向最短路”的长度。

四、总结

在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。作为it行业学生,学习算法无疑会增强自己的竞争力,修炼自己的“内功”。

经过这门课的学习,我深刻的领悟到数学是一切算法分析与设计的基础。这门课的很多时间多花在了数学公式定理的引入和证明上。虽然很枯燥,但是有必不可少。我们可以清晰的看到好多算法思路是从这些公式定理中得出来的,尤其是算法性能的分析更是与数学息息相关。其中有几个定理令我印象深刻。

①主定理

本门课中它主要应用在分治法性能分析上。例如:t(n)=a*t(n/b)+f(n),它可以看作一个大问题分解为a个子问题,其中子问题的规模为b。而f(n)可看作这些子问题的组合时的消耗。这些可以利用主定理的相关结论进行分析处理。当f(n)量级高于时,我们可以设法降低子问题组合时的消耗来提高性能。反之我们可以降低的消耗,即可以扩大问题的规模或者减小子问题的个数。因此主定理可以帮助我们清晰的分析出算法的性能以及如何进行有效的改进。

②随机算法中的许多定理的运用

在这门课中,我学到了以前从未遇见过的随机算法,它给予我很大的启示。随机算法不随机,它可通过多次的尝试来降低它的错误率以至于可以忽略不计。这些都不是空穴来风,它是建立在严格的定理的证明上。如素数判定定理是个很明显的例子。它运用了包括费马小定理在内的各种定理。将这些定理进行有效的组合利用,才得出行之有效的素数判定的定理。尤其是对寻找证据数算法的改进的依据,也是建立在3个定理上。还有检查字符串是否匹配也是运用了许多定理:指纹的运用,理论出错率的计算,算法性能的评价也都是建立在数学定理的运用上。篇五:遗传算法学习心得

基本概念

遗传算法(genetic algorithms, ga)是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

它模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。ga的组成:(1)编码(产生初始种群)

(2)适应度函数

(3)遗传算子(选择、交叉、变异)

(4)运行参数

编码

基因在一定能够意义上包含了它所代表的问题的解。基因的编码方式有很多,这也取决于要解决的问题本身。常见的编码方式有:

(1)二进制编码,基因用0或1表示(常用于解决01背包问题)如:基因a:00100011010(代表一个个体的染色体)(2)互换编码(用于解决排序问题,如旅行商问题和调度问题)

如旅行商问题中,一串基因编码用来表示遍历的城市顺序,如:234517986,表示九个城市中,先经过城市2,再经过城市3,依此类推。

(3)树形编码(用于遗传规划中的演化编程或者表示)

如,问题:给定了很多组输入和输出。请你为这些输入输出选择一个函数,使得这个函数把每个输入尽可能近地映射为输出。

编码方法:基因就是树形结构中的一些函数。

(4)值编码(二进制编码不好用时,解决复杂的数值问题)在值编码中,每个基因就是一串取值。这些取值可以是与问题有关任何值:整数,实数,字符或者其他一些更复杂的东西。

适应度函数

遗传算法对一个个体(解)的好坏用适应度函数值来评价,适应度函数值越大,解的质量越好。适应度函数是遗传算法进化过程的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。

如tsp问题,遍历各城市路径之和越小越好,这样可以用可能的最大路径长度减去实际经过的路径长度,作为该问题的适应度函数。

遗传算子——选择

遗传算法使用选择运算来实现对群体中的个体进行优胜劣汰操作:适应度高的个体被遗传到下一代群体中的概率大;适应度低的个体,被遗传到下一代群体中的概率小。选择操作的任务就是按某种方法从父代群体中选取一些个体,遗传到下一代群体。sga(基本遗传算法)中采用轮盘赌选择方法。

轮盘赌选择又称比例选择算子,基本思想:各个个体被选中的概率与其适应度函数值大小成正比。设群体大小为n,个体i 的适应度为 fi,则个体i 被选中遗传到下一代群体的概率为:

遗传算子——交叉

所谓交叉运算,是指对两个相互配对的染色体依据交叉概率按某种方式相互交换其部分基因,从而形成两个新的个体。交叉运算在ga中起关键作用,是产生新个体的主要方法。1.单交叉点法(用于二进制编码)

选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。

如:交叉前:

00000|***00 11100|***01 交叉后:

00000|***01 11100|***00 2.双交叉点法(用于二进制编码)

选择两个交叉点,子代基因在两个交叉点间部分来自一个父代基因,其余部分来自于另外一个父代基因.如:交叉前: 01 |0010| 11 11 |0111| 01 交叉后: 11 |0010| 01 01 |0111| 11 3.基于“ 与/或 ”交叉法(用于二进制编码)对父代按位与”逻辑运算产生一子代a;按位”或”逻辑运算产生另一子代b。该交叉策略在解背包问题中效果较好.如:交叉前: 01001011 11011101 交叉后: 01001001 11011111 4.单交叉点法(用于互换编码)

选择一个交叉点,子代的从初始位置出发的部分从一个基因复制,然后在另一个基因中扫描,如果某个位点在子代中没有,就把它添加进去。

如:交叉前: 87213 | 09546 98356 | 71420 交叉后:

87213 | 95640 98356 | 72104 5.部分匹配交叉(pmx)法(用于互换编码)

先随机产生两个交叉点,定义这两点间的区域为匹配区域,并用交换两个父代的匹配区域。

父代a:872 | 130 | 9546 父代b:983 | 567 | 1420 变为: temp a: 872 | 567 | 9546 temp b: 983 | 130 | 1420 对于 temp a、temp b中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换。匹配关系:1<——>5 3<——>6 7<——>0 子代a:802 | 567 | 9143 子代b:986 | 130 | 5427 6.顺序交叉法(ox)(用于互换编码)

从父代a随机选一个编码子串,放到子代a的对应位置;子代a空余的位置从父代b中按b的顺序选取(与己有编码不重复)。同理可得子代b。父代a: 872 | 139 | 0546 父代b: 983 | 567 | 1420 交叉后:

子代a: 856 | 139 | 7420 子代b: 821 | 567 | 3904 7.循环交叉(cx)法(用于互换编码)cx同ox交叉都是从一个亲代中取一些城市,而其它城市来自另外一个亲代,但是二者不同之处在于:ox中来自第一个亲代的编码子串是随机产生的,而cx却不是,它是根据两个双亲相应位置的编码而确定的。

父代a:1 2 3 4 5 6 7 8 9 | | | | | 父代a:5 4 6 9 2 3 7 8 1 可得循环基因:1->5->2->4->9->1 用循环的基因构成子代a,顺序与父代a一样 1 2 4 5 9 用父代b剩余的基因填满子代a: 1 2 6 4 5 3 7 8 9 子代b的编码同理。(循环基因 5->1->9->4->2->5)

遗传算子——变异 变异是指依据变异概率将个体编码串中的某些基因值用其它基因值来替换,从而形成一个新的个体。ga中的变异运算是产生新个体的辅助方法,它决定了ga的局部搜索能力,同时保持种群的多样性。交叉运算和变异运算的相互配合,共同完成对搜索空间的全局搜索和局部搜索。

注:变异概率pm不能太小,这样降低全局搜索能力;也不能太大,pm > 0.5,这时ga退化为随机搜索。

下载算法设计与分析学习心得word格式文档
下载算法设计与分析学习心得.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    《算法设计与分析》考核要求(大全5篇)

    《算法设计与分析》课程考核要求 本课程在教学计划中为考查课。考核形式采用大作业形式,以打印文档形式验收并提交。 一.考核内容 1. 分治法题目 (1)编程实现归并排序算法和快速......

    算法设计与分析课程论文五篇范文

    “卓越工程师教育培养计划”(简称卓越计划)旨在培养一批创新能力强、适应经济社会发展需要的高质量工程技术人才。在南通大学计算机科学与技术学院制定的软件工程专业卓越工......

    算法设计与分析书中概念总结

    6递推步骤 7算法描述(盒图 PAD图之类的老师说看看但我不懂怎么考)1. 算法的基本性质 (1) 目的性:算法有明确的目的,算法能够完成赋予它的功能。 (2) 分步性:算法为完成其复杂的功能,由......

    算法设计与分析 实验指导书1

    实验1 递归与分治 一、 实验目的: 利用C/C++/JAVA等程序设计语言,实现本章节中分治算法、递归,汉诺塔问题/二分搜索算法/合并排序/快速排序等经典算法。通过本实验章节掌握递归......

    《算法分析与设计》实验指导书-(推荐阅读)

    计算机科学与技术学院 算法分析与设计实验指导书 于洪 编写 2011年8月 目 录 实验一实验二实验三实验四附录1 附录2 排序问题求解…………………………..…..………3 背包问......

    “算法设计与分析”课程教学方法探究(精选)

    “算法设计与分析”课程教学方法探究 摘要:该文分析了算法设计与分析课程教学和学生学习时存在的问题,根据近几年积累的教学经验,提出了一些教学方法的建议,如互动式教学,板书和......

    算法设计与分析课程的心得体会

    《算法设计与分析》课程的心得体会 以最少的成本、最快的速度、最好的质量开发出合适各种各样应用需求的软件,必须遵循软件工程的原则,设计出高效率的程序。一个高效的程序不......

    算法描述与设计教案

    课型:新课 《算法与程序设计》(选修)人教版 教学目标: 1.进一步理解什么是;算法,知道算法的多样性 2.能够对设计的算法做简装的评价 3.学会利用自然语言、流程图和伪代码来描述算......