1、算法学习心得算法设计与分析学习心得 班级:物联网1201 姓名:刘潇 学号:* 一、实验内容: 这学期的算法与设计课,老师布置了这四个问题,分别是货郎担问题,动态生成二维数组,对话框下拉列表,排序问题。 二、学习掌握: 基本程序描述: (1)货郎担问题:货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有(n一1)!条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。货郎担的程序实现了利用穷举法解决货郎担问题,可以在城市个数和各地费用给定的情况下利用穷举法逐
2、一计算出每一条路线的费用,并从中选出费用最小的路线。从而求出问题的解 (2)费用矩阵:费用矩阵的主要内容是动态生成二维数组。首先由键盘输入自然数,费用矩阵的元素由随机数产生,并取整,把生成的矩阵存放在二维数组中,最后把矩阵内容输出到文件和屏幕上。它采用分支界限法,分支限界法的基本思想是对包含具有约束条件的最优化问题的所有可行解的解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解计算一个下界或上界。动态生成二维n*n的数组程序利用指针表示数组的行和列,并逐一分配空间,在输入n的数值后,系统自动分配空间,生成n*n的数组,并产生随机数填充
3、数组,最后将结果输入到指定文件中。 三.疑问与总结: 货郎担的问题,我认为穷举法相对比而言是比较初级的方法,费时耗力,适合在练习时选用,但是在实际问题中不建议采用。克鲁斯卡尔或者普里姆算法求取最小生成树的方法来解决货郎担的问题是更适合现实解决问题的。我认为程序可以用switch函数来将函数分成几个部分更人性化,比如分为解决问题的的选项,输出结果选项,退出程序选项等。再有就是费用矩阵的值可以从文件中读取,而结果也可以直接放在指定文件中,这样在实际应用中比较广泛。 动态生成二维数组的程序我认为如果按照规范性,我的方法是中规中矩的,毕竟再向下延伸,生成三维的数组,需要三层的指针来实现。但是就程序的简
4、化程度和计算机处理时间来说,我认为这样双层指针的算法有些太占用内存,毕竟要给行和列各分配n个空间。我通过与同学的交流,我发现可以用1位数组来实现二维的n*n的数组。首先分配n*n的空间, 然后通过循环在一行的数据达到n时自动换行。这样程序得到了一定的简化,并且减少了一定的内存使用。我认为这种方法是比较贴合实际的。 四.心得体会 在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多人为它如痴如醉。很多问题的解决,程序的编写都要依赖它,在软件还是面向过程的阶段,就有程序=算法+数据结构这个公式。算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的
5、能力。 如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。因此,学习算法无疑会增强自己的竞争力,提高自己的修为,为自己增彩。篇二:算法个人心得 算法学习心得: 算法这个词是在我在大学第一次c语言课上听到的,当时老师讲的是程序=算法+数据结构,算法是
6、一个程序的灵魂。当时我什么也不懂,不知道什么叫数据结构,什么叫算法,它们是干什么的我也不明白。然而经历了大学四年的学习,现在的我对算法有了一个较为清晰的认识,对于它的作用也有了深刻的体会。 所谓算法简单来说就是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,也就是说算法告诉计算机怎么做,以此来解决问题。同一个问题存在多种算法来解决它,但是这些算法存在着优劣之分,好的算法速度快,效率高,占用空间小,差的算法不仅复杂难懂,而且效率低,对机器要求还高,当然,有时候算法之间存在一种互补关系,有些算法效率高,节省时间,但浪费空间,另外一些算法可能速度上慢些,但是空间比较节约,这时候我们就应该根
7、据实际要求,和具体情况来采取相应的算法来解决问题。 这学期算法课上我们主要讲了七部分内容. 第一章主要讲的是算法的基本概念,算法时间复杂度分析,算法的渐近时间复杂度等内容。因为算法之间的比较就是通过时间复杂度和空间复杂度来来比较的,第一章的主要目的就是让我们学会去分析一个算法的复杂度,以后就可以通过对复杂度的分析来评价算法的好坏。 第二章讲的是分治法,任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少,分治法的设计思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。在这一章中我们讲到了寻找
8、第k个元素,矩阵相乘,寻找最近点对等几个使用分治法的经典例子,最后还将讲到了傅里叶变换的问题。以前我们学到的归并排序,二分搜索其实也是基于分治法思想的。能采用分治法来解决的问题通常有如下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子 结构性质。 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公 共的子子问题。 在用分治法解决实际问题时,我们疑问究竟各个子问题的规模应该怎样才为适当?从大量实践中发现,在用分治法设计算法时,最好使子问题的规
9、模大致相同。换句话说,将一个问题分成大小相等的k个子问题的处理方法是行之有效的,这就是一种平衡的思想。 第三章主要讲动态规划问题。这一章的内容我觉得是算法设计思想中最难,也最有趣的这部分。什么叫动态规划,动态规划的思想是什么?动态规划采用自顶向下的方式分析问题,自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。多阶段决策问题是根据问题本身的特点,将其求解的过程划分为若干个相互独立又相互联系的阶段,在每一个阶段都需要做出决策,并且在一个阶段
10、的决策确定以后再转移到下一个阶段,在每一阶段选取其最优决策,从而实现整个过程总体决策最优的目的(引用)。还记得期末考试中的最后一道关于任意给定一个数,从所给的牌中用最少的牌组成这个数,这个问题其实就可以用动态规划来解决。本科期间,在算法课上老师在动态规划这一章不布置的一个作业跟这个题目类似,当时的题目是找钱问题,问题是这样描述的:有n种不同面值的硬币,各硬币面值存于数组t1:n,现用这些面值的钱来找钱,编程计算找钱m的最少硬币数及各个面值。 分析如下:假设对于i = 1.n-1, 所需最少的硬币数count(i) 已知, 那么对于n,所需的硬币数为min( count(i) + count(n
11、-i) , i=1.n-1; 于是一个直观的方法是用递归计算。 但是,递归过程中,每次计算count(i),都会重复计算 count(1).count(i-1); 这样时间复杂度就是o(n2); 我们可以从1开始记录下每个钱数所需的硬币枚数,避免重复计算,为了能够输出硬币序列,我们还需要记录下每次新加入的硬币。 下面给出用动态规划解决此问题的递推式: 参数说明: 当只用面值为t1,t2,.tn来找出钱j时,所用的硬币的最小个数记为c(i,j),则c(i,j)的递推方程为: 运用这个递推式,我们可以从下往上记录各个j所需要的应兵书i,最后当j=m时,所对应的i就是我们要求的。 第四章讲的是集合算
12、法,这一章的内容是我第一次接触,以前没有学过。这一章主要讲了平摊分析,union-find,finding the depth,以及2-3树等内容,平摊分析教会我们如何从整体的角度去更精确的分析算法的时间复杂度,union-find sets是一种简单的用途广泛的集合,并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速,finding the depth 确定深度问题。为了既能求得各点在原先树中的正确深度、又能使时间复杂度较小, 需要使用具有路径压缩功能的f
13、ind-depth指令,同时还需要采取一些辅助手段来保证深度计算的正确性。2-3树具有以下几个特点:1、任一内结点(非叶结点)均有2个或3个儿子。2、从根到每片树叶的路径长度相等。3、内结点中只存放便于查找的信息,而叶结点中存放原始数据。 第五章主要讲了随机算法。在随机算法中,我们不要求算法对所有可能的输入均正确计算,只要求出现错误的可能性小到可以忽略的程度。另外我们也不要求对同一输入算法每次执行时给出相同的结果。我们所关心的是算法在执行时,是否能够产生真正随机的结果。有不少问题,目前只有效率很差的确定性求解算法, 但用随机算法去求解, 可以很快地获得相当可信的结果。随机算法通常分为两大类:l
14、as vegas算法、monte carlo算法。las vegas算法总是给出正确的结果,但在少数应用中,可能出现求不出解的情况。此时需再次调用算法进行计算,直到获得解为止.mont carlo算法通常不能保证计算出的结果总是正确,一般只能断定所给解的正确性不小于p(1/2p1)。通过反复执行算法(即以增大算法的执行时间为代价),能够使发生错误的概率小到可以忽略的程度。第五章还讲到素数测试,其中介绍了相关定理,重点讲了miller-rabin算法。 第六章介绍了计算模型,这一章主要介绍了有关计算的一些本质问题,random access machines(随机存取机,简称ram),存储程序模
15、型rasp(random access stored program),图灵机(turning machine)以及各个计算模型之间的关系。 第七章介绍了np完全问题,主要包括近似算法(approximation algorithms),非确定性turing机 ndtm,确定性turing机 dtm,以及之间的区别,np完全经典问题等内容。 经过一学期的算法学习,我对算法的了解进一步加深,曾经学习过的内容得到进一步巩固,同时没有接触的内容也让我有了新的认识。作为一名计算机专业的学生,算法是一门基础学科,它里面包含的思想无处不在,学好算法分析,对于在自己的方向上获得启示,体会更深有着重大作用。所
16、以,我们应该培养对算法的兴趣,将算法的运用融入到生活当中,比如找钱问题就是个很好的例子,通过具体的生活实例来让算法变得更加有魅力,有吸引力,以此来激发对算法的兴趣。篇三:算法设计与分析学习总结 算法分析与设计 学习总结 题目:算法分析与设计学习总结 学 院 信息科学与工程学院 专 业 届 次 学生姓名 学 号 二一三年一月十五日 算法分析与设计学习总结 本学期通过学习算法分析与设计课程,了解到:算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。算法能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不
17、同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。 设计的算法要具有以下的特征才能有效的完成设计要求,算法的特征有:(1)有穷性。算法在执行有限步后必须终止。(2)确定性。算法的每一个步骤必须有确切的定义。(3)输入。一个算法有0个或多个输入,作为算法开始执行前的初始值,或初始状态。(4)输出。一个算法有一个或多个输出
18、,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。(5)可行性。在有限时间内完成计算过程。 算法设计的整个过程,可以包含对问题需求的说明、数学模型的拟制、算法的详细设计、算法的正确性验证、算法的实现、算法分析、程序测试和文档资料的编制。算法可大致分为基本算法、数据结构的算法、数论与 代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法和并行算法。 经典的算法主要有: 1、 穷举搜索法 穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,bing从中找出那些符合要求的候选解作为问题的解。 穷举算法特点是算法简单,但运行时所花费的时间量大。
19、有些问题所列举书来的情况数目会大得惊人,就是用高速计算机运行,其等待运行结果的时间也将使人无法忍受。我们在用穷举算法解决问题是,应尽可能将明显不符合条件的情况排除在外,以尽快取得问题的解。 2、 迭代算法 迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或方程组)的过程,为实现这一过程所使用的方法统称为迭代法。迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0。 (2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量
20、x0。 (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。 3、 递推算法 递推算法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的。 4、 递归算法 递归算法是一种直接或间接的调用自身的算法。 能采用递归描述的算法通常有这样的特征:为求解规模为n的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的
21、解构造出规 模较大问题的解。特别的,当规模n=0或1时,能直接得解。 递归算法解决问题的特点有: (1) 递归就是在过程或函数里调用自身 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低 (4) 在递归调用的过程中系统为每一层的返回点、局部变量等开辟堆栈来存 储。 举例如下: fibonacci数列 int fib50; /采用数组保存中间结果 void fibonacci(int n) fib0 = 1; fib1 = 1; for (int i=2; i<=n; i+) fibi = fibi-1+
22、fibi-2; 5、 分治算法 分治算法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单地直接求解,原问题的解即子问题解的合并。 如果原问题可分割成k个子问题,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 分
23、治策略的算法设计模式 divide_and_conquer(p) if (|p|n0 ) return adhoc(p); divide p into smaller substances p1,p2,.,pk; for (i1; ik; k) yidivide-and-conquer(pi) /递归解决pi return merge(y1,y2,.,yk) /合并子问题 6、 贪心算法 贪心算法也称贪婪算法。它在对问题求解时,总是做出在当前看来是最好的选择。它不从整体最优上考虑,所得出的仅是在某种意义上的局部最优解。 贪心算法的基本思路如下: (1) 建立数学模型来描述问题 (2) 把求解的
24、问题分成若干个子问题 (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
25、:检查解集合s是否构成问题的完整解。 (4)选择函数select:贪心策略,这是贪心算法的关键。 (5)可行函数feasible:解集合扩展后是否满足约束条件。 7、 动态规划算法 动态规划算法是一种在数学和计算机科学中用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。 动态规划算法的步骤 (1)找出最优解的性质,并刻画其结构特征; (2)递归地定义最优值(写出动态规划方程); (3)以自底向上的方式计算出最优值; (4)根据算法最优值时得到的信息,构造一个最优值。 动态规划算法的有效性依赖于问题本身所具有的两个重要
26、的性质:最优子结构性质和子问题重叠性质。 (1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 (2)重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。 8、 回溯算法 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。当探索到某一步时,发现原先的选择并不优或达不到目标,就回退一步重新选择,这种走不通就退回再走的技术成为回溯法,满足回溯条件的某个状态的点称为回溯点。迷宫问题算法所采用的就是回溯算法。 回溯算法解决问题的过程是先选择某一可能的线索进行试探,每一步试探都有多种方式,将每一方式都一一试探,如有问
27、题就返回纠正,反复进行这种试探在反复纠正,直到得出全部符合条件的答案或是问题无解为止。由于回溯方法的本质是深度优先的方法在解的空间树中搜索,就要从堆栈中找到回溯的前一个位置继续试探。 装载问题回溯算法数据结构 #define num 100 int n; /集装箱的数量 int c; /轮船的载重量 int wnum; /集装箱的重量数组 int xnum; /当前搜索的解向量 int r; /剩余集装箱的重量 int cw; /当前轮船的载重量 int bestw; /当前最优载重量 int bestxnum; /当前最优解 算法实现 /形参表示搜索第t层结点 void backtrack(
28、int t) /到达叶子结点 if(t>n) /更新最优解 if(cw>bestw) for(int i=1; i<=n; i+) bestxi = xi; bestw = cw; return; /更新剩余集装箱的重量 r -= wt; /搜索左子树 if(cw+wt<=c) xt = 1; cw += wt; backtrack(t+1); cw -= wt; /搜索右子树 if(cw+r>bestw) xt=0; backtrack(t+1); r += wt; /恢复状态 9、 分支限界算法 分支限界算法是一种在表示问题解空间的树上进行系统搜索的方法。该方
29、法使用了广度篇四:算法设计与实现个人课程总结 算法课程总结 指导教师 所在院(系) 班 级 学生姓名 学 号 一、算法概述 1.什么是算法? 算法是解一确定类问题的任意一种特殊的方法。在计算机科学中,算法是使用计算机解一类问题的精确、有效方法的代名词。算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。 2.算法的五个重要特性:确定性、能行性、输入、输出、有穷性/有限性。 1)确定性:算法每种运算必须有确切定义,不能有二义性。 2)能行性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在有限的时间内完成。 3)输入:每个算法有0个或多个输入。这些输入是在算法开始
30、之前给出的量,取自于特定的对象集合-定义域 4)输出:一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量。 5)有穷性/有限性:一个算法总是在执行了有穷步的运算之后终止。 3.计算过程:只满足确定性、能行性、输入、输出四个特性但不一定能终止的一组规则。 4.准确理解算法和计算过程的区别:不能终止的计算过程:操作系统;算法是可以终止的计算过程;算法的时效性:只能把在相当有穷步内终止的算法投入到计算机上运行。 5.算法的语言主要有:自然语言,流程图,盒图,pad图,伪代码,计算机程序设计语言。 6.算法分类: 1)多项式时间算法:可用多项式(函数)对其计算时间限界的算法。常见的多项式限界函数有:(1) < (logn) < (n) < (nlogn) < (n2) < (n3) 2)指数时间算法:计算时间用指数函数限界的算法。常见的指数时间限界函数:(2n) < (n!) < (nn) 7.算法基本工具:循环与递归, 算法与数据结构,优化算法的数学模型。 8.主要算法:迭代算法,蛮力法,分治法,动态规划法,贪婪算法,图搜索基础。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1