去年表弟剛參加完高考,在我的極力忽悠下,他把所有專業(yè)志愿都填上與計算機相關(guān)的專業(yè),最終被網(wǎng)絡(luò)工程專業(yè)所錄取。剛進大學(xué)那會兒,他對我說,他覺得很迷茫,問我大學(xué)要怎么過。第一次有人問我這個問題,我也有點懵,就和他東拉西扯了一會兒,想到哪兒說哪兒。
他們學(xué)校的學(xué)習(xí)安排比我們當(dāng)年要緊湊得多,老師還讓他們牢記,“大學(xué)比高三更緊張”。而我們學(xué)校對我們差不多是放養(yǎng)政策,課時少,作業(yè)更少,每天都有大把大把的自由時間。大一上學(xué)期,我閑得發(fā)慌,不知道干什么,曾去街上發(fā)過傳單,去別人家里做過家教,去社團寫過新聞稿,去學(xué)生會打過雜,去長白山旅過游,和閨蜜講過兩次相聲,還和班草談過一段小戀愛。真的是小戀愛,兩個月不到就分手了。雖然時間很短,但畢竟是我的初戀,要說不傷心是不可能的,感覺整顆心就好像浸泡在陳年老酒之中,又酸又澀。情場失意,考場得意。剛失戀的那半年,我用學(xué)習(xí)來麻痹自己,結(jié)果年級排名直接從50名左右一躍成為年級第一,體重也直接掉了15斤。后面,我就一直開啟學(xué)霸模式,直到保研結(jié)束。
表弟聽說我在大學(xué)玩ACM,覺得很高大上。我告訴他,ACM是用來打基礎(chǔ)和培養(yǎng)興趣的。他們學(xué)校有OJ網(wǎng)站,剛開始的時候,表弟興趣濃濃,天天刷題,還經(jīng)常和我探討。從他發(fā)的消息中,我能夠明顯感受到他ac掉一道題目時的那種激動心情,我也經(jīng)歷過那些興奮的時刻。我對他說:“厲害啊!第一個學(xué)期結(jié)束時姐姐連scanf都不會寫。”有一次,他碰到《求一元二次方程的根》的題目,提交了8次都沒過,就讓我?guī)退纯础N易x了一遍代碼,也沒有發(fā)現(xiàn)問題,就設(shè)計了一些測試用例,重點測試邊界情況,最后發(fā)現(xiàn)是“-0”和“0”輸出不一致的問題。我先簡單給他說了一下問題出在哪兒,以及怎么修改,然后提醒他要注意代碼規(guī)范,爭取以后能寫出優(yōu)雅的代碼,最后告訴他要學(xué)會自己調(diào)試程序、設(shè)計測試用例。
表弟玩ACM就是三分鐘熱度,玩了一個月就堅持不下去了,興趣點轉(zhuǎn)移到了社團樂隊上,聽說他還是樂隊主唱。他特別喜歡張國榮,幾乎會唱哥哥的每一首歌,他還把自己翻唱的歌發(fā)布在網(wǎng)上,并給我發(fā)了鏈接。我一個音盲,自然是聽不出他唱得好壞。但媽媽曾告訴過我,弟弟唱歌唱得很好,音全在調(diào)上,而且很有韻味。當(dāng)?shù)艿軉栁页迷趺礃拥臅r候,我立馬說:“唱得特別好聽!羨慕嫉妒恨啊!”
弟弟說微積分和線性代數(shù)好難學(xué),泰勒公式好難掌握,矩陣什么的已經(jīng)聽不懂了,問我這些東西是只有考試會考,還是以后也會用得上。我條件反射地回答數(shù)學(xué)很重要,以后也會用得上。但真要我回答哪里用上了,我一時半會也答不上來。當(dāng)初學(xué)數(shù)學(xué)的時候,我就是單純地覺得數(shù)學(xué)很有趣,并沒想過以后有沒有用。
我翻了翻自己的大學(xué)成績單,發(fā)現(xiàn)自己數(shù)學(xué)科目的平均分竟有97.57。這份大學(xué)成績單勾起了我的很多回憶,僅《組合數(shù)學(xué)導(dǎo)論》就勾起了我的兩段回憶。一段是在最后一堂課上做了一次《組合數(shù)學(xué)之趣味題》的報告,其中有一節(jié)是講錯排問題的。這節(jié)快講完的時候,我拋出了一個問題:“當(dāng)n大于8時,全錯排的概率接近于一個常數(shù)36.79%。這是我用程序跑出來的數(shù)據(jù),但我不知道為什么是一個常數(shù)。有興趣的同學(xué)可以試著自己證明。”結(jié)果還沒等到下課,一個不認識的男生就給我遞了一張紙條,上面寫滿了證明過程。我看得云里霧里,下課又和那個男生討論了一下才弄明白,原來那個常數(shù)36.79%是1/e(e是自然常數(shù),約為2.71828)。因為這件事,我倆成了好朋友。他比我低一級,是數(shù)學(xué)系的,兩年后得了遼寧省數(shù)學(xué)專業(yè)奧賽第一名,學(xué)校大門的宣傳欄里還放過他和他老師的照片。認識他之前,我覺得自己數(shù)學(xué)很厲害,認識他之后,我覺得自己數(shù)學(xué)很一般。另一段是中科院筆試時,有一道Ramsey定理的證明題,即世界上任意6個人中,總有3個人相互認識,或互相皆不認識。《組合數(shù)學(xué)導(dǎo)論》這門課讓我對組合數(shù)學(xué)產(chǎn)出了興趣,暑假的時候就花了三天時間看了60集北師大的組合數(shù)學(xué)視頻。因為只看過一遍,所以對具體證明過程印象很模糊,但主要思想還是記得的,即將原問題轉(zhuǎn)化成線段的二染色問題,并利用了抽屜原理。當(dāng)時這道題只有我一個人證出來了,科院的老師和師兄都很驚喜,這也成為他們收下我的原因之一。
全錯排問題:一個人寫了n封不同的信及相應(yīng)的n個不同的信封,他把這n封信都裝錯了信封,問都裝錯信封的裝法有多少種?都裝錯信封的概率是多大?
提示:F(1)=0; F(2)=1; F(n)=(n-1)*(F(n-2)+F(n-1));
答案:裝法有F(n)種,概率為F(n) / n!
其實,工作中直接用到數(shù)學(xué)知識的時候比較少。直接用處少,并不代表數(shù)學(xué)不重要。數(shù)學(xué)是一門基礎(chǔ)學(xué)科,對一個人的理性思維會產(chǎn)生潛移默化的影響。數(shù)學(xué)和計算機更是密不可割,起初大部分玩計算機的人都是從數(shù)學(xué)系轉(zhuǎn)過去的,計算機領(lǐng)域的很多算法也離不開數(shù)學(xué)。除了數(shù)學(xué),大學(xué)還會開設(shè)很多專業(yè)課,有些課在短時間內(nèi)你并不能看出其價值,但幾年后你很可能會在某個項目中用到大學(xué)學(xué)過的某個知識點。
以我研究生的第一個項目為例,內(nèi)容是海量浮點數(shù)的快速排序。排序算法誰不會寫,C++庫函數(shù)中就有sort函數(shù)。如果數(shù)據(jù)量很大,內(nèi)存裝不下,就可以將其分成一個個小組,每個小組進行排序,最后再合并結(jié)果,這中間使用的就是分而治之的思想。小組內(nèi)排序,我們最常用的是快速排序算法,但是它的時間復(fù)雜度為nlog(n),而基數(shù)排序算法的時間復(fù)雜度為n,在數(shù)據(jù)量大的時候,其時間差異會更加明顯。基數(shù)排序雖然快,但它要求數(shù)據(jù)范圍不能過大,我們就可以把一個64位的浮點數(shù)看成4個16位的整數(shù),然后進行多關(guān)鍵字排序。為了進一步優(yōu)化算法,我統(tǒng)計了每一個步驟的時間消耗,發(fā)現(xiàn)瓶頸在于二進制和十進制的相互轉(zhuǎn)換。文件中的數(shù)據(jù)是以十進制存儲,而計算機中的數(shù)據(jù)是以二進制存儲。我設(shè)計了一種組合編碼方式,即BCD編碼+二進制編碼+行程長度編碼,并在編碼和解碼過程中使用了hash查找算法和移位操作,大大節(jié)約了整體時間消耗。老師為此,還獎勵了我500塊錢,希望我在未來的日子里能設(shè)計出更多更好的算法。
這個項目是研究生老師給我布置的,但我做這個項目的時候,還在讀大四,用的也全部都是大學(xué)老師教給我們的東西。分而治之的思想和各種排序算法是《數(shù)據(jù)結(jié)構(gòu)》課上的內(nèi)容;BCD編碼和移位操作是《計算機組成原理》課上的內(nèi)容;行程長度編碼是《圖像處理》課上的內(nèi)容;編程是《高級語言程序設(shè)計》課上的內(nèi)容。各種科目的知識點會在某一時刻聚焦到一點,這一點可能激起了創(chuàng)新的火花,也可能解決了實際項目中的問題。
現(xiàn)在很多大學(xué)生吐槽課程學(xué)習(xí)沒啥用,懶得花力氣認真去學(xué),工作后出現(xiàn)“書到用時方恨少”的局面時,甚至還意識不到大學(xué)那會兒他們錯過了什么。有時,我會覺得社會的節(jié)奏太快,容易讓人緊盯眼前的利益,容易讓人問出“讀書有沒有用?學(xué)這門課有沒有用?”的問題來,容易讓人看不清自己的心。
對于弟弟的大學(xué)學(xué)習(xí),我只給出了很少的幾條建議。一是認真聽課,把理論基礎(chǔ)打好;二是堅持去OJ網(wǎng)站刷題,把算法和編程基礎(chǔ)打好;三是多去圖書館看書,擴寬自己的知識面。“先博后淵,厚積薄發(fā)”,大學(xué)的積累對后續(xù)深造和工作都非常重要。