学计算机的同学不可避免地都要学习算法,很多算法都有一定的门槛,难点在于其中大量的数学表达式以及冗长的逻辑推理链条。很常见的现象:所有文字和数学符号都认识,但对整个算法就是一知半解;时间精力花了很多,理解上没有丝毫的进展,让人相当沮丧。这样糟糕的体验多几次,人就很容易放弃。要突破自己的舒适区,将之前不理解的算法啃下来不仅需要强大的毅力,还要有可操作的方法。就个人经历,整理下本人在算法学习过程中可行的方法,权当抛砖引玉。
1. 多画图,将过程形象化。根据科学家的研究,相比于文字信息,图像信息更容易让人理解,同时,图像也更容易让人形成全局观;
2. 目的论和需求论的引导。所谓目的论,了解某个步骤在干什么;需求论,知道为什么需要这个步骤。对广大从应试教育走过来的同学,这两点是我们一直忽视的。因为从小到大的学习,目的都是不言自明的为了考试,表现在教课书中就是方法论占据主导地位,书中多是罗列大量的知识点,大量的计算方法,而从来不提学了这个有什么现实意义,解决什么实际的问题。我们也就容易养成被动的看书过程,倾向于死记硬背,考前都记得,考后忘光光的特点。当然上述方式,应付考试是十分有效的,但是当我们的目标是掌握知识来解决现实问题时,就要求我们对每种方法的问题背景,适用范围,局限性等都有理解,不再是纯粹的记忆了;甚至,有时候需要我们就实际情况对已存在的方法进行优化改进。要具备上述的能力,在学习之初就需要能够从目的论和需求论的角度来看待算法。这样做的一个副产品在于:目的论和需求论有助于形成全局观,保证我们不迷失在细节。
3. 局部放大,局部推导和验证;前述算法的难点之一是逻辑推理链条长,而人脑的工作记忆是有限的,不可能将整个算法一下子放进脑子。所以,对局部进行放大,暂时关注于整体中的某个局部也是迫不得已的做法。此处需要注意的一点“整体”二字,也即在放大之始,需要明白当前局部在整体中的位置,可求助于步骤2,做到见木见林,否则容易迷失在局部。
4. 过程对比,以自己理解的一个类似过程为基础来理解当前较难以理解的过程,也就是俗话说的“踏板”。踏板的由来可借助于步骤3.
5. 多方印证。很多时候,我们都有这样的体会:某个情境下,发现之前自认为理解的东西,要么某个细节还不清楚,要么就是误解了。杜绝这些问题的方法,1.可以将你理解的东西和别人讲述一遍;2.将自己理解的算法实现一遍。
最后,所有方法要是不能转化为自己的技能,都是空。而将方法转化为技能,只能求助于大量的刻意练习。所以,还等什么,让我们现在出发,不断地突破自己的舒适区,给自己一些挑战吧。