关于解题思维的杂感三则(思维、类比、启发法)
By 刘未鹏(pongba)
C++的罗浮宫(http://blog.youkuaiyun.com/pongba)
TopLanguage(http://groups.google.com/group/pongba)
TopLanguage上关于解题的讨论已经进行了一段时候了,有很多收获。我们的讨论目的不是将题目解出来,而是在于反思解题过程中的一般性的,跨问题的思维法则。简单的将题目解出来(或者解不出来看答案,然后“恍然大悟”),只能得到最少的东西,解出来固然能够强化导致解出来的那个思维过程和方法,但缺少反思的话便不能抽取出一般性的东西供更多的问题所用。而解不出来,看答案然后“哦”的一声更是等同于没有收获,因为“理解”和“运用”相差何止十万八千里。每个人都有过这样的经历:一道题目苦思冥想不得要领,经某个人一指点其中的关键一步,顿时恍然大悟。——这是理解。但这个理解是因为别人已经将新的知识(那个关键的一步)放到你脑子里了,故而你才能理解。而要运用的话,则需要自己去想出那关键的一步。因此,去揣测和总结别人的思维是如何触及那关键的一步,而你自己的思维又为什么触及不到它,是很有意义的。我们很多时候会发现,一道题目,解不出来,最终在提示下面解出来之后,发现其中并没有用到任何自己不知道的知识,那么不仅就要问,既然那个知识是在脑子里的,为什么我们当时愣是提取不出来呢?而为什么别人又能够提取出来呢?我怎么才能像别人那样也提取出相应的知识呢?实际上这涉及到关于记忆的最深刻的原理。(我个人对此有一点总结和猜测,但并不成熟。有兴趣自己考察的建议参考以下几本书:《追寻记忆的痕迹》,《找寻逝去的自我》,《Synaptic Self》,《Psychology of Problem Solving》)一般性的思维法则除了对于辅助联想(起关键的知识)之外,另一个作用就是辅助演绎/归纳(助探),一开始学解题的时候,我们基本上是先读懂题目条件,做可能的一些显然的演绎。如果还没推到答案的话,基本就只能愣在那里等着那个关键的步骤从脑子里冒出来了。而所谓的启发式思维方法,就是在这个时候可以运用一些一般性的,所有题目都适用的探索手法,进一步去探索问题中蕴含的知识,从而增大成功解题的可能性。启发式的思维方法有很多,从一般到特殊,最具一般性的,在波利亚的《How to Solve It》中已经基本全部都介绍了。一些更为特殊性的(譬如下文最后一个例子中关于分割搜索空间的法则),则需要自己在练习中总结,抽象,整理。
以下是两篇发在讨论组上的杂记(不是总有时间写像《跟波利亚学解题》这样的长文的:P)。
[一] 两道经典算法题的几种思维方法分析
题目各有各的不同,但背后的思维方式大抵都是一样的。如何在每一道题目中总结出最多一般性的思维法则,就决定了练习的效率。
下面是非常经典,且广为流传的两道题目,知道答案的也许会认为再分析这样的题目没有任何价值,但是题目的价值不在于新旧,而在于