算法个人心得

算法学习心得:

算法这个词是在我在大学第一次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完全经典问题等内容。

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

 

第二篇:商法个人心得

商法个人学习心得

20xx010624 国贸105 蒋约翰

我们本次迎来了国际商法的第五次研讨,国际商法是一门十分重要的课程。《国际商法》是从20世纪xx年代开始才出现在我国各高等院校经济管理类专业教学中的一门新课程。尽管这门课程已在国外成为经济和管理类专业的主干课程,但在我国教学实践中却未得到足够的重视。目前除了一些重点院校的经济学专业将其列为国际贸易和国际经济专业本科学生的必修课外,其他一些院校仍然持一种观望态度,只是在国际贸易专业的专科教学中试行,甚至将其定为考查课或选修课。《国际商法》课程在经管类专业教学中的地位和作用十分重要。随着我国社会主义市场经济的发展和完善以及对外开放力度的不断加大,我国的涉外经济与贸易活动更加活跃。在从事对外经济与贸易活动中,不可避免地要涉及国际商事方面的法律和法规。只有掌握和利用国际商事方面的各种法规,才能更好地从事对外经济贸易活动,才能在对外经济与贸易活动中减少盲目性,维护我国的正当权益。此外,经济全球化给世界各国带来了千载难逢的发展机遇和前所未有的严峻考验。

国际商法可以促进国民经济和世界经济的发展。国际商务活动所涉及的商品、劳务、资本、人力、技术、信息资源等在国际间的移动,既包括一般商品和劳务在国际间的转移,也包括生产要素,如劳动力、土地、技术、资本、管理经验、信息、知识等在国际间的流动。商品在国际间的交换可以互通有无,调剂国内市场供求关系,节约社会劳动,扩大国内生产能力,增加国民生产总值,从而促进世界经济发展。而生产要素在国际间的流动有利于生产要素重新优化组合、合理配置,从而也促进了各国经济和世界经济的发展。在商品和生产要素的国际流动中,必然会产生一些矛盾,阻碍其顺利进行。国际商法就是解决这些矛盾,从而保障商品和生产要素在国际间的自由流动。因而国际商法具有促进国民经济和世界经济的发展,为其保驾护航的重要作用。在当前世界经济一体化的浪潮中,企业只有立足国内市场,面向国际市场,走外向型经济和企业国际化经营之路,才能有更广阔的生存发展空间。而国际商法在加速我国企业走外向型经济和企业国际化经营之路方面将发挥越来越大的作用。

本次我们面临的案例是票据法案例。票据关系是因为票据的签发、转让、承

兑、保证等形成的以金钱利益为内容的财产关系。票据关系是财产关系,具有私法上财产关系的基本特点,理应受私法调整。然而,票据关系又具备私法商物权关系、一般债权关系所不能有的特点,难以用物权法、债权法加以规范。为有效保障票据的使用和流通,保护票据关系当事人合法利益,促进经济发展,国家制定票据法专门调整票据关系。(二)票据法是调整票据关系的法律规范的总括性称谓 票据法有广、狭二义。狭义的票据法,也叫“形式票据法”,指由国家立法机关按照一定体系编制颁行的名叫票据法的法律。如我国《票据法》、《德国票据法》等。广义的票据法,又称“实质票据法”,指一切有关票据的法律规范。广义的票据法不仅包括名为票据法的票据规范,还包括其他法律中对票据的规定,如民法中可以适用于票据的规范(人的行为能力制度、代理制度、动产物权制度等)、民事诉讼法中关于票据的规定(公示催告和除权判决、票据纠纷的诉讼等规范)、刑法中有关票据的规定(如伪造有价证券罪)、公证制度中关于拒绝证书的规定、破产法中关于票据当事人受破产宣告的规定、行政法规和规定中关于票据的规定。

票据基础关系主要有三种:票据原因关系、票据资金关系、票据预约关系。狭义的票据行为主要包括:出票(主票据行为)、背书、承兑、保证、参加(我国无) 票据解释原则为:外观解释原则、客观解释原则、有效解释原则 票据行为要件包括实质要件和形式要件等二类要件 :在票据上签章者,应承担票据责任,不在票据上签章者,不承担票据责任。没有代理权而以代理人名义在票据上签章的,应由签章人承担票据责任。票据越权代理可分为两种:增加金额的越权代理,其他越权代理。代理人超过代理权限的,应当就超过代理权限部分承担票据责任票据法上权利可分为两种:票据行为的相关权利和票据利益的相关权利。票据权利包括三项要件:持有票据 向票据债务人行使 请求一定金额支付。票据权利的二重性:支付请求权 追索权。票据权利的取得可分为原始取得(发行取得、善意取得)和继受取得。

本次案例涉及的票据法内容广泛,让我获益匪浅,我学到了很多知识,也学会了融会贯通。经过这次的国际商法研讨,我又成长了不少,这条道路,渐行渐远,不过我会坚定不移地走下去,因为路边的风景非常值得欣赏。

 

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

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

四.心得体会

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

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

相关推荐