去年表弟刚参加完高考,在我的极力忽悠下,他把所有专业志愿都填上与计算机相关的专业,最终被网络工程专业所录取。刚进大学那会儿,他对我说,他觉得很迷茫,问我大学要怎么过。第一次有人问我这个问题,我也有点懵,就和他东拉西扯了一会儿,想到哪儿说哪儿。
他们学校的学习安排比我们当年要紧凑得多,老师还让他们牢记,“大学比高三更紧张”。而我们学校对我们差不多是放养政策,课时少,作业更少,每天都有大把大把的自由时间。大一上学期,我闲得发慌,不知道干什么,曾去街上发过传单,去别人家里做过家教,去社团写过新闻稿,去学生会打过杂,去长白山旅过游,和闺蜜讲过两次相声,还和班草谈过一段小恋爱。真的是小恋爱,两个月不到就分手了。虽然时间很短,但毕竟是我的初恋,要说不伤心是不可能的,感觉整颗心就好像浸泡在陈年老酒之中,又酸又涩。情场失意,考场得意。刚失恋的那半年,我用学习来麻痹自己,结果年级排名直接从50名左右一跃成为年级第一,体重也直接掉了15斤。后面,我就一直开启学霸模式,直到保研结束。
表弟听说我在大学玩ACM,觉得很高大上。我告诉他,ACM是用来打基础和培养兴趣的。他们学校有OJ网站,刚开始的时候,表弟兴趣浓浓,天天刷题,还经常和我探讨。从他发的消息中,我能够明显感受到他ac掉一道题目时的那种激动心情,我也经历过那些兴奋的时刻。我对他说:“厉害啊!第一个学期结束时姐姐连scanf都不会写。”有一次,他碰到《求一元二次方程的根》的题目,提交了8次都没过,就让我帮他看看。我读了一遍代码,也没有发现问题,就设计了一些测试用例,重点测试边界情况,最后发现是“-0”和“0”输出不一致的问题。我先简单给他说了一下问题出在哪儿,以及怎么修改,然后提醒他要注意代码规范,争取以后能写出优雅的代码,最后告诉他要学会自己调试程序、设计测试用例。
表弟玩ACM就是三分钟热度,玩了一个月就坚持不下去了,兴趣点转移到了社团乐队上,听说他还是乐队主唱。他特别喜欢张国荣,几乎会唱哥哥的每一首歌,他还把自己翻唱的歌发布在网上,并给我发了链接。我一个音盲,自然是听不出他唱得好坏。但妈妈曾告诉过我,弟弟唱歌唱得很好,音全在调上,而且很有韵味。当弟弟问我唱得怎么样的时候,我立马说:“唱得特别好听!羡慕嫉妒恨啊!”
弟弟说微积分和线性代数好难学,泰勒公式好难掌握,矩阵什么的已经听不懂了,问我这些东西是只有考试会考,还是以后也会用得上。我条件反射地回答数学很重要,以后也会用得上。但真要我回答哪里用上了,我一时半会也答不上来。当初学数学的时候,我就是单纯地觉得数学很有趣,并没想过以后有没有用。
我翻了翻自己的大学成绩单,发现自己数学科目的平均分竟有97.57。这份大学成绩单勾起了我的很多回忆,仅《组合数学导论》就勾起了我的两段回忆。一段是在最后一堂课上做了一次《组合数学之趣味题》的报告,其中有一节是讲错排问题的。这节快讲完的时候,我抛出了一个问题:“当n大于8时,全错排的概率接近于一个常数36.79%。这是我用程序跑出来的数据,但我不知道为什么是一个常数。有兴趣的同学可以试着自己证明。”结果还没等到下课,一个不认识的男生就给我递了一张纸条,上面写满了证明过程。我看得云里雾里,下课又和那个男生讨论了一下才弄明白,原来那个常数36.79%是1/e(e是自然常数,约为2.71828)。因为这件事,我俩成了好朋友。他比我低一级,是数学系的,两年后得了辽宁省数学专业奥赛第一名,学校大门的宣传栏里还放过他和他老师的照片。认识他之前,我觉得自己数学很厉害,认识他之后,我觉得自己数学很一般。另一段是中科院笔试时,有一道Ramsey定理的证明题,即世界上任意6个人中,总有3个人相互认识,或互相皆不认识。《组合数学导论》这门课让我对组合数学产出了兴趣,暑假的时候就花了三天时间看了60集北师大的组合数学视频。因为只看过一遍,所以对具体证明过程印象很模糊,但主要思想还是记得的,即将原问题转化成线段的二染色问题,并利用了抽屉原理。当时这道题只有我一个人证出来了,科院的老师和师兄都很惊喜,这也成为他们收下我的原因之一。
全错排问题:一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,问都装错信封的装法有多少种?都装错信封的概率是多大?
提示:F(1)=0; F(2)=1; F(n)=(n-1)*(F(n-2)+F(n-1));
答案:装法有F(n)种,概率为F(n) / n!
其实,工作中直接用到数学知识的时候比较少。直接用处少,并不代表数学不重要。数学是一门基础学科,对一个人的理性思维会产生潜移默化的影响。数学和计算机更是密不可割,起初大部分玩计算机的人都是从数学系转过去的,计算机领域的很多算法也离不开数学。除了数学,大学还会开设很多专业课,有些课在短时间内你并不能看出其价值,但几年后你很可能会在某个项目中用到大学学过的某个知识点。
以我研究生的第一个项目为例,内容是海量浮点数的快速排序。排序算法谁不会写,C++库函数中就有sort函数。如果数据量很大,内存装不下,就可以将其分成一个个小组,每个小组进行排序,最后再合并结果,这中间使用的就是分而治之的思想。小组内排序,我们最常用的是快速排序算法,但是它的时间复杂度为nlog(n),而基数排序算法的时间复杂度为n,在数据量大的时候,其时间差异会更加明显。基数排序虽然快,但它要求数据范围不能过大,我们就可以把一个64位的浮点数看成4个16位的整数,然后进行多关键字排序。为了进一步优化算法,我统计了每一个步骤的时间消耗,发现瓶颈在于二进制和十进制的相互转换。文件中的数据是以十进制存储,而计算机中的数据是以二进制存储。我设计了一种组合编码方式,即BCD编码+二进制编码+行程长度编码,并在编码和解码过程中使用了hash查找算法和移位操作,大大节约了整体时间消耗。老师为此,还奖励了我500块钱,希望我在未来的日子里能设计出更多更好的算法。
这个项目是研究生老师给我布置的,但我做这个项目的时候,还在读大四,用的也全部都是大学老师教给我们的东西。分而治之的思想和各种排序算法是《数据结构》课上的内容;BCD编码和移位操作是《计算机组成原理》课上的内容;行程长度编码是《图像处理》课上的内容;编程是《高级语言程序设计》课上的内容。各种科目的知识点会在某一时刻聚焦到一点,这一点可能激起了创新的火花,也可能解决了实际项目中的问题。
现在很多大学生吐槽课程学习没啥用,懒得花力气认真去学,工作后出现“书到用时方恨少”的局面时,甚至还意识不到大学那会儿他们错过了什么。有时,我会觉得社会的节奏太快,容易让人紧盯眼前的利益,容易让人问出“读书有没有用?学这门课有没有用?”的问题来,容易让人看不清自己的心。
对于弟弟的大学学习,我只给出了很少的几条建议。一是认真听课,把理论基础打好;二是坚持去OJ网站刷题,把算法和编程基础打好;三是多去图书馆看书,扩宽自己的知识面。“先博后渊,厚积薄发”,大学的积累对后续深造和工作都非常重要。