去年表弟剛參加完高考,在我的極力忽悠下,他把所有專業(yè)志愿都填上與計(jì)算機(jī)相關(guān)的專業(yè),最終被網(wǎng)絡(luò)工程專業(yè)所錄取。剛進(jìn)大學(xué)那會(huì)兒,他對(duì)我說,他覺得很迷茫,問我大學(xué)要怎么過。第一次有人問我這個(gè)問題,我也有點(diǎn)懵,就和他東拉西扯了一會(huì)兒,想到哪兒說哪兒。
他們學(xué)校的學(xué)習(xí)安排比我們當(dāng)年要緊湊得多,老師還讓他們牢記,“大學(xué)比高三更緊張”。而我們學(xué)校對(duì)我們差不多是放養(yǎng)政策,課時(shí)少,作業(yè)更少,每天都有大把大把的自由時(shí)間。大一上學(xué)期,我閑得發(fā)慌,不知道干什么,曾去街上發(fā)過傳單,去別人家里做過家教,去社團(tuán)寫過新聞稿,去學(xué)生會(huì)打過雜,去長白山旅過游,和閨蜜講過兩次相聲,還和班草談過一段小戀愛。真的是小戀愛,兩個(gè)月不到就分手了。雖然時(shí)間很短,但畢竟是我的初戀,要說不傷心是不可能的,感覺整顆心就好像浸泡在陳年老酒之中,又酸又澀。情場失意,考場得意。剛失戀的那半年,我用學(xué)習(xí)來麻痹自己,結(jié)果年級(jí)排名直接從50名左右一躍成為年級(jí)第一,體重也直接掉了15斤。后面,我就一直開啟學(xué)霸模式,直到保研結(jié)束。
表弟聽說我在大學(xué)玩ACM,覺得很高大上。我告訴他,ACM是用來打基礎(chǔ)和培養(yǎng)興趣的。他們學(xué)校有OJ網(wǎng)站,剛開始的時(shí)候,表弟興趣濃濃,天天刷題,還經(jīng)常和我探討。從他發(fā)的消息中,我能夠明顯感受到他ac掉一道題目時(shí)的那種激動(dòng)心情,我也經(jīng)歷過那些興奮的時(shí)刻。我對(duì)他說:“厲害??!第一個(gè)學(xué)期結(jié)束時(shí)姐姐連scanf都不會(huì)寫?!庇幸淮?,他碰到《求一元二次方程的根》的題目,提交了8次都沒過,就讓我?guī)退纯础N易x了一遍代碼,也沒有發(fā)現(xiàn)問題,就設(shè)計(jì)了一些測試用例,重點(diǎn)測試邊界情況,最后發(fā)現(xiàn)是“-0”和“0”輸出不一致的問題。我先簡單給他說了一下問題出在哪兒,以及怎么修改,然后提醒他要注意代碼規(guī)范,爭取以后能寫出優(yōu)雅的代碼,最后告訴他要學(xué)會(huì)自己調(diào)試程序、設(shè)計(jì)測試用例。
表弟玩ACM就是三分鐘熱度,玩了一個(gè)月就堅(jiān)持不下去了,興趣點(diǎn)轉(zhuǎn)移到了社團(tuán)樂隊(duì)上,聽說他還是樂隊(duì)主唱。他特別喜歡張國榮,幾乎會(huì)唱哥哥的每一首歌,他還把自己翻唱的歌發(fā)布在網(wǎng)上,并給我發(fā)了鏈接。我一個(gè)音盲,自然是聽不出他唱得好壞。但媽媽曾告訴過我,弟弟唱歌唱得很好,音全在調(diào)上,而且很有韻味。當(dāng)?shù)艿軉栁页迷趺礃拥臅r(shí)候,我立馬說:“唱得特別好聽!羨慕嫉妒恨??!”
弟弟說微積分和線性代數(shù)好難學(xué),泰勒公式好難掌握,矩陣什么的已經(jīng)聽不懂了,問我這些東西是只有考試會(huì)考,還是以后也會(huì)用得上。我條件反射地回答數(shù)學(xué)很重要,以后也會(huì)用得上。但真要我回答哪里用上了,我一時(shí)半會(huì)也答不上來。當(dāng)初學(xué)數(shù)學(xué)的時(shí)候,我就是單純地覺得數(shù)學(xué)很有趣,并沒想過以后有沒有用。

