Replying to f6XF

之前有一个对 Matrix 有所了解,却对他们的“科技实力”过度夸大,相信各种夸张的阴谋论的人,对我说:“你这样公开指出 Matrix 的各种太空骗局,疫情骗局,化学尾迹之类,我怕他们会特别「照顾」你……” 他的意思是,他们会暗害我。在疫情封控期间,还有另一些人有类似的说法,建议我别说话。我还真是有点怕有人暗害我,所以有些事情当时没有挑明。

但我现在不怕了。我已经不怕死,他们能奈我何?世界已经被 Matrix 操纵了至少一百年,人类已经沦落到今天的地步。疫情的三年,封控的两月,基本的人身自由和健康权益被以各种借口残酷地侵犯,世界层出不穷的各种怪事,各种大戏继续上演。继续在这样的世界上活下去,本来已经没有了意义,死又有什么可怕的呢?也许“死后”我才发现自己从一个教室样子的地方醒来,全班同学在对我鼓掌,老师对我说:“你真是好样的!祝贺你,以优异的成绩毕业了。这堂课的主题叫做「不要迷信权威」。” 也许,人生就是这样一堂课,一场梦,我们是来学东西的。

所以我感谢这些人的好意,但我觉得他们这样的想法是不明智的,对于大家和自己都不好。我们正在被一个秘密犯罪团伙侵害,却有人觉得我们作为受害者,不应该声张,不应该让其他人知道这件事。这样的畏惧心理,只会让这个团伙更加嚣张,肆无忌惮。这当然不是对待犯罪分子的正确态度。这就像一个女孩子在公交车上遇到流氓,却因为怕被“报复”,所以忍气吞声,不敢公开与之对抗,让大家都来唾骂这流氓,将他绳之以法。如果她当时果断使用防身术,这流氓最后被大家打残废了,事后流氓会报复她吗?不会的,因为流氓也知道自己是流氓,被揭穿,挨打是活该的。

Matrix 的成员当然知道自己是犯罪团伙,他们制造出这些大戏来残害民众,被人看穿,揭发也是活该的。所以实际上没有人会暗害我,也没有人会暗害那些声援我,转述这些信息的人。我只是一个普通的民众,我手里没有任何机密文件,我只是看到一些大家都能看到的事情,我说出来了而已。一旦我说出来,很多人就都知道了,这些事情每个人都看得见。暗害我又有什么用呢?他们不能暗害所有知道这信息的人。要是我们任何人遇到莫名其妙的危害,那其他人就更确信这个犯罪团伙的存在了,就会有更多的人站出来说话。我们的朋友,家人,老师,学生,所有认识我们的人,都不会放过他们。

这就像《皇帝的新装》里的那个小孩,他说:“可是皇帝什么衣服都没穿啊!” 结果大家都知道是怎么回事了。请问,有人会去暗害这个小孩吗?当然不会。

要明白的是,这些人是犯罪分子,他们是见不得光的,而且他们没有很厉害的武器。他们仍然必须假装这个世界是有法律的,所以他们甚至不能妨碍我的日常生活。否则他们就会被察觉,人们就会更加确认他们的存在。甚至微博都不能明显地删除我谈论 Matrix 的帖子,否则就等于承认了微博是 Matrix 的成员之一。“言论自由”是一个假象,但 Matrix 必须继续演出它。至少他们得演出其中的一部分,不能赤裸裸地暴露自己害怕人们知道某些事情,不然人们就会更加确信这些事情是真的。

我曾经还因为这些人的说法,开始胆怯,有段时间不敢用微信跟朋友聊这些事,聊这些事都用 telegram。但后来有个朋友跟我说,干嘛要用 telegram 啊,又不是只有你一个人知道这些事,其实完全没有必要担心的。虽然微信一直在监视信息,但他们不能让大家明显地察觉他们在监视信息,他们也不能根据这些信息进行任何不利于我的动作。他们甚至不能阻止这些信息到达指定的接收者,否则他们在监视信息的事实就会赤裸裸地暴露出来,他们想阻碍人们知道什么样的信息,就会被发现,进而既成事实。所以何必怕在微信说这些事呢,自己给自己添麻烦而已。而且微信上聊这些的人如果多起来,反而会让 Matrix 害怕。因为他们是见不得光的,所以偏要在微信说这些事,就是要让他们知道:“我们都知道!” 听了她的话,我才恍然大悟,我确实没必要担心的。

