前言
这篇博客是关于一些关于阅读《算法竞赛入门经典·第 2 版》的一些小贴士。
老手自不必说,本博客针对的是刚接触这本书的一些新手。
为什么要读这一本书?
因为经典。首先作者的实力相当深厚,其次是选取的题目非常纯粹,都是 UVa 的题目,而我们也知道,UVa 的很多题目都是 acm 的原题,所以,题目的严谨性和质量有一定的保证,作为我们学习过程中的例题简直再合适不过。
那么,下面就讲一些我认为需要讲的点。
首先是前置条件,完整地、有体系地入门过数据结构。大概需要的程度是掌握 70% 的机械工业出版社的那本《数据结构与算法分析 C 语言描述》的内容。第一版和第二版都可以。这里插一句,一定要中英文放在一起看,为什么?因为如果你刚接触这本书,那么,你也就是大学低年级的水平,你的英文水平、专业词汇的水平还不够直接阅读英文原文,所以最好中英文放在一起看,中文觉得别扭的地方,翻开英文看看,记录一下不顺的地方,然后,把翻译得不好的地方放到网上供大家赏玩,让出版社蒙羞,注意,一定要有理有据,不然,和“秀才造反,三年不成,空谈误国”道理是一样的。
然后,一些必须放在身边的辅助的工具。
源码
第一,是源码,例题的代码在这个仓库:
https://github.com/aoapc-book/aoapc-bac2nd
这个例题的代码是刘汝佳亲自写的,代码质量有保证,不晦涩,很亲民,稍微多挠几下脑瓜,基本都可以搞懂。
习题的代码在这个仓库:
https://github.com/sukhoeing/aoapc-bac2nd-keys
这个是陈锋写的,我个人觉得写得不如刘汝佳,不能够做到鞭辟入里。当然,代码本身的正确性和简洁性是毋庸置疑的,这个也没的黑。
关于书的获取
这本书太有名了,随便谷歌一下即可获取。
要看原题描述
然后,因为书中的题目全部选自 UVa,所以,阅读每一个例题的时候,最好把 UVa 的英文原题的 pdf 摆在旁边,这个 pdf 可以到 UVa 官网获取,也可以到 vjudge 中去获取,这个也可以自行搜索(千万不要使用百度、必应国内版)即可。基本上输入题目的序号,就能找到其题目的链接的。比如,有些题目的链接:
- UVa442(UVa 官网): https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=383
- UVa442(vjudge): https://vjudge.net/problem/UVA-442
当然,UVa 也提供了一份题单,我个人觉得没有必要,遇到的时候,直接搜索一把即可,基本上前两个结果就是我们想要的。
跑测试用例
这里一定要借助 udebug 这个网站,输入题号,即可检索到大量的测试用例。便于我们在实际去跑一个题目的代码时去排查 bug。
因为有时候作者给出的代码不一定是完全正确的,以及,在我们自己去做额外的题目时,这时候就需要我们自己去利用测试用例排查了。
重定向标准输入
因为书里的题目都是 acm 模式,所以,我们自己在写题目的时候,肯定是要重定向标准输入到文件的,这样我们只需要把测试用例粘贴到文件中,然后,程序就可以从文件中读取测试用例了。
输出倒是不用重定向,直接输出到控制台我们也可以很容易观察。
如何提交代码
建议直接到 vjudge 中去提交,反正也是调用官方的 api。因为官网实在有点慢,难免,当然也理解,毕竟为爱发电。
关于例题的阅读
有些人喜欢去空想,硬想,你以为你是天才?随便翻开书中一道简单的 BFS 的题目,我们可以测试一下,自己在不看任何题解的情况下,需要花费多少时间解决。
编程没有天才,只有一些喜欢装逼的废柴。剩下的唯有多看多写多练。
很多时候,我们看到很多人可以凭空想出来,那么,我们也可以猜一猜,他们的题量是多少。而最初的题量,就是来自于对例题的理解。
我们听老师上课讲解题目,不也是相当于是看例题、看题解的过程吗?
所以,我这里更建议大家直接把书上的所有例题理解即可。不用尝试自己去做。等把所有的例题都吃透了,甚至是琢磨了两三遍,那么,我们就可以尝试去自己写书上的习题了,这时候,有了知识储备,再去尝试独立思考,那么,必定事半而功倍.。
阅读的笔记?
关于笔记,我们在理解题目和题解的时候,对于每一个题目,我们只需要弄清几个问题即可:
- 这样做的正确性书上给证明了吗?如果给了,理解简要的证明,也就理解了正确性。
- 如果没有给证明,我们就要自己想明白其中的正确性。
- 算法的时间复杂度/空间复杂度的理解和简要证明。
- 对于理解题意,也不必钻入细节,只要识别出题目的意图即可,因为,即使 UVa 的题目已经算是比较严谨了,却也依然有人力不可完全细察之处的缺漏。
- 最重要的一点,识别作者给出的代码的每一处意图。只有如此,我们才能在自己做题目的时候运用自如。
这样一套下来,其实,搞懂一个例题,不比我们写一道力扣中等题所花费的时间少,不过,却也必然比我们在没有任何/太多知识和题量储备的情况下去硬想力扣的题目所花费的时间要少得多。
而看懂一道题的收获,必然也是不少的,因为,这书中的大部分题目都是力扣的困难级别的。