我翻了翻自己的大學(xué)成績單,發(fā)現(xiàn)自己數(shù)學(xué)科目的平均分竟有97.57。這份大學(xué)成績單勾起了我的很多回憶,僅《組合數(shù)學(xué)導(dǎo)論》就勾起了我的兩段回憶。一段是在最后一堂課上做了一次《組合數(shù)學(xué)之趣味題》的報(bào)告,其中有一節(jié)是講錯(cuò)排問題的。這節(jié)快講完的時(shí)候,我拋出了一個(gè)問題:“當(dāng)n大于8時(shí),全錯(cuò)排的概率接近于一個(gè)常數(shù)36.79%。這是我用程序跑出來的數(shù)據(jù),但我不知道為什么是一個(gè)常數(shù)。有興趣的同學(xué)可以試著自己證明。”結(jié)果還沒等到下課,一個(gè)不認(rèn)識(shí)的男生就給我遞了一張紙條,上面寫滿了證明過程。我看得云里霧里,下課又和那個(gè)男生討論了一下才弄明白,原來那個(gè)常數(shù)36.79%是1/e(e是自然常數(shù),約為2.71828)。因?yàn)檫@件事,我倆成了好朋友。他比我低一級(jí),是數(shù)學(xué)系的,兩年后得了遼寧省數(shù)學(xué)專業(yè)奧賽第一名,學(xué)校大門的宣傳欄里還放過他和他老師的照片。認(rèn)識(shí)他之前,我覺得自己數(shù)學(xué)很厲害,認(rèn)識(shí)他之后,我覺得自己數(shù)學(xué)很一般。另一段是中科院筆試時(shí),有一道Ramsey定理的證明題,即世界上任意6個(gè)人中,總有3個(gè)人相互認(rèn)識(shí),或互相皆不認(rèn)識(shí)。《組合數(shù)學(xué)導(dǎo)論》這門課讓我對(duì)組合數(shù)學(xué)產(chǎn)出了興趣,暑假的時(shí)候就花了三天時(shí)間看了60集北師大的組合數(shù)學(xué)視頻。因?yàn)橹豢催^一遍,所以對(duì)具體證明過程印象很模糊,但主要思想還是記得的,即將原問題轉(zhuǎn)化成線段的二染色問題,并利用了抽屜原理。當(dāng)時(shí)這道題只有我一個(gè)人證出來了,科院的老師和師兄都很驚喜,這也成為他們收下我的原因之一。
全錯(cuò)排問題:一個(gè)人寫了n封不同的信及相應(yīng)的n個(gè)不同的信封,他把這n封信都裝錯(cuò)了信封,問都裝錯(cuò)信封的裝法有多少種?都裝錯(cuò)信封的概率是多大?
提示:F(1)=0; F(2)=1; F(n)=(n-1)*(F(n-2)+F(n-1));
答案:裝法有F(n)種,概率為F(n) / n!
其實(shí),工作中直接用到數(shù)學(xué)知識(shí)的時(shí)候比較少。直接用處少,并不代表數(shù)學(xué)不重要。數(shù)學(xué)是一門基礎(chǔ)學(xué)科,對(duì)一個(gè)人的理性思維會(huì)產(chǎn)生潛移默化的影響。數(shù)學(xué)和計(jì)算機(jī)更是密不可割,起初大部分玩計(jì)算機(jī)的人都是從數(shù)學(xué)系轉(zhuǎn)過去的,計(jì)算機(jī)領(lǐng)域的很多算法也離不開數(shù)學(xué)。除了數(shù)學(xué),大學(xué)還會(huì)開設(shè)很多專業(yè)課,有些課在短時(shí)間內(nèi)你并不能看出其價(jià)值,但幾年后你很可能會(huì)在某個(gè)項(xiàng)目中用到大學(xué)學(xué)過的某個(gè)知識(shí)點(diǎn)。