所以,那些人的“忠告”或者“建议”,让我“保护自己,不要说话”,我觉得其实是在对我变相进行恐吓,是在助长犯罪团伙的气焰。当有人再三给我这样的信息,后果就是被我删除,因为我已经分不清他们是朋友,学生,还是 Matrix 雇佣来封我的嘴的人。我不需要这样的“朋友”,我不需要他们的“建议”,我不认识这样的人。

我知道有很多人看到类似的信息,可能心里已经明白,却因为害怕被暗害,不敢告诉其他人,甚至不敢点赞。我也曾经是这样的人,但是我现在不再畏惧了。如果世界继续这样被 Matrix 操纵,人生本来就没有了意义。人生如戏,把想说的话都说出来,造福世界,又何乐而不为呢?我希望大家也都明白这个道理,我们其实很安全。让越多人知道这些事,我们越是安全。

《恶评算法导论》http://t.cn/A6Yn0jOZ

在之前一篇文章里,我提到学会 AVL tree 或者 b tree 的重要性。后来在基础班的讨论会,有同学问我他还听说过「红黑树」(red-black tree),问我红黑树和 AVL tree 有什么差别。我只告诉他红黑树是“随机的”,并不是精确地平衡的,所以查找效率没有 AVL tree 那么有保证。

其实我没写过红黑树。最早的时候我学的是 AVL tree,并实现过它。虽然我实现过 AVL tree,但当时觉得很麻烦,很容易弄错,所以其实害怕写它。因为对 AVL tree 的恐惧,又听说红黑树更简单,而且好像效率差不多,就以为红黑树是好东西。后来每次看书上讲的红黑树,都没看明白它是怎么回事,也没动手实现过红黑树。然而我仍然觉得红黑树比 AVL tree 好,因为人们都那么说。

我之前为什么害怕写 AVL tree 呢?本科学数据结构的时候,我用 C 语言写过 AVL tree,当时觉得很容易弄错,很麻烦。后来学会了高级一些的语言和正确的编程理念,才发现之前写 AVL tree 觉得很难,大部分是因为之前的编程教学的误导。当年的老师们总是一来就跟学生强调“函数调用的开销大”,要避免写不必要的函数。所以 AVL tree 保持平衡的代码都直接写在同一个 insert 函数里面,而没有“帮助函数”。因为没有把“左转”和“右转”的代码单独写成帮助函数,所以就很混乱,缺乏模块化,容易出错。就算最后折腾出来,也不好理解,也许还有隐藏的 bug。后来就忘了怎么写出来的。

一般人学这种数据结构,最后差不多都是这种结局。学过,写过,然后就忘了。

总之,早年对 AVL tree 的恐惧,加上对红黑树的各种宣传(却没有实际的理解),导致了我以为红黑树会更好。既然有同学提起红黑树,我就想起这个事,而且我意识到“红黑树更好”这个想法,也许是一种误传。所以我查了一下红黑树和 AVL tree 的差别,发现这篇 Stack Overflow 帖子。

排名最高的回答说,对于“insert intensive”的任务使用红黑树,他好像觉得 AVL tree 的旋转操作更多。下面几个其它人也这么认为,然而这些回答全都只有说法,而没有依据。

想想,AVL 和红黑树这种平衡树,要加入新 key 的时候,都需要先进行查找,就成了 O(log n) 时间。因为红黑树不是精确的平衡,它的高度一般比 AVL 要高,查找的路径长,所以谁的加入速度快,还真不一定。旋转操作其实不是那么费时间的,都是 O(1) 操作。而且我真的看不出来“红黑树旋转少”这个说法有什么依据。

这条回答还抬出一些“权威实践”作为依据。说 Java 和 C++ 的标准库代码,还有 Linux 内核的调度器里面,都用的红黑树。然而我觉得这些都不能作为依据。特别是 Linux 内核调度器这种东西,我不明白调度器为什么会需要用到查找结构。调度器本来不会有很多需要查找的数据,所以对于查找不应该有什么特别的要求,随便用一种数据结构应该都能满足要求,甚至可以根本不用这类数据结构。其实 Linux 内核调度器折腾了几万行代码,弄得很复杂,效果还不如 FreeBSD 3000 行代码的简单调度器。可以参考这个讲座。

