聊聊整体性学习方法

Posted by 陈树义 on 2019-05-04

「整体性学习方法」是在一本叫做《如何高效学习》的书中看到的。这本书的作者是个老外,他用一年就学完了四年的麻省理工课程。而这本书正是其这一年来的学习心得,书中介绍了他的学习方法。

一开始看到这本书,我是很抗拒的,感觉就是一本鸡汤书。再加上这本书理论居多,很多时候都得自己去摸索,所以我刚开始读也不怎么在意。一直到最近一段时间,我才慢慢地体会到了他说的「整体性」学习方法是什么。

什么是整体性学习方法

在聊我的体会之前,我先简单介绍一下整体性学习方法。整体性学习方法有 5 个步骤,但是并非按部就班,只是按此顺序进行,不用拘泥于这种顺序。

  1. 获取 —— 通过感官获取信息。在这个阶段我们获取到的信息还只是信息,没有联系起来。例如我们知道了二叉搜索树这个概念、二叉平衡树这个概念等。
  2. 理解 —— 明白信息的表面意思。对应本例就是理解了红黑树的概念。
  3. 扩展 —— 与其他信息建立联系。扩展有三种方式:第一,深度扩展,扩展知识的背景。例如红黑树是怎么出现的,为什么要出现红黑树等。第二,横向扩展,探究知识的联系。例如AVL树和红黑树有什么联系和区别?第三,纵向扩展,与其他结构联系后,从其他结构的角度探究知识。纵向扩展指的是我们将树结构形成一个知识体系后,与其他知识体系再联系,例如与算法中的知识体系联系,看看树结构在哪些算法中得到应用。
  4. 纠错 —— 删除错误联系。在我们理解和扩展过程中,总会出现一些错误的理解。这时候我们需要将这些错误的理解剔出,有必要的话再次梳理知识结构。通过不断的理解、扩展、纠结,知识结构会趋向于稳定。
  5. 应用 —— 将知识应用到各种情景中去,包括现实生活。当我们形成知识体系,并对知识点有了相对深刻的理解之后,就需要去应用了。例如树结构这个知识点,我们可以在实际工作中去寻找合适的应用场景。例如:B树适合于海量数据的排序,而B+树则适合海量数据的范围查询。

一个简单的例子

为了让大家理解整体性学习方法的应用,我们这里用树结构的学习做一个例子。

我们知道树是一种最基本的数据结构,其中树又有:二叉树、二叉搜索树、AVL树、红黑树等等。如果我们不适用整体性学习方法,那么我们的学习步骤是这样的:

  • 什么是二叉树?二叉树的属性是什么?
  • 什么是二叉搜索树?二叉搜索树的属性是什么?
  • ……
  • ……

可以看到我们学习的时候,知识点之间是分散的,没有联系的。但如果我们有意识地去使用整体性学习方法,那么我们的学习路线是这样的:

  • 弄懂什么是二叉树、二叉搜索树、AVL树、红黑树等。
  • 理解并扩展这些概念,例如:二叉树与二叉搜索树的区别?二叉搜索树与AVL树的区别?
  • 纠正之前对于这些概念的错误理解
  • 思考这些树结构在实际工作中的应用

经过一段时间的整理,我会形成下面这样的思维导图。

上面的思维导图基本上把我们所有的树结构都涵括了。但单单是思维导图还不够,你还必须弄清楚它们的内在联系。在我的记忆中,上面列出的 5 个树结构都是有联系的。

  • 二叉树,这是最基本的树结构,是我记忆的起点。
  • 二叉搜索树,在二叉树的基础上对元素进行排序。
  • 二叉平衡树,二叉搜索树在极端情况下退化成链表,所以就要对子树高度做限制,那么二叉平衡树就诞生了。而二叉平衡树有两种,一种是 AVL 树,它是高度平衡的自平衡二叉树,每个子树的高度差不能超过1。而红黑树则是近似平衡的平衡二叉树,最长路径不会超过最短路径的两倍。
  • B树:是在二叉树的基础上进化而成的,其主要用于解决大数据量的数据搜索问题(IO问题)。例如我们的文件系统搜索文件,不可能把所有文件信息加载到内存,这时候就需要B树来实现这一操作。
  • B+树:B树只能解决单一记录的搜索问题,但如果我们要查询某个范围的数据呢?例如查询数据库年龄在20-30的用户,这时候B树就无能为力了。这时候B+树就能发挥其功能。B+树在B树的基础上在叶子节点增加了向后的引用,从而可以快速地查找某一范围的数据。

经过我这么一套说下来,你是不是觉得它们都是有联系的呢?通过这样的记忆,我们能记得更牢固。因为知识点之间都是有关联的,只有我们找到它们之间的关联,我们才能记得更牢固。

另外一个例子

上面关于树结构的总结是一个例子,其最重要的是找到知识点之间的联系,从而将他们从独立的知识组织成一个网络。这样我们不需要记住所有的知识点,而只需要记住单独一个入口,从这个入口我们可以推出其他所有知识点。

例如:在树结构这个例子中,我记住了二叉树。那么二叉树+排序,就变成了二叉搜索树。二叉搜索树+解决链表问题,就是二叉平衡树。为了提高修改效率,就有了 AVL 树和红黑树。

不同知识点的关联可能不太一样,这就需要自己去学习寻找联系了。例如我们经常用到的 Java 虚拟机知识点,你能形成一个知识网络么?还是只有零星的一点记忆?对于我来说,我对于 Java 虚拟机的记忆是这样的:

  • Java源文件到Class文件,对应编译器和字节码规则。
  • 从Class文件到内存,对应类加载机制和内存结构。
  • 从内存到运行阶段,对应垃圾回收、垃圾回收器、双亲委托加载机制。

简单地说,我使用 Java 文件的运行过程来记忆 JVM 的所有知识点。一个 Java 文件从源文件到字节码文件、再到内存、再到运行、再到类加载机制、再到垃圾回收,基本上涵括了 JVM 的所有知识点。

总结

整体性学习方法看着比较鸡汤,但你尝试过一次之后就觉得很不错,再也停不下来了。整体性学习方法不但让你记住知识点,还让你对比、分析他们之间的区别,让你在知识点之间建立联系,从而让你记得更加深刻。

整体性学习方法需要我们吸取大量的信息,并在这些信息中建立联系,并且应用起来。对于初学者来说,这样其实是很有难度的。但如果你已经入门了,使用这种方法去学习效率会高许多。