“你要分清楚算法和方法的区别。”算法?方法?当时的我想,这我当然能分清楚了,有什么难的。然而我现在不再像当时那样简单地想了。
两个月以来一直在恶补C,那个我认为过了时的玩意儿。过了时的东西,嗯,我现在仍这样想。学了几节语法结构后,我还觉得php语法不愧是C衍生来的,确实很像。依据经验,我的想法是:我迫切地需要知道更多的函数。掌握了各种函数,各种开发何在话下!然而令人失望的是,C的库函数是那样的少,几乎是没有一个真正实用的库函数嘛!为此我曾对Hans说:“C确实很适合搞算法竞赛。”言外之意是,什么都得你自己亲自动手去完成。
到这时,我有点认识到算法与方法的区别了。之前搞的Web开发复杂之处,讲究的是性能与便捷平衡的,实现简单的业务逻辑的书写。然而现在则是来编写程序执行人类计算起来费劲的实际问题了。初学简单算法时,我曾用1行php完成了字符串反向的问题(NOIP普及组第一题)。事实上这确实很简单,用C或Pascal也就十几二十行代码的事。我还曾用5行php解决了判断回文字符的问题。然而老师说了这样一番话:“库函数好是好,但是我们真正要做的,应该是去知道它本质到底是怎样实现的。”我似乎有些明白了。群里曾讨论过“发明轮子”的问题。没错,实际应用里重复发明轮子是愚蠢的,然而当我们要深入理解程序,学习基础时,这就明显变得尤为重要了——至少你要依葫芦画瓢地造个轮子出来。
算法(Algorithm)指解决问题方案的准确而完整的描述。这是百科中对算法的定义。通过路由,到控制器,从数据库中取得数据,为模版变量赋值,输出。这是一个应用MVC架构的Web应用处理请求的流程中的一部分。这是一段面向过程的程序,但是算法呢?我想其再此并没有过多地体现。输入一系列数字,得到去除重复值,降序排列的结果(《小明的随机数》),这算什么呢?这是真真正正的算法。算法和程序一定是有机地结合的,它们本身就是一个整体。Web开发中没有算法吗?显然不可能。在我最近的一个小项目(GitHub: Bokjan/fsdstats)中就有着大量的算法内容——这些代码对数据库中取得的数据作进一步加工。
刘汝佳的《算法竞赛入门经典》是一本非常好的书,我非常喜欢他的写作风格。书的前言是写得很有道理的。其中有这样一句话:“不要以为语言入门以后就能轻易地写出算法程序。”我觉得说得很对——至少拿我自己的感受来说,就是这样。一个算法题不仅能考验你对语言的熟练与否,更多的考验你的逻辑思维能力与将自己的想法和计算机程序语言结合起来的能力。这里说到的逻辑思维,可不只是“业务逻辑”,而同时包含了对事物的感知,建立适当的模型,与数学能力等。
我呆着看过一段时间的算法题源码,却常常一头雾水。现在我开始放下Web,而自己试着与C友好相处——成功地解决几个问题后,发现这些算法程序代码不再是那样难以理解了。这证明了我之前的理论是正确的——只有结合练习,在自己的实践下才能取得长足的进步。
我这样认为过:NOI的获奖者们,真要做起实际的应用来说,那可能还真的不如我们,这或许是事实吧。然而我现在想,只要能以在算法学习中的拼搏精神来在应用开发的学习中锻炼,积累经验,那么想要成功“转型”,绝非困难之事。
我知道实际应用的开发是真正能够立竿见影地显示价值的;然而在算法方面能够深入地去学习,它的价值绝非在表面上体现出来的那样简单。