分階段的練習計畫
讀懂一個[[dsa-algorithm|演算法]],和在壓力下隨手取用它,是兩回事。這道鴻溝只能靠練習來填——但練習是有章法的。漫無目的地刷題會把你耗盡;分階段、刻意的練習則會累積複利。下面是一個行之有效的順序。
- 一次只操練一個模式。挑一個模式——比如雙指標——連著解上五六道全都用到它的題。集中做這些題,能訓練你的眼睛認出該模式何時適用,而這正是能遷移的本領。
- 間隔重複。別一道題做完一次就永遠翻篇。過幾天回頭再做,再過幾週再做一次。間隔重複,正是讓模式從「我跟著看懂了」變成「我能自己寫出來」的途徑。
- 讀別人的解法——但要在你自己試過之後。當你真正嘗試過,再去研究別人一份乾淨的解答。你會吸收到一些寫法、更俐落的複雜度,以及你自己想不到的模式。然後憑記憶自己再解一遍。
- 記錄你做不出的題。給那些難住你的題列一個簡短清單,並寫下每道題需要的模式。回顧這份清單,就是一幅你自己弱點的地圖——遠比統計「解了多少題」有用。
A spaced-repetition practice loop (don't just solve once and move on):
day 0 day 3 week 2 month 2
solve -----> re-solve -----> re-solve -----> re-solve
(from (recall, (recall, (should be
scratch) not re-read) fast now) automatic)
| |
+----------- the gaps are where it consolidates ------+
Goal: move each pattern from "I followed that" to "I can produce that."可以成長進去的進階主題
一旦核心模式變得自然,更廣闊的世界就敞開了。這些你不必全學,眼下更不必——但記住它們的名字,能讓你在某個問題需要時認出正確的工具,並挑一個讓你興奮的方向。
- 字串演算法——高效的字串匹配,如 KMP 演算法,能在 O(n + m) 內(而非樸素的 O(n·m))在文本中找出一個模式串;還有後綴陣列與 Z 演算法。對文本處理和生物資訊學不可或缺。
- 網路流——把問題建模為帶容量的圖中的流動(最大流/最小割)。出人意料地,許多匹配與分配問題都能歸約為流問題。
- 計算幾何——處理點、線、多邊形的演算法:凸包、線段相交、最近點對。它是圖形學、地圖與機器人的主場。
- 隨機化與近似演算法——用受控的隨機性換取速度或簡潔(隨機化快速排序、雜湊、蒙地卡羅方法),並為那些難以精確求解的問題,接受可證明接近最優的答案。別害怕那些名字陌生的主題;每一個不過是又一級台階。
唯一要緊的:持之以恆
如果你只從整條階梯裡記住一件事,那就記住這個:穩定而適度的練習,勝過偶爾的英雄式爆發。大多數日子裡專注的半小時,一年下來會比每月一次的瘋狂通宵帶你走得更遠。大腦是在兩次練習之間的間隙裡慢慢鞏固這些技能的——所以那些間隙是工作的一部分,不是被浪費的時間。
要預料到高原期,也要預料到那種卡住的感覺——兩者都正常,也都會過去。這個領域的進步很少是一條平滑的線;它是一段樓梯,長長的平段之後,會在某個東西豁然開朗時突然抬升一級。當你撞上一段平段,別就此斷定自己到了極限。繼續出現就好。下一級台階,通常比感覺上要近。