学习算法的心得体会
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习算法的心得体会
篇一:算法学习心得
班级:物联1201 姓名:刘潇学号:29
一、实验内容:
这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数
组,对话框下拉列表,排序问题。
二、学习掌握:
基本程序描述:
(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 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)//递归解决pireturn merge(y1,y2,,yk) //合并子问题 }
6、贪心算法
贪心算法也称贪婪算法。
它在对问题求解时,总是做出在当前看来是最好的选择。
它不
从整体最优上考虑,所得出的仅是在某种意义上的局部最优解。
贪心算法的基本思路如下:
篇二:算法设计与分析课程的心得体会
《算法设计与分析》课程的心得体会
以最少的成本、最快的速度、最好的质量开发出合适各种各样应用需求的软件,必须遵循软件工程的原则,设计出高效率的程序。
一个高效的程序不仅需要编程技巧,更需要合理的数据组织和清晰高效的算法。
这正是计算机科学领域里数据结构与算法设计所研究的主要内容。
一些著名的计算机科学家认为,算法是一种创造性思维活动,并且处于计算
机科学与技术学科的核心。
在计算机软件专业中算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。
很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。
算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。
如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂性和时间复杂度来衡量。
算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。
算法设计与分析是计算机科学与技术的一个核心问题。
因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。
那么,什么是算法呢?算法是指解决问题的方法或过程。
算法
满足四个性质,即输入、输出、确定性和有限性。
为了了解算法,这个学期马老师带我们走进了算法的世界。
马老师这学期提出不少实际的问题,以及解决问题的算法。
我在此只说比较记忆深刻的问题,即0-1背包的问题。
0-1背包问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
问题的名称来源于如何选择最合适的物品放置于给定背包中。
首先,0-1背包问题具有最优子结构性质和子问题重叠性质,适于采用动态规划方法求解。
动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干个子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的,若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费过多的时间。
动态规划法又和贪婪算法有些一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。
不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。
用动态规划法解决问题的思路如下:
最优决策序列由最优决策子序列组成。
假设f (i,y)表示剩余容
量为y,剩余物品为i, i+1, , n时的最优解的值,即:
f (n,y) = Pn,if y≥Wn
f (n,y) = 0, if 0≤y≤Wn
和
f(i,y)=max(f(i+1,y),f(i+1,y-Wi)+Pi) y≥Wi
f(i,y)=f(i+1,y)0≤y≤Wi
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的,所以有必要将它详细解释一下:“将前i件物品放入容量为y的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为y的背包中”,价值为f[i-1][y];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为y-Wi的背包中”,此时能获得的最大价值就是f[i-1][y-Wi]再加上通过放入第i件物品获得的价值Pi。
用贪心算法解决问题的基本思路如下:
由所有解元素组合成问题的一个可行解;从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。
当达到某算法中的某一步不能再继续前进时,算法停止。
实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步do求出可行解的一个解元素;
该算法存在问题:首先不能保证求得的最后解是最佳的;其次不
能用来求最大或最小解问题,并且只能求满足某些约束条件的可行解的范围。
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。
所以0-1背包问题也可以用回溯法解决。
其基本思路是可先将物品依其单位重量价值从大到小排序,此后只要顺序考察各物品即可,这是为了便于计算上界,。
在实现时,由bound计算当前结点处的上界。
在搜索解空间树时,只要其左儿子节点是一个可行结点,搜索就进入左子树,在右子树中有可能包含最优解是才进入右子树搜索。
否则将右子树剪去。
当然0-1背包问题还有许多的解决方案,此处就不一一列出。
不过通过0-1背包问题,我深刻体会到算法的魅力,体会到同一个问题用不同的方法解决的妙处。
学无止境,《算法设计与分析》仅仅是我学习算法知识入门课,我不会停下脚步,在此之后我依然会努力学习算法知识。
篇三:算法设计与分析学习心得
算法设计与分析学习心得
班级:物联1201 姓名:刘潇学号:29
一、实验内容:
这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。