以我研究生的第一個(gè)項(xiàng)目為例,內(nèi)容是海量浮點(diǎn)數(shù)的快速排序。排序算法誰不會(huì)寫,C++庫函數(shù)中就有sort函數(shù)。如果數(shù)據(jù)量很大,內(nèi)存裝不下,就可以將其分成一個(gè)個(gè)小組,每個(gè)小組進(jìn)行排序,最后再合并結(jié)果,這中間使用的就是分而治之的思想。小組內(nèi)排序,我們最常用的是快速排序算法,但是它的時(shí)間復(fù)雜度為nlog(n),而基數(shù)排序算法的時(shí)間復(fù)雜度為n,在數(shù)據(jù)量大的時(shí)候,其時(shí)間差異會(huì)更加明顯?;鶖?shù)排序雖然快,但它要求數(shù)據(jù)范圍不能過大,我們就可以把一個(gè)64位的浮點(diǎn)數(shù)看成4個(gè)16位的整數(shù),然后進(jìn)行多關(guān)鍵字排序。為了進(jìn)一步優(yōu)化算法,我統(tǒng)計(jì)了每一個(gè)步驟的時(shí)間消耗,發(fā)現(xiàn)瓶頸在于二進(jìn)制和十進(jìn)制的相互轉(zhuǎn)換。文件中的數(shù)據(jù)是以十進(jìn)制存儲(chǔ),而計(jì)算機(jī)中的數(shù)據(jù)是以二進(jìn)制存儲(chǔ)。我設(shè)計(jì)了一種組合編碼方式,即BCD編碼+二進(jìn)制編碼+行程長度編碼,并在編碼和解碼過程中使用了hash查找算法和移位操作,大大節(jié)約了整體時(shí)間消耗。老師為此,還獎(jiǎng)勵(lì)了我500塊錢,希望我在未來的日子里能設(shè)計(jì)出更多更好的算法。
這個(gè)項(xiàng)目是研究生老師給我布置的,但我做這個(gè)項(xiàng)目的時(shí)候,還在讀大四,用的也全部都是大學(xué)老師教給我們的東西。分而治之的思想和各種排序算法是《數(shù)據(jù)結(jié)構(gòu)》課上的內(nèi)容;BCD編碼和移位操作是《計(jì)算機(jī)組成原理》課上的內(nèi)容;行程長度編碼是《圖像處理》課上的內(nèi)容;編程是《高級(jí)語言程序設(shè)計(jì)》課上的內(nèi)容。各種科目的知識(shí)點(diǎn)會(huì)在某一時(shí)刻聚焦到一點(diǎn),這一點(diǎn)可能激起了創(chuàng)新的火花,也可能解決了實(shí)際項(xiàng)目中的問題。
現(xiàn)在很多大學(xué)生吐槽課程學(xué)習(xí)沒啥用,懶得花力氣認(rèn)真去學(xué),工作后出現(xiàn)“書到用時(shí)方恨少”的局面時(shí),甚至還意識(shí)不到大學(xué)那會(huì)兒他們錯(cuò)過了什么。有時(shí),我會(huì)覺得社會(huì)的節(jié)奏太快,容易讓人緊盯眼前的利益,容易讓人問出“讀書有沒有用?學(xué)這門課有沒有用?”的問題來,容易讓人看不清自己的心。
對(duì)于弟弟的大學(xué)學(xué)習(xí),我只給出了很少的幾條建議。一是認(rèn)真聽課,把理論基礎(chǔ)打好;二是堅(jiān)持去OJ網(wǎng)站刷題,把算法和編程基礎(chǔ)打好;三是多去圖書館看書,擴(kuò)寬自己的知識(shí)面。“先博后淵,厚積薄發(fā)”,大學(xué)的積累對(duì)后續(xù)深造和工作都非常重要。