导言
这是一篇主要面向大一新生,或者想学算法的同学的文档。主要总结了我学习算法这一年来的经验和学习资源。 因为作为一名大二的学生,我没有拿到任何的算法奖项,所以这篇文档其本身只作为参考。 不过,全网刷题数量总计已有300+了。因为大一没有人带,纯靠自己抹黑一步一步走过来,这篇文档多多少少对你会有一些帮助。
学习一门高级编程语言(个人推荐C++)
为什么是C++?为什么就不能是C,Java,Python,JS,Go等等这些语言呢? 第一,最客观的一点就是,算法类竞赛所用的语言大多都是C++。例如,在2013年ACM/ICPC世界总决赛中,有1347份用C++提交,323份用Java提交,C代码一份都没有。为许多人所熟知的蓝桥杯,C/C++组的选手也是最多的。 第二,结构化编程,且内置了许多现成的数据结构和简单算法函数。什么是结构化编程?一个程序由一个个函数组成,函数充当一等公民的编程风格/形式就叫结构化编程 。要实现一个算法问题,其内部我们可以把它拆解成许多小问题来分别处理,结构清楚,其实就不用想Java那样写一个方法(函数)之前还必须写一个类,有除算法之外的考虑。同时,C++的STL库还内置了诸如list(链表),vector(变长数组),queue(队列),stack(栈),set(集合),map(哈希表),sort(快速排序函数),lower_bound/upper_bound(二分查找函数),accumulate(累加函数) 等使用起来尤为方便的数据结构与简单算法函数。而C语言,这些都没有(除了sort),想要使用,只能手写。C++既可以偷懒使用STL,也可以自己去手写、改良理想的数据结构。 因此C++很适合拿来写算法,参加算法竞赛。 对于科班的学生,我会先让他先把C语言学好了,再来学C++,这是专业需要,也可以触类旁通。 非科班的,直接来学习C++,可能会遇到一些障碍,但也不是啥大问题。 当然,如果你觉得用其他语言来写算法更舒服, 那也可以不用学习C++。Java,Python,JS,Go,Rust,甚至是C,Pascal、Fortran,只要你觉得用着习惯、舒服,都可以。 那么C++应该怎么学?我推荐去看《C++ Essential》的前三章 内容。注意,如果只是想学算法,读完前三章的内容就足够了,因为这其中的内容涉及的就是C++的基础语法,拿来写算法足够了。在看书的过程中,遇到了问题去解决就是了,很快就可以掌握基本的语法。
学习数据结构
我们现在已经掌握了一门语言了,是不是现在就可以开始写算法了呢? 还不能 。在正式开始学习算法之前,必须先学习一门课程叫《数据结构》
。如果说前面是建议,那么现在所说的,就是客观上的必要条件。 因为如果不能对数据结构有良好认知,就不能对所给数据做出合适的存储和操作,很难写出正确且高效的算法。 只要你想学习算法,无论你是科班还是非科班,数据结构你都应该去学。 这里推荐书籍《大话数据结构》和浙江大学陈越老师的线上课程《数据结构》。 《大话数据结构》相比于总是用专业名词来解释专业名词 的教材来讲,更为通俗易懂,也比较有趣,所用的语言也是适合展现实现细节的C语言,很值得小白去读一读。
如果你已经有了一定的基础,针对编程,能够理解更为复杂的措辞和逻辑,那么我诚挚地推荐你去听听陈越老师的《数据结构》 。这是浙江大学非常经典的一门课程,课程的主讲陈越老师,讲课足够有趣,一字一句把想法、逻辑梳理得非常清楚,完全不像某些PPTeacher的照本宣科。 但是其课程难度相较于通俗的《大话数据结构》来说,理解的难度高了一些,但是我认为,这恰巧提供了思考的空间,我个人从这门课程当中,还是收获良多的。
中国大学MOOC:www.icourse163.org/course/ZJU-...
终于可以开始学习算法啦!
在学习数据结构的过程中,你可能会发现,为了方便对某种数据结构进行操作,你慢慢地开始接触到了一些算法。 学到线性表,就可能会看到二分法 比如谈到二叉树,我们就一定会聊到递归 ; 来到图,我们就一定会开始试着写DFS和BFS 。 数据结构和算法就是这样,总是绑在一起。但是这些算法知识还不够,重要的动态规划 算法我们还没有学到呢。 正式开始学习算法,那么又要怎么学呢?先让我们对所有常见的算法进行一个概览和大体认识吧,这里推荐一本适合小白入门算法的图书《算法图解》
。 这本图书采用了大量的漫画形式来讲解每一个算法,读起来很轻松,可以使初学者较为容易地认识所有常见且相对重要的算法。
学习算法呢,学的部分占三成,练的部分占七成 ,因此接下来我们就需要针对每一种算法,加强练习。 洛谷 就以每种算法为单位整理了很多题单,由易到难,大家照着去练习就是了,遇到不会的,还可以看看别人写的题解,有不明白的知识点,有针对性地去搜集相关的资料及时查漏补缺。
说到题单,包括我在内的许多人,可能还会想到《代码随想录》
,这份题单整理地非常好。有理论知识的讲解,题目安排地也非常合理,几乎每一道题都有视频讲解 ,对于算法题不知道从何刷起的小白、还有急着准备笔试面试的同学都有很大的帮助作用。但是,如果是面向于算法竞赛的同学,《代码随想录》可能不那么合适,因为里面涉及的每一道题都是力扣上的,而力扣的代码提交都是接口式 的,而基本上所有的算法竞赛都是ACM模式的。也许算法的核心不是这些形式,但两者还是有比较大的差别的。因此,希望参加算法竞赛,还是尽可能去洛谷上刷题。
说到刷题,其实不管学什么,我们都少不了练习。之前说的C++,数据结构,在学习的过程中,我们都应该有针对性地去找题目来练习,这里推荐牛客网上的语言基础题 和洛谷官方题单的数据结构题单。
常做模拟,常写博客
不论你要不要参加比赛,在做每一道题的时候,都应该限定时间。超过了时间,就不要继续一个人死磕了,不会就是不会,看别人的题解,领会别人的思路,也是一种锻炼。 对于限时训练,我非常推荐大家去参加牛客竞赛,洛谷网站 上经常会举办的模拟赛,二者都严格限时,判题的OJ系统性能良好,每一场比赛的难易程度也都明确标明了。AC每一道题,赢得每一场比赛, 都能获得相应的分数,然后在全站显示排名,对于迫切希望参加算法竞赛的同学来说,这是非常好的模拟训练。 如果你的英语很不错,也欢迎来参加Atcoder Beginner Contest、Codeforces 上举办的比赛,这里有来自全球各地的选手,既可以和高手过招,也可以找到自己的小团体。
以上谈到的所有平台网站都没有任何的硬性门槛,无论你的学历如何,都可以参加。 每做完一些题目,相信你自己也有一些心得体会了,尝试着把想法整理成文字,写成一篇篇题解博客。 不用害怕会被嘲笑,既然已经开始写博客了,那就肯定会考虑自己语言的正确性、准确性,尽可能去写,这个过程受益最多的人是你------因为我们之所以写博客,其目的之一就是总结归纳,这同样很重要。
学习当中遇到的问题
你肯定会遇到很多问题,不管是谁,在学习的过程中,就是会遇到许多坎坷。而且很多坎坷,甚至有时还不是非技术型的。因为相信看这个视频的大多数人都是大学生,如果你是一个比较上进的同学,在大学当中你应该会比较忙。要完成课程安排的任务,时不时要去做一些兼职,学校里头可能还要经常处理一些鸡零狗碎的事情,这都是技术以外,你一定会遇到的事情。 你会遇到很多很多问题,但如何去解决问题,也是咱们程序员的一项基本能力。现在互联网上资源很丰富,初学阶段遇到的问题,搜一搜总能找到答案。找不到,积极主动地去找自己的学长学姐或者老师,学会交流,然后尝试着自己把答案讲出来。 有些同学可能看到有些大一就拿了国奖金牌,这里就存在着一定的幸存者偏差。而且还要知道,人家努力的样子你没有看到,努力了多久你可能也不知道,他的起点是不是和你一样也不清楚------这些要做对比之前的控制变量都没有做好,就着急对自己下定义,设目标,是不恰当的。 算法这个东西呢,我这一年也是抹黑过来的,它也不是什么很容易就弄明白的事情,甚至也不是我这个水平能一直干下去的事儿。这一期视频只是分享经验。 如果你能在写算法当中找到乐趣,取得好成绩,那么它也能在之后的求职面试起到很大的作用。 如果你实在学不懂算法,也不用去焦虑,多学技术,多做项目,一样可以提升自己的行业竞争力。 包括算法在内,在学习任何知识的过程中,都要保持着最初那颗热爱的心。一旦你想好了,就努力去做吧。