Limboy

如何认识事物

在一个月明星稀的夜晚,你坐在阳台的躺椅上,手捧着银瓶梅,看得有滋有味。忽然天空闪过一道异光,一个外星生物蹦到了你面前,指了指你手上的那本书问道:这是什么?

你很想直接回答这是一本书,但这样对方可能对你发动超能力。那如何才能把「书」这个东西给讲明白呢?我们来试一下。

书是一种带有文字和图像的纸张的集合。它能够携带大量的信息,不过由于书本身也占用一定的体积,所以当它比较多时也会出现携带不方便等问题。人们通常可以在书店、图书馆或朋友之间获取到书,内容也包罗万象,包括小说、传记、科学著作等等。书通常由墨水、纸张、羊皮纸或者其他材料固定在书脊上组成。书的出现跟活字印刷术有很大关系,它使得大规模、高效率地产出书籍成为了可能,在书出现以前,中国古代会把字刻在竹简上,不过这样的「书」比较笨重,携带的信息也非常有限。在现代出现了电子书,它不占用物理空间,只要有相应的电子设备就能阅读,解决了实体书笨重不方便携带的问题,不过也有人说它少了那种读纸质书的乐趣。从本质上来说,书能满足人们的精神需求,也可以通过读书来交到志同道合的朋友。

经过这么一番简单解释之后,是不是把「书是什么」大概地捋清楚了。看起来有点复杂,了解了下面这个模型之后就会很清晰了。它分为内环和外十字两部分。

内环

先从左上角的「定义」开始说起,解释「什么」,比如灯泡:可以在夜间提供照明的设备。接下来开始阐述「特性」,简单来说就是优点和缺点,比如书的优点:有质感,有收藏价值,可以记笔记,缺点在于携带不是那么方便,也不环保。了解了特性之后,就自然会想知道由于这些特性,导致它比较适合哪些场景。最后自然想了解它到底是怎么实现的,通过这四点,我们对一件事物就有了基本的了解。

不过还不够,这些更多 Focus 在事物本身,我们也要跳出来看一下,于是就有了「外十字」。

外十字

外十字主要分为 3 部分。History 回答的是为什么。为什么会有书,书产生之前是怎样的形态,有点像产品需求。Related 说明有没有相关的,一个事物很少会独立存在,总会有什么跟它产生关联,这也方便我们对它产生更全面的认识。Abstract 是对这个事物本身进行抽象,看看能不能提取出本质,这样看书这个行为甚至可以和玩游戏关联起来,因为都能达到精神愉悦。

通过这两部分的结合,对事物的理解就会比较全面了。

我们再来做个简单的测试:什么是红黑树?

定义: 一种自平衡二叉查找树,需要符合 5 条基本要求(篇幅原因,这里就不列出来了)。

特性: 从根到叶子的最长可能路径不多于最短的可能路径的两倍长。同时由于本身就是二查找树,因此也继承了它固有的特性,比如查找、插入的时间复杂度都是 O(log n)。

场景: 由于相对比较平衡,因此效率较高,C++ STL 中的 map 就是通过它来实现的。

实现: 主要是插入和删除。插入时需要先将节点染成红色,再通过判断叔父节点的颜色来决定下一步是旋转还是将祖父节点染成红色(篇幅原因,就不列出来了)。

历史: 为什么会产生红黑树呢?因为二叉查找树有一个很大的问题:容易失衡,这就导致某些场景下效率会很低,因此需要有一个平衡性好一点的二叉查找树。

相关: 类似的平衡性不错的还有 AVL 树,比红黑树更平衡,不过实现起来也更复杂,插入、删除时的旋转操作也更多,对平衡性要求特别高的可以考虑 AVL 树。

抽象: 回归到二叉查找树的初衷 ,它是一个通用、高效的基础数据结构,可以演化出 set / map 等更高级的数据结构,也可以用来排序(中序遍历)。

其他的事物也可以通过这个模型来认识,这样就不会只浮于表面。不妨做一个练习,比如如何认识「如何认识事物」?