算法训练手记-序章
为什么要在这个时候又提算法训练
因为在自己漫长的学习生活中,算法实际上陪伴了整个CS学习的过程中,从第一次接触蓝桥杯后,后面学习网络,到后面学习Java开发,接触Android和J2EE,抑或是再到后面接触Linux、Nodejs、安全、学习Linux下网络和运维,自己实际上都一直在逃避有关于算法的开发或者是学习,导致后面在毕业时没有重视的问题暴露出来。不得不承认,现阶段的CS相关专业招聘在一开始让手写算法题目有失偏颇,但是,这种从国外科技公司继承过来的习惯是可以一定程度上反应从业人员在CS领域中的思维和浸淫程度,毕竟CS中任何一个分支或者是相关非专业的领域,都是需要计算机思维的训练。所以在这里算是能第一次正视自己身上存在的问题,并从一开始学习CS的算法。
ACM
说实话,自己一直羡慕ACMer,可以在屏幕前肆意将自己的想法转变为指下的代码,用计算的巧妙的算法来解决看起来很匪夷所思的问题。现在想一想,这才是一名专业的科班的CS专业学生应该掌握的东西,这才是正儿八经的计算机思维。而自己前几年掌握的Linux、安全、网络,并不是说不值一提,相反,缺少了内功的支持,再铜皮铁骨也是色厉内荏,没有系统的、专业的、长期的计算机思维的训练,很难成为一流的“计算机科学”工程师,现在大概可以理解为什么很多高校将计算机科学和软件工程、网络工程等专业分离开。
为什么在算法训练这里提到ACM,有两点原因,第一点是随着国内互联网环境的越来越复杂,CS专业的门槛看起来越来越低,但是国内企业却在笔试上做的文章越来越多。这就导致很多技术很好但是没有刷题的同学没有能够在刷题上下功夫,错过很多很好的岗位;第二点是由于笔者本人目前是在校的研究生,距离秋招还有两年的时间,距离毕业也还有两年的时间,与其说是为了秋招,不如是想着自己在25岁之前,可以再进一步夯实自己的计算机思维,想要下笔如有神,得先读书破万卷吧,code也是一样,喂题,思考,反馈,消化,最后留下的,才是能影响CS相关从业者一辈子的事情。
有必要再解释一下算法
自己一开始也没有很好理解这个词语,毕竟也是从国外翻译过来的单词。笔者理解的算法是宏观上的可以解决一类问题的方法,从小学到大的数学是算法的一种形式,物理、化学、生物、甚至之乎者也都包含了算法的影子,卖油的老大爷早就告诉我们,唯手熟尔,更何况先如今天才辈出,各种造神、捧神的影响下,越来越少的人愿意相信学会某一种技术需要持续不断的精力投入,并不是考上大学、研究生、甚至博士就可以解决问题。算法也是一样,竞赛只是解决问题的一种形式,如果可以通过锻炼获得这种能力,那么这种能力和打CTF、网络竞赛、甚至做项目如出一辙。
所以算法是通过学习、锻炼获得的,诚然,你我可能都听过各种大神的名字、比如Tourist、楼教主,甚至在b站上都可以看到很多大佬在直播每周lc或者cf的比赛,我有幸认识其中的几位,聊过之后,除了自卑,什么都不剩。
关于笔者自己
前面提过本人目前研究生一年级在读,很惭愧只掌握了一点术而欠缺了相当多的道的梳理,本科是网络工程专业,但是在本科阶段也学过了离散数学、组合数学、编译原理等CS专业的课程,第一次考研考的845,结果心比天高,基础还不牢,导致失利,索性第二次考回了自己的学校,考研要求的数据结构和算法和蓝桥杯和ACM都不是一种东西。所以在这次正视自己身上专业的问题,决定要从ACM的角度,来训练自己的计算机思维。
关于如何训练
常规数据结构如下:
- 树
- 图
- 链表&数组
- 串 其他的类似DP、贪心、并查集等都是某种思想,然后本人是参考OIwiki作为教科书来学习和训练的,其中也包含了很多有关组合数学、数论、几何学、和凸集等很多问题。
说实话,很难,但是也需要一点一点打基础来训练。所以笔者这里给出使用cf、lc以及hdu方法,cf是笔者接触比赛中举办较为频繁的,但是由于是英文,所以对很多同学不是很友好,而hdu的题目没有给出分类,这里需要从网上找一些大佬给出的分类集合,进行有针对性的训练。
还能有考研数学、高考数学的内容多么?大概经过训练后,常见数据结构比如BFS、DFS、并查集可以无脑写出相关的递归和迭代的代码,难一些的比如网络流或者欧拉图或者弦图,需要理解算法思路,在固定时间内可以有效的找到针对问题的合适解决方案。而在算法竞赛中,会存在很多的需要奇技淫巧来解决的问题,笔者自认为不是一个高智商的人,所以针对这种问题,笔者pick case by case了。
总结
读书破万卷,下笔如有神。