分阶段的练习计划
读懂一个[[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 算法。对文本处理和生物信息学不可或缺。
- 网络流——把问题建模为带容量的图中的流动(最大流/最小割)。出人意料地,许多匹配与分配问题都能归约为流问题。
- 计算几何——处理点、线、多边形的算法:凸包、线段相交、最近点对。它是图形学、地图与机器人的主场。
- 随机化与近似算法——用受控的随机性换取速度或简洁(随机化快速排序、哈希、蒙特卡洛方法),并为那些难以精确求解的问题,接受可证明接近最优的答案。别害怕那些名字陌生的主题;每一个不过是又一级台阶。
唯一要紧的:持之以恒
如果你只从整条阶梯里记住一件事,那就记住这个:稳定而适度的练习,胜过偶尔的英雄式爆发。大多数日子里专注的半小时,一年下来会比每月一次的疯狂通宵带你走得更远。大脑是在两次练习之间的间隙里慢慢巩固这些技能的——所以那些间隙是工作的一部分,不是被浪费的时间。
要预料到平台期,也要预料到那种卡住的感觉——两者都正常,也都会过去。这个领域的进步很少是一条平滑的线;它是一段楼梯,长长的平段之后,会在某个东西豁然开朗时突然抬升一级。当你撞上一段平段,别就此断定自己到了极限。继续出现就好。下一级台阶,通常比感觉上要近。