學(xué)計算機(jī)的同學(xué)不可避免地都要學(xué)習(xí)算法,很多算法都有一定的門檻,難點在于其中大量的數(shù)學(xué)表達(dá)式以及冗長的邏輯推理鏈條。很常見的現(xiàn)象:所有文字和數(shù)學(xué)符號都認(rèn)識,但對整個算法就是一知半解;時間精力花了很多,理解上沒有絲毫的進(jìn)展,讓人相當(dāng)沮喪。這樣糟糕的體驗多幾次,人就很容易放棄。要突破自己的舒適區(qū),將之前不理解的算法啃下來不僅需要強(qiáng)大的毅力,還要有可操作的方法。就個人經(jīng)歷,整理下本人在算法學(xué)習(xí)過程中可行的方法,權(quán)當(dāng)拋磚引玉。
1. 多畫圖,將過程形象化。根據(jù)科學(xué)家的研究,相比于文字信息,圖像信息更容易讓人理解,同時,圖像也更容易讓人形成全局觀;
2. 目的論和需求論的引導(dǎo)。所謂目的論,了解某個步驟在干什么;需求論,知道為什么需要這個步驟。對廣大從應(yīng)試教育走過來的同學(xué),這兩點是我們一直忽視的。因為從小到大的學(xué)習(xí),目的都是不言自明的為了考試,表現(xiàn)在教課書中就是方法論占據(jù)主導(dǎo)地位,書中多是羅列大量的知識點,大量的計算方法,而從來不提學(xué)了這個有什么現(xiàn)實意義,解決什么實際的問題。我們也就容易養(yǎng)成被動的看書過程,傾向于死記硬背,考前都記得,考后忘光光的特點。當(dāng)然上述方式,應(yīng)付考試是十分有效的,但是當(dāng)我們的目標(biāo)是掌握知識來解決現(xiàn)實問題時,就要求我們對每種方法的問題背景,適用范圍,局限性等都有理解,不再是純粹的記憶了;甚至,有時候需要我們就實際情況對已存在的方法進(jìn)行優(yōu)化改進(jìn)。要具備上述的能力,在學(xué)習(xí)之初就需要能夠從目的論和需求論的角度來看待算法。這樣做的一個副產(chǎn)品在于:目的論和需求論有助于形成全局觀,保證我們不迷失在細(xì)節(jié)。
3. 局部放大,局部推導(dǎo)和驗證;前述算法的難點之一是邏輯推理鏈條長,而人腦的工作記憶是有限的,不可能將整個算法一下子放進(jìn)腦子。所以,對局部進(jìn)行放大,暫時關(guān)注于整體中的某個局部也是迫不得已的做法。此處需要注意的一點“整體”二字,也即在放大之始,需要明白當(dāng)前局部在整體中的位置,可求助于步驟2,做到見木見林,否則容易迷失在局部。
4. 過程對比,以自己理解的一個類似過程為基礎(chǔ)來理解當(dāng)前較難以理解的過程,也就是俗話說的“踏板”。踏板的由來可借助于步驟3.?
5. 多方印證。很多時候,我們都有這樣的體會:某個情境下,發(fā)現(xiàn)之前自認(rèn)為理解的東西,要么某個細(xì)節(jié)還不清楚,要么就是誤解了。杜絕這些問題的方法,1.可以將你理解的東西和別人講述一遍;2.將自己理解的算法實現(xiàn)一遍。
最后,所有方法要是不能轉(zhuǎn)化為自己的技能,都是空。而將方法轉(zhuǎn)化為技能,只能求助于大量的刻意練習(xí)。所以,還等什么,讓我們現(xiàn)在出發(fā),不斷地突破自己的舒適區(qū),給自己一些挑戰(zhàn)吧。