一、自我总结
时间说慢也慢,说快也快,仿若眨眼一瞬间,这一学期就过去了。怎么说呢,刚开始上大学时,我就对代码这一块很感兴趣,在大一上学期听说了ACM这个竞赛时,我心动了,打算着在下学期好好学一手,也就提前购买了ACM类的书,自己没事的时候做做题,为下学期的acm的课程打个基础。可谁能想到,一场突如其来的疫情打乱了所有的计划,全部开始了网课。可这一下子就对我造成了很大影响,我自知是一个没太有自制力的人,所以在家里上网课就很容易走神,后来发现,的确是这样……
所以就由于这个问题,我不得不去多看几遍回放,多考虑考虑问题。但是有一说一,这段时间是苦的,乏味的,但也是幸运的。我觉得我很幸运能在这半年里接触了ACM,让我体会到数学的魅力,算法的精妙,而且也能看到很多大佬大牛的经历分享,真的是极大的丰富了我的知识面。
有一说一,我感觉听完、学完这门课是每个人都能办到的,只要不断地坚持下去就没有问题,但是想要彻彻底底的学好是需要天赋的,他需要一种对算法极强的理解能力,而有一些天赋好人就能很快地去理解这个算法,而天赋一般的就需要去花大量的时间去慢慢的理解,而且大概率还是弄不懂,这种痛苦的感觉我是深有体会的,还有就是做题的时候需要有“内味”,简单来说,就是得有那么一种感觉,可以解释成一种灵感,这个感觉就是当你看到这个题目的时候马上就想到大概可以用什么样的方法去解决这个问题,做出反应,但是天赋一般的人就可能一时半会绕不过那个弯来,卡在某个点不能自拔。没错,我就是这样一个天赋一般的人,但是我还是在这一个学期内的学到了一些有用的东西。
不说别的,单说在专业课方面,ACM的训练给了我在这方面很大的启发,拓宽了我在专业课方面的知识体系,像什么STL,贪心,在看到一些题时,就会有一种熟悉感,理解的会比较快一些。
有些遗憾的是,我在学习中后期,身体方面出现了一点问题,就导致我基本上很难去打晚上的cf比赛,打的话也就是做一下A题B题(由于在医院手不太方便,很难敲代码)。为了弥补这一点,我还是报名了每次比赛,赛后研究一下题目,看一下题解,理解一下思路。所以每次报名后都没打比赛,这就导致我的分数很低,我也很难受,感觉分都快扣完了…不过生活也马上回到正轨了,我也会继续坚持下去,平常的作业课程什么的我都有做,也都有听,但是比赛这块给我拉了后腿,挂不挂科…我不去考虑了,反正坚持下去吧,能收获到知识,提升自己就好。
二、学习总结
在这里自己总结一下这一学期学到的大类的知识点吧!
1.递归算法
这个怎么说呢,它的本质上就是函数自己调用自己,把一个整块的大问题变成一个小问题解决,但是尤其要注意的是递归结束的条件,找到递归结束的出口。但是递归有时候打比赛用不太上(个人理解),很容易超时,一般都是有更简单的思路的。
2.贪心算法
这个就很明显啦,着重注意这么一个“贪”字,先把大问题分割成一个个的小问题,然后找到每个小问题的最优解,再与之比较、运算,最终得到整体问题的最优解,我最喜欢的一个题就是那个小船过河问题,为什么?因为我感觉它太经典了,我就是从这个题开始,突然理解的贪心。
3.STL函数
我觉得对于STL上手还是挺快的,他极大的简化了我们在写代码时的难度,但是要熟练的使用还是需要不断去练习。主要包括递归递推问题,动态规划问题,广度深度搜索问题,二分,贪心,用于大数运算的高精度计算,这一部分难度提升了很多,需要大量的练习积累和深度的理解。
头文件< string>,要熟练的巧妙的使用它可以解决很多问题。尤其是自带的reverse函数。
头文件< queue>就是前进先出的特点,优先队列priority会将元素按照优先规则排序。
头文件< stack>,先进后出的特点。
头文件< vector>,各种函数用来操作vector里面的元素,使操作数组更加方便,还有不知道要用内存多大的数组的时候,动态数组就很不错,重要的是它可以存任何类型的元素。
头文件< map>,map:这个容器不再限于访问元素是下标为int类型map<下标类型,元素类型>,而且都会根据元素的键值自动排序。
Multimap可以两个元素对应相同的键值,但是map不行
头文件< set>,set和multiset会根据特定的排序准则,或者自己定义排序规则也可以,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
4、动态规划
动态规划基本思想:动态规划的基本思想与分治法非常的相似,也是将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了一定的信息。在求解每一个子问题时,根据可能存在的不同情况列出不同的式子,通过决策保留那些有可能达到最优的局部解。最后根据各个子问题的解整理得到最终题目的解。
而动态规划又与贪心算法有些类似,往往把一个问题的解决方案视为一系列决策的结果(我之前的博客里有对这两类的具体区别)。但与贪心算法不同的是,每采用一次贪心算法准则就要做出一个不可回溯的决策,而在动态规划中,还要观察每个最优决策的序列中是否包含一个最优子序列。
最长上升子序列,最长子序列和,最长m子序列和,01背包,混合背包等等,这些名词仿佛一位位老友,不知不觉间就能想到他们的名字,想到他们的思路,所以不得不说,ACM这条学习道路,还是真的蛮有趣的。
5、二分三分查找
这部分算法理解起来比较容易,这里就不多说啦,简单来说就是在查找元素的时候可以提高效率。并且知道问题求解范围,可以不断地二分验证求出答案。最典型的就是切绳子问题,a条切成b段,最长的长度是多少。简单的思路就是是在某一区间内查找元素,如果查找到了元素,结束;如果未查找到,目标元素在左边,更改上界,目标元素在右边,更改下界,直到找到或者逼近为止。
而三分与二分查找比较相似,二分查找利用的是函数的单调性,三分查找利用的是函数的凹凸性,在二分查找的基础上,在右区间(或左区间)再进行一次二分,每次缩小[a,b]的范围,不断逼近来求那个极值点即可。
6、数论
其实在接触到数论以后就能发现,它与前面的算法之间的联系的不是很紧密了,数论这里更注重的是数学方法的理解与应用,大部分是用来解决一些复杂的数学问题和降低题目的时间复杂度等等。
7、数据结构
这个专题emmmmmm…我感觉好难,理解起来倒是还行,真正让我去应用,那我是真的不太行…
生成树:由G的n-1条边构成的无环的子图,这些边的集合成为生成树。
最小生成树:所有生成树中权值最小的一个边集T为最小生成树,确定树T的问题成为最小生成树问题。
线段树:(这里引用了一下网上的概念)线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个结点最多有两颗子树,何为搜索,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案。
我这里就不具体分析总结了,因为我是真的不大行,这块的总结先这样吧…
三、感想与未来规划
怎么说呢,就感觉太快了吧,感觉自己还没学会多少东西,感觉自已依然很菜,就结课了…有种不真实的感觉。我开头已经说过一些感想了,这里也就不再多赘述了。大致说一下未来的规划吧:
1.最重要的一点,放弃是不可能放弃的,就是仍然菜也不会放弃的,都坚持这么长时间了,放弃有啥意义么?
2.上面也说过,我的生活也将逐步陆续恢复正轨,之前落下的比赛,扣的分数,也是时候补回来了,争取每周打一两次比赛,然后写写博客,整理一下错题,写写总结,不断巩固一下自己。虽然这门课程结束了,但是这个习惯必须保持住啊!
3.不定期再复习一下以前内容,加深一下印象,总结一下思路等等。
4.其实本来没有第四点的,但是我心血来潮又突然想写一点东西,写一点近况。这个漫长假期里,我不仅是在课程里与知识接触,我还在现实中与不同的人接触。我曾有这样的想法,我来到了山农这里,我很不错的,我很强,以后毕业工作也很好找,不用担心。但是随着我这段时间与一些人的交流谈心,我发现,我实在是太弱了!太菜了!我根本没法和他们去比。有出国留学,大二就精通日语法语英语的学姐;也有直接保研到名牌大学的学长。他们只比我大了一岁或者几岁,但是在知识层面,几年后的我,可能依旧比不上他们现在的水平。不论是在逻辑分析,问题处理,还是情绪把控等等的方面,我都是不及他们的。在那几天的交谈中,我愈来愈深刻体会到,更高水平的人,他们的圈子也是更高的,接触的东西也是更为优秀,更为广阔的。我不能沉溺于现在的圈子,我要跳出去!去更高水平的圈子里生存。当然我也明白,我本身的起点相比于大佬来说就低,所以我这才更需要去加倍努力,去一步步实现前段时间许下的承诺。
其实第四条,可能看起来和ACM并没有什么关系,但是,实际上,我想说,既然要开始努力奔向目标,完成那个承诺,那我就可以把ACM这段时间的终点,当作未来的起点。ACM我会一直坚持下去,希望不久的将来,我能跳出现在的圈子,向高处进发…
2020年6月15日