2.3 什么是算法
算法这个名称大家应该不陌生,如果你是一个信息相关专业的本科学生,至少在本科一年级或者二年级就接触过不少算法了。随便打开一个人力资源网站去搜索“算法工程师”,好的算法工程师的年薪能到三五十万甚至上百万。
算法是什么?算法可以被理解为“计算的方法和技巧”,在计算机中,算法大多数指的就是一段或者几段程序,告诉计算机用什么样的逻辑和步骤来处理数据和计算,然后得到处理的结果。
科班出身的信息相关专业的朋友看到这里就会觉得比较亲切了,经典的算法有很多,如“冒泡排序”算法,这几乎是所有学习高级语言和“数据结构”课程的入门必学;再如“八皇后问题”算法,这几乎也是在讲穷举计算时的经典保留算法案例(就是在国际象棋棋盘上放8个能够横、竖、斜无限制前进的皇后,让它们之间互相不能攻击,求有多少种解);以及MD5算法、ZIP2压缩算法等各种不胜枚举的算法。图2-6所示为八皇后问题的一组解,经过穷举是可以求出所有92组解的。
图2-6 八皇后问题的一组解
应该说算法是数据加工的灵魂。如果说数据和信息是原始的食材,数据分析的结论是菜肴,那么算法就是烹调过程;如果说数据是玉璞,数据中蕴含的知识是价值连城的美碧,那么算法就是玉石打磨和加工的机床和工艺流程。
算法在高级语言发展了很多年之后,更多地被封装成了独立的函数或者独立的类,开放接口供人调用,然而算法封装得再好也是不能不假思索地使用就能获益的东西,要知道,这些封装只是在一定程度上避免了重复发明轮子而已。
大家不要以为算法全都是算法工程师的事情,跟普通的程序员或者分析人员无关,算法说到底是对处理逻辑理解的问题。
《孙子兵法·作战篇》有云,“不尽知用兵之害者,则不能尽知用兵之利”,意思是说,不对用兵打仗的坏处与弊端进行充分了解同样不可能对用兵打仗的好处有足够的认识。算法的应用是一个辩证的过程,不仅在于不同算法间的比较和搭配使用有着辩证关系,在同一个算法中,不同的参数和阈值设置同样会带来大相径庭的结果,甚至影响数据解读的科学性。这一点请大家务必有所注意。