前两天,一位在国外陪儿子读书的妈妈联系到我,想要了解如何备考USACO。孩子小学即将毕业,国外的功课并不忙,每天有大量的时间学习编程,关键是孩子也很喜欢编程,已经在网上学习一年了,取得了一定的进步。目前的阶段应该是能够跟着线上的课程做一些小的程序,但还无法独立的用编程去解决问题,接下来想获得USACO证书,不知道下一步该如何学习。
相较于而言,编程是一个更加专业的事情,大部分的家长能够辅导数学,英语等课程,但无法辅导编程的学习。目前线上有很多好的学习资料和网站,这些内容虽然都和编程有关,但目标各不相同。有些网站是为了帮助学生建立些编程的基本概念,例如跟着教程做一两个小游戏,孩子跟着教程的时候看起来都会了,但脱离教程很难独立完成任何程序;有些网站则是各种题目和内容的罗列,如果不加以选择,那么就掉入了题海之中;还有些网站针对的是成人培训,更多是侧重于工作需要的学习,其内容是学习某个应用框架,这种并不适合孩子。
对于刚接触编程的学生来说,如果能够在早期学习更多的编程核心算法,对今后深入到人工智能等计算机核心领域会非常有帮助,如果后续准备以编程为工作,这样的核心算法学习也能帮你顺利进入到一流的企业。这就像建楼一样,地基打的越深,今后的发展和前途就越不可限量。与其耗费时间去做几个看起来有点炫的小程序,还不如深入到编程核心,掌握计算思维,学习如何更好的用计算机来解决问题。
USACO作为美国信息学奥赛的选拔比赛,其核心考点就是计算机的算法和数据结构,其目标就是要培养学生计算思维,充分利用计算机来解决问题。那么针对这个目标,应该学习哪些知识点呢?这里我们给出一份学习清单,这份清单可是来之不易的,是邀请了南京外国语学校(信息奥名校)的信息学奥赛钻石教练亲自拟定的,希望能够对于备考USACO竞赛的学生有所帮助。那首先来看一下初学者需要掌握的知识点:
可以看到,对于初学者来说,在初步掌握了编程语言后,就可以开始接触一些算法和数据结构了,数据结构可以先了解概念,并且使用语言已经封装好的结构去解决一些问题,也就是说,可以先考虑如何使用这些数据结构,然后再去研究如何实现这个数据结构。这就好比学习开车,先不用学习那么多原理,先掌握如何控制方向盘,离合器等,能够熟练开车后,再考虑深入的了解下汽车内容是如何工作的。
上述这份清单是接下来需要深入掌握的知识点,数据结构依然是以使用为主,这里列出来的是C++语言STL库中的数据结构。算法层面主要是排序,简单策略和递归回溯,这里要重点强调一下递归回溯,这是一种很重要的算法,很多问题都能够使用这种策略获得解题思路。简单策略虽然名称上有简单两个字,但这种策略绝不简单,这种策略是非常符合计算机特性的,要知道电脑的特性就是运算速度快,每秒能达到上亿次运算,如果人脑按照每秒4次运算,那么电脑每秒的运算量相当于人类不吃不喝连续计算一年的时间,所以很多对于人脑来说计算量大的问题,对于电脑来说很简单,直接暴力解题法,让电脑去计算就好了。
进一步学习下去的话,就要重点