“编程解题的一般思维方法或过程,可以概述为‘观察-联想-变换’, 通过对问题的观察,认识;然后通过联想,寻找问题同已有知识和经验之间的联系;最后通过变换,转为另一个或几个易于解决的新问题,最终达到解决问题的目的”
----- 在程序查找bug 或实现一个需求的时候,经常都是这样的;这个过程中每个步骤都很重要;
观察,可以针对某个bug,或问题,首先需要log,或断点观察更多的信息,得到“充分的已知条件”
不同的人对一个问题的着手点可能时不一样的,这个不一样,就体现在“联想已有知识和经验之间的联系”。针对于此,程序工作人员,平时就应该多看代码,宏观理解某个项目的实现机制,来龙去脉。另外,注意积累专业知识。这样,对于出现的新的问题,联想到的更多的相关性,以及更准确的相关性。对于后续的着手点会很有帮助。这个步骤,也可以注意“局部性原理” 以及 控制变量, 对比的方法
最后,变换解决问题的工程,往往需要查找一些现有的技术方案,针对项目实际情况,做取舍。“君子性非异也,善假于物也” 借鉴一些极度相关的解决方案,会让你的方法更加有效。
一 观察
“在‘观察’上,我们提供了整体与部分的思想,包括
1)整体实现的关键是准确地应用必要条件,
2)整体思考的一个重要角度时‘守恒’,寻找变换中的不变量,
3)提高整体实现效率的途径时‘充分利用有效信息’和‘压缩冗余信息’
4) 改善整体的性能状态的基础是处理好细节问题。”
-----充分利用有效信息,可以避免冗余的计算,提高效率。而有效信息的获取,可以通过中间变量的log,存储。 比如很经典的我们在字母匹配算法中,使用子序列来匹配,可以更快的达到效果。 处理好细节,也是很重要,比如我们在update 时候,控制好time间隔,可以对效率有不少的提升。
二 联想
“在联想上,我们提出了逆向思维和猜想与试验,分析‘执果索因’ ‘由反及正’的逆向思维;探讨了四种联想方式:相似联想,归纳联想,数形结合,和回到起点重新联想。指出猜想是在深入分析问题的基础上,不懈探索,反复修正的过程。”
----面对多元化的世界,我们总会有“答案意识过强”的状态,即:对答案进行快速猜想,迅速沿那条道兴高采烈的出发,却没有在意先前猜想的正确性和全面性。著名数学家华罗庚说过:善于退,退到原始而不失重要性的地方,是学好数学的一个诀窍。 需要回到初步的分析,展开丰富的联想和严谨的理性思考。这些在处理bug的时候显得异常重要,对于新手,对问题的方向把控通常并不是很准确。容易陷入到一个地方而解决不了。很容易损伤自己的自信心。压力也会越来越大。这个时候很需要果断的“回到起点”
三 变换
“在变换上,我们提出了 构造性思维,目标转化思想,分类与分治思想。构造性思维包括建立模型的机理分析法和统计分析法;建模过程注重应用序关系; 选择模型时必须权衡 时间复杂度,空间复杂度,编程复杂度和思维复杂度。目标转化思想包括降维,升维”
-----这里,降维,升维,是用的比较多的思想了。前面构造性思维,一般问题,大致的方向方法也都有前人做过可以借鉴,常用的数学模型,以及数据结构需要知道他们的优劣,这样构造的时候才会取舍得当。降维,即时在处理问题的时候,先做简化处理。“天下难事,必作于易”,尤其是处理一些bug,需要删除一些变量,单独看一个变量的影响。比如处理碰撞问题,就用两个三角形来做检测判断。通过简化一些干扰相,更容易发现问题的原因。 类似表达有 “一般到特殊,抽象到具体,复杂数据结构降为简单数据结果”。 而升维,则是一种让步简化的思想,遇到难以解决的问题,可以通过条件放松,给以适当的假设,将问题求解的范围扩大。最后剔除扩大部分,还原问题的解。
书目:
《程序设计中常用的计算思维方式》 吴文虎,王建德
“”