3.2 算法杂谈
学计算机要先学算法吗?
也许有的同学在高中阶段接触过信息学奥赛,那么也许你已经对基础的算法知识已经有了一定的了解。
那么对于没有接触过算法的同学来说呢?也许你们听过 Niklaus Emil Wirth 的一句话:“程序 = 算法 + 数据结构。” 可能有的同学这个时候就要说了:“你看算法多重要,你没有算法就没有程序!” 但这句话中的算法并不是你们所理解的狭义的 “算法”。
广义上来说,“算法” 可以被理解为是一组解决特定问题的有序步骤,它在描述一个 “流程”,诸如做菜的流程、排课表都可以被认为是一种算法。利用计算机逻辑解决问题才是算法的核心。
学习算法的基础是拥有最基本的计算机素养,你需要优先学习一些基本的计算机概念、编程语言、简单的数据结构(数组、链表等),这些基本知识是你能够灵活利用算法的基础。
学了算法就相当于学好了计算机吗?
学好了算法当然不等于学好了计算机科学。计算机科学是一个非常庞大的知识体系,包括更为底层的计算机组成原理、编译原理等,更为表层的 AI,开发等,是一门综合性学科。总的来说,算法是计算机科学中较为重要的一部分,但远远不是全部。
学算法就要用《算法导论》一类的书吗?
我的答案是否定的。它更适合作为 “工具书”(就像你英语的词典那样),而不是一本适合新生入门学习的书。可以使用《我的第一本算法书》一类的更为基础更为有趣的算法内容。相比于完全严谨的逻辑推导,初学者的诉求是在 "看得见,摸得着的例子和环境下探索和吸收新概念". 像这样的大部头可以在之后进行阅读。
学算法一定要用 C 语言吗?不用 C 语言可以吗?
不一定要用 C 语言。但是 C 语言作为一种贴近底层面向过程语言,对日后学习其他的语言会有较大的帮助。你也可以先学习 Python、JAVA 等等。学校的课程仅仅是教授一些比较基础的知识,如果想要真正掌握一门语言,需要在学校课程的基础上更进一大大大步。
ACM 怎么说?
前情提要,请尽量不要以功利的心态去参加 ACM,你想要的与你能得到的可能存在过大落差
ACM 是美国计算机协会(Association for Computing Machinery)的缩写,原先是 ICPC(国际大学生程序设计竞赛)的赞助商(2018 年后不再赞助),在国内与 ICPC 齐名的比赛还有 CCPC(中国大学生程序设计竞赛)。
但常说的 “ACM” 一般泛指一切采用 ACM 赛制(给定一定数量的题目,采用罚时制,通过相同题目数量的选手依据罚时决定排名)的程序设计竞赛。
在我校,参加 ACM 社团(姑且叫做社团)并不代表能够参加有含金量的团体赛(ICPC、CCPC 等)。你需要先参加由我校教练刘春英老师组织的各种比赛,有资格进入集训队后,才有机会代表学校参加比赛(当然不限名额的个人赛想参加就参加)。
进入集训队后采取末位淘汰制度(最后留下来的人在 20 人左右),最后留下来的人才有机会参加比赛。因此个人并不推荐 0 基础的同学对于 ACM 过于执着,有 0 基础的同学最后进入校队的例子,不过这通常意味着你一天至少得刷一道算法题。如果还是想尝试的同学,可以去洛谷 (www.luogu.com.cn)、Codeforces(www.codeforces.com)、Atcoder(atcoder.jp) 等平台上注册账号,练习题目,参加这些网站定期组织的一些比赛。
如果经过一段时间的练习能够在 Codefoces(www.codeforces.com)上达到 1400 以上的 Rating,那么可以再观望观望参与 ACM。