算法重要的是思维,不是程序的实现
实现一种算法首先是一种思维的实现,而不是埋头就在那里编程去实现。做为一个优秀的PM,要善于从思维中把握算法的核心,而不是象工人一样,人家已经给你了思维,你就斧头,凿子就干开了。前几年热炒一个话题,就是如何程序编程自动化,就是因为大家觉得思维层次的算法已经搞清楚了以后,程序的实现只是一个工程量的问题,而不会存在计算机理解的二义性问题。而现在很多人似乎更乐意成为一个coder,一个算法在程序上的完美实现者,而不是一个架构师,算法思维大师,一种算法的创造者,组织者。这是一个值得深思的问题。
算法源于生活,是解决问题的策略和步骤的提炼。如,大家坐公交车,从A到B站没有直达的情况下,如何计算一个特定策略下的最优解,对于策略,你可以选择:1)总路径最短。2)总时间最短。(总路径短还不一定就是时间短,可能径直穿过闹市区,反而慢。3)给每输公交车统计舒适度,你可能想时间不在乎,我就要坐着舒服。4)你是一个游客,你想要多路过风景区。确定了哪一种策略解决问题,再你设计解决问题的步骤。如,按总路径最短,你必须计算每两点之间的距离和可达性。
任何纷繁复杂的算法程序,总有这样的共性:输入和输出。在设计程序时,就象疱丁解牛一样,先把这两根主骨理出来。里边的算法结构,要培养良好的流程图思考习惯。所以说程序算法是千变万化的,但算法的思维是相通的。所以各种算法思想是对各种程序实现流程的一种非常高度的概括。就象之前说的公交车算法,输入是A,B,策略模式。输出:策略下的最优解。如果更加专业一点,或者要跟别人交流,或者形成电子文档,建议还是按照正规点的流程图软件,visio和UML都是相对不错的选择。
思维最重要的是条理,那么体现这种条理的工具就是流程图,程序流程图是一种用规定的图形,指向线及文字说明来准确表示算法的图形,具有直观、形象的特点,能清楚地展现算法的逻辑结构.画程序框图的规则:使 用标准的框图符号;框图一般按从上到下,从左到右的方向画;除判断框外,大多数程序框图的符号只有一个进入点和一个退出点,而判断框是具有超过一个退出点 的唯一符号。 其实大部分的算法还是通过基本的算法组合流程图是体现你算法思想的语言,把你的思维物化。要非常习惯于画流程图。程序流程图是人们对解决问题的方法、思路或算法的一种描述。流程图的优点:(a)采用简单规范的符号,画法简单;(b)结构清晰,逻辑性强;(c)便于描述,容易理解。流程图采用的符号:(1)起始框{椭圆形} (2)终止框{椭圆形} (3)执行框{长方形框} (4)判别框{水平菱形}。除了上述这种比较通用的流程图,还有一些国际比较流行的流程图样,如:NS图和PAD图,当然采用具体什么样的流程图样没有固定的。关键是清晰表达你的思维。
实现的,如果你打算自己发明基础算法,那需要很深的数学功底,你可以去看看具体数学。如果你只是打算编写普通的算法,首先还是要把那些基础算法都融汇贯通,这里涉及到很多的计算机基础也算是核心课程,数据结构、算法基础、编译原理、操作系统、离散数学。数据结构和算法基础是我比较喜欢的课程,它们是一种高度思想的结晶,你可以一遍又一遍反复地看,反复去思考,去理解,去实现。这样你可以对基础算法的精髓了解得很深。
算法能力的提高周期比较长,即使你是一个自认为比较聪明的程序员,也不要指望在很短时间内达到一个很高的水平。当然数学能力也很重要,编写算法不懂数学,到一定程度后就上不去了,这个除了自己努力还要看天赋了。但总得来说,勤能被拙是良训,一分辛劳一分才。你只要花时间在基础算法和基础数学上有所付出和努力,算法还是会得到一定能力的提高。