在后面终于看到有人提了一句,说很多人用红黑树,是因为他们只学过红黑树,从没学过 AVL tree,因为《算法导论》(评论中提到的“CLRS”)里面没讲 AVL tree,只讲了红黑树。而且好的 AVL tree 代码实现比较难找到。

这篇回复引起了我的注意。《算法导论》就是那本“MIT 经典算法教材”,英文名为《Introduction to Algorithms》。四个作者的名字开头连起来是 CLRS,所以常被称为 CLRS。似乎每个计算机科学领域都会出现这么一本“经典教材”,忽然间垄断世界上几乎所有大学的教学。这些“经典教材”一般写得都不咋地,甚至之前从来没听说过那些作者。我一直纳闷为什么会出现这样的现象。

所以《算法导论》没讲 AVL tree,这个事情引起了我的注意。在我看来,AVL tree 就是查找二叉树(binary search tree, BST)的一个自然而简单扩展。有了 BST 之后,只需要加上“平衡”这个特性,它就成了 AVL tree。所以之前的数据结构课,讲了 BST 之后一般都是讲 AVL tree。然而看《算法导论》的目录,我发现它讲了 BST 之后,直接就是红黑树,完全没有 AVL tree 的章节。这很奇怪。

另外翻到后面讲 b tree 的章节(第 18 章),我发现它只讲了 b tree 的基本的加入节点和“节点分裂”操作,却只字没提到 b tree 和 AVL tree 一样,是需要进行“平衡”的,否则不能保证查找效率。书中举的加入节点的例子,正好是平衡的例子,没出现需要旋转的情况,所以读者看了还以为 b tree 加入节点操作就这么简单。然而其实保持平衡才是 b tree 最烧脑的操作。如果你没把握它的思路,会比 AVL tree 还烧脑。

所以《算法导论》直接没讲 AVL tree,而 b tree 章节中只字不提“平衡旋转操作”。这让我产生了对《算法导论》作者们的严重怀疑,他们到底知不知道什么是 b tree?没有平衡旋转操作的“b tree”并不是真的 b tree!作为这么多大学使用的教材,这种严重的“疏忽”是不可接受的。

所以我才意识到,为什么之前我提到自己实现了 b tree 之后,有些人例行地评论:”王垠实现了个 b tree,就以为了不起”。他们天真地以为 b tree 是《算法导论》讲过的,所以他们已经理解了 b tree 是什么,所以实现了 b tree 不算什么。然而他们真的知道 b tree 是什么吗?他们亲手实现过真正的 b tree 吗?

仔细看看《算法导论》的 b tree 代码吧,那能叫代码吗?那只是“伪码”,是不能运行的,而且它的样式非常的糟糕,混淆而难以理解。在我看来,这些代码一塌糊涂,难以入目。直接忽略平衡操作,伪码还看不明白,你说学生看这书,怎么可能写出真正的 b tree 代码来?

不知从什么时代开始,算法书上开始用“伪码”表示程序,而不是真实可以运行的代码。教授们告诉人们“伪码”的好处,说它可以避免学生被一种语言套住,更加简洁云云。然而我发现实际情况却是,伪码并不比实际的编程语言简洁。正好相反,这些“伪码语言”可以很糟糕,比如《算法导论》里的伪码。所以《算法导论》是用一种很糟糕的语言,写出了一些难以入目的不能运行的代码。

真正的数据结构和算法教学,必须使用真的可以运行的代码,而不是伪码。否则就只有纸上谈兵,自以为懂了。

这也许就是为什么之前在某公司需要用 b tree 的时候,我发现网络上找不到好的 b tree 代码可以用。就像之前的评论里说的,好的 AVL tree 的实现很难找,好的 b tree 实现当然更难找。《算法导论》的效果,尽然是让 AVL tree 和 b tree 的知识消失!

所以多年之后回头看《算法导论》,我对它的评价已经跌入谷底。为什么这种误人子弟的“经典教材”不断地出现?我感觉到有 Matrix 的隐秘操作在里面。也许这种教材的出现不是为了改善教学,而是为了实现 Matrix 的愚民计划。他们知道,如果人们的头脑里没有真的知识,就能被任意地操纵。

Reply to this note

Please Login to reply.

Discussion

No replies yet.