浅谈学习方法(待续)
最后更新时间:
文章总字数:
预计阅读时间:
本文是在看完 一个金牌选手的信竞攻略 后有感而发写的,更多的是对视频内容的总结。
我们不谈怎么搞OI,而是希望找到一套更本质、更通用的一套学习方法,但会以OI为例。
其他领域在具体实现上略有差异,但核心想法是一样的。
本文提到的方法主要适用于需要对外输出的工具性学习(精神性学习也可以,只是把其中与对外输出的有关的部分去掉就行)。
学习方法
知识有体系
有教科书或老师指导(累积学习法)
例:所有的课内学习(从小学到大学)
这种方法下,学习是自底向上的一个演示过程。我们需要做的是了解,理解,运用。
无教科书或老师指导(渗透学习法)
这种情况下,我们默认只有网络上的开源资源可供使用。
我们会遇到一些问题:
- 我如何知道有哪些知识?
- 我如何知道知识之间的依赖和捷径?
- 我如何知道知识的学习路径?
对于一个具体的知识点(以视频中的FFT为例):
- 先知道它叫什么:有个算法叫FFT
- 再知道它的地位:FFT在多项式计数里很重要
- 再知道它的用途:FFT可以快速计算多项式乘法
- 再知道它的核心原理:FFT的核心原理是求值-插值 法、基于单位根的奇偶分治、一点线性代数
- 最后知道它的具体原理:如此如此⋯⋯这般这般⋯⋯
因此,「有哪些知识」是最首要的知识。
例如OI,我们有OI Wiki,NOI大纲这些被总结好了的资料,这是非常理想的情况。
但假如一个领域没有任何的总结性资料,我认为只能通过自己的各种了解,包括但不限于看论文、向该领域的经验者请教等方法(真有这种领域肯定都是科技最前沿了吧)。
知道地位,我们就可以根据它的知识深度来规划学习路径。
知道用途,可以跳过它,继续渗透后面的知识。例如FFT,我们知道了它能快速计算多项式乘法,我们就可以把FFT当成一个黑盒,先去渗透后面的计数,规划好学习路径后再具体学习原理。
知道核心原理,就能知道要学什么前置知识,大概以什么框架去学,在看具体原理的时候也容易顿悟。
所以这个方法的核心就是:自顶向下,构建知识树,将其转化为累积学习法
当然也不一定是树,因为可能有环,不过这其实不太重要,一块学就行了。
知识没有体系(归纳学习法)
如何应对陌生的知识:
- 「化归」:尝试将其规约到我们熟悉的理论体系当中。
- 「粘附」:尝试联想它和熟悉知识的相关性,关联越多, 我们越能稳固地掌握它。
如果化归和粘附都失败,表明我们发现了一个孤立的新知识,即「初见」。这会给人带来很大困惑。
你需要判断:这个初见重要吗?它是孤例?还是背后有一套值得学习的体系?
如果决定了,它是重要的初见,你就应该放下疑惑和恐慌, 不管它长得多么奇怪,都应该记载它,学习它,现在看太不懂,无法解释也没所谓。等待下一个例子来与它印证即可。等到见的东西足够多以后,可能就会发展出一个新的体系。
更积极的进行粘附:对于无体系的知识,粘附就是我们能做到的最好组织形态。
即使没有理解障碍,也应该思考粘附的可能,它使我们的知识更加牢固,让我们能从多种视角看问题。
这其实是一个很重要的做法,例如高中数学,经常提倡一题多解,这应该也是一种粘附的过程,它能提供多角度思考的思考模式,我觉得这也是我欠缺的。
其他
知识学习的准则
关于知识的学习顺序,前面已经介绍了如何打通道路。然而,选手可能会转向另一种担忧:
- 如果我在一条路上走得太深,耗费时间太多,导致没有学习基础知识,该怎么办?
狂战士准则:如果你学的很爽,进度很顺,不管这个知识名义上多难多后期,接着学。学到学不懂为止。
越级学习能为你带来下一阶段的思维方式,且显著增加你的「复杂抗性」,是你能承受更复杂的思考。 一般情况下,稍微越级就会很快遇到障碍,如果没有障碍, 说明抽到宝了,赶紧学啊。
这一块我是典型反面教材。
OI时期我很喜欢数据结构,然后就使劲往深里学,什么LCT,ETT,Top Tree,猫树分治,底层分块……反正各种高科技都整,但其实都没有理解很深,只是能机械地敲个板子。而其他基础知识就学的特别烂,比如基础DP我都场切不了。
所以劝大家越级需谨慎,超出能力范围太多就该停了。
越级还容易手癖(
好记性不如烂笔头
为你学过的每个知识体系写一篇笔记。
- 用你自己的语言记载,方便复习
- 你可以不断迭代对知识的理解,剔除过于熟悉的,整合臃肿多余的,最终精炼出关键的几句话。如果没有文字作为载体,这很难完成。
这个更新迭代我很有体会,高中数学和物理搞得错题本,第一次错的时候写解析都会写的非常详细,但后面再看的时候就会发现有很多是冗余的,这时候就会把解析改的更精练一些。
关于摸鱼
如果进行的是高强度的集训式训练的话,摸鱼是必然的。
此时,多开策略仍然重要,保留一个易上手的未完成任务, 它帮你从摸鱼状态中快速恢复过来。
如果强度不是很大你还摸鱼说明就是不想学,这是态度上的问题。
训练策略
高效刷题
核心思路:以“质量“换效率
做法:放弃独立思考,找一堆优质题解,将目标改为:看懂题解,并独立写出代码。并用你自己的语言,写一份尽量详实的题解。
注意事项:
- 你应该显著提高题目的难度。同时,也要认清自己的实力。
- 借助题解,可以大大加速题目的筛选,更有效地利用开源资源。
- 依赖题解,常有懒于思考,一知半解的情况。需要某种手段保证自己完全理解了解法,并进行一定的挖掘归纳(这样能回收一点思维锻炼效果),就是写题解。
这个方法适用于学新知识点而不适用于锻炼思维,适合前期使用(这里的知识点不只指最基础的知识点,一些小trick也是算的)。
用这个方法也有一部分是因为只考虑开源资源,如果像是高中这种有各种习题册的可以不这样干。因为这样做的好处是可以自己进行题目筛选。
多分支开题
维护三个题目池:
- A: 来自较好的题源,有待筛选。
- B: 已经筛选出的好题,需要看题解。
- C: 已经看懂题解,并写完了自己的题解,需要写代码。
有意将任务并行,不一定要将题目一口气做完,可以做一阶段就放回池子里。在每个题目池维持一定的题量。
任何一环卡住,可以随时切到手头上另一个简单任务。
如果你一直保持线性流程,单线程开题,卡题的时候就无其他事可做了。
学习的三个阶段
- 前期:学习知识
- 中期:思维,优化赛场表现
- 后期:稳定性提升
前期的主要任务:尽量快、完成度尽量高地学习主干知识。
常见误区:
- 在主干知识有显著缺陷的情况下,投入大量时间学习冷门知识。(这就是我犯的错)
- 过早关注比赛表现,在生涯前期投入过多时间打简单比赛,拖慢学习进度。
中期的核心任务:
- 增强赛场输出能力
- 熟悉比赛,研究赛场策略
- 尽量收集不成体系的知识
后期的主要任务:练熟练度