每个人的学习方法各不相同,有这么一小撮人,他们不习惯直接吸收书本或者教程中的正确结论,喜欢“钻牛角尖”,总是试图找各种方法先验证这些结论是否正确,然后再说服自己接受它们。
举个简单的例子,对于 "1+1=2" 这个等式,很多人在第一次接触它时都是死记硬背的,但有一些人会纠结“1+1 为什么等于 2”这个问题,甚至可能想尽各种方法去验证它。
我个人认为,这种学习方法“弊大于利”。最大的好处就是每个知识点都会学的非常透彻,不容易遗忘;但弊端有很多,学习新知识的过程会非常痛苦,学习进度也会非常慢,尤其对于初学者而言,钻牛角尖式的学习方式很容易半途而废。
我一直负责数据结构的答疑工作,有一个学员问了一个问题:为什么 KMP 算法中的主串指针不用回退,万一指针前面存在一个子串与模式串相同,不就漏掉了吗?当时我的回答是:“不好意思,这个问题没有系统思考过,KMP 算法已经非常成熟了,不会存在这样的 BUG 的,放心使用哈”。
不得不说,答疑数据结构是一个有挑战性的工作。事后我仔细研究了这个问题,也试图从各种教程中寻找答案,但它们都只是提到了“主串指针不需要回退”,没有给出具体原因。经过一段时间的思考,我逐渐意识到自己被学员带偏了,“主串指针不回退”是 KMP 算法的一大“特色”,记住就可以了,为什么要钻牛角尖呢?
当然,有一些读者确实是存在这个疑问的,如果直接让你们记住正确结论,肯定不会服气。接下来,我就将自己对这个问题的验证过程解释给大家,如果你不喜欢“钻牛角尖”