这是一个充满争议的话题。
一部分程序员认为,算法没啥用,就是用来装B的。
也有一部分程序员,认为算法非常重要,不会各种基础算法的程序员就是垃圾。
那么,到底谁对谁错?作为程序员的我们应该把算法摆在什么的位置?
或者实际一点,我们准备 应聘 或者 面试别人,是否需要重视算法这一块儿?
我试着理性地来分析一下。
首先,“算法是计算机科学领域最重要的基石之一”,这一点毋庸置疑。
而算法的基础来源于数学理论。
领悟透彻的人,会说,算法是一种思想;
死记硬背的人,说算法是一种理论;
熟练掌握的人,说算法是一种技巧。
是的,算法可以有不同的理解。但是算法不只是存在于论文和教科书中,它可以被有意无意的运用来解决问题。
例如生活中的很多现实问题,比如商场打折问题(是打折划算还是满减划算),百钱买百鸡、猴子分桃、鸡兔同笼等有趣的问题。
而对于编程来说,是无时无刻都在使用算法,每个if-else,每个计算和赋值,都是算法。
算法的本质是解决问题,只要是能解决问题的代码就是算法。
只不过,对于简单算法,一般不需要学习,也不会拿出来考察别人,所以我们经常所说的算法,是指具备一定难度的、比较高级的算法,具体来说,就是那些经常见诸于大学教科书中的经典算法,比如快速排序、二分查找。
优胜劣汰,是自然界的规律,熟练掌握各种算法,是程序员的一大优势,这一点也毋庸置疑。但是,反过来,优秀的程序员,就一定熟练掌握各种算法吗??那也未必,因为现在的IT行业分得很细,只要在某一个领域做到世界一流,就足够优秀。
总结一下就是:
算法的思维很重要,经典的算法值得程序员去学习,这可以提高你的程序设计能力。
算法不需要死记硬背,它的价值,一方面在于它的思维值得学习,另一方面在于能解决实际问题,这就需要知道、理解和懂得运用,甚至融汇贯通,创造新的算法。
对于高级的程序员,通常来说,应该熟悉基础的、经典的算法(“熟悉”的意思是,曾经学懂过、练习过或者使用过,并不要求能徒手写出来 或者完整描述其流程)。
对于初级程序员,通常来说,关注的是怎么利用各种工具、技术实现功能,快速的完成产品的开发,核心的算法并不需要去了解,但是遇到算法问题时需要人指导,算法能力强当然更好。
掌握很多的算法,对程序员来说,是很大的加分项,算法能力强,通常编程能力也强,因为程序就是由 算法和数据结构 构成的。
图1-懂算法的程序员
图2-不懂算法的程序员
第二部分:经典算法(推荐程序员掌握的)
1、算法基础——基本的数据结构
包括链表、数组、队列、栈、树、哈希表、图。
2、经典的算法思维
有迭代法、穷举搜索法、分支界限法(剪枝法)、递推法、递归法、回溯法、分治法、贪婪法和动态规划法等。
3、经典算法:快速排序(建议掌握)
4、经典算法:二分查找算法(建议掌握)
5、堆排序算法(熟悉)
6、归并排序(熟悉)
7、BFPRT(线性查找算法)(熟悉)
三、写在最后
就我本人而言,大学的时候学过各种算法(专业数学+计算机),比较喜欢根据兴趣自学。
我觉得有点意思的课程包括:
基础理论型:高等代数、数学分析、高等几何,微分方程,(还有实变函数、复变函数等,几乎没学懂 忽略……)
理论偏应用型1:离散数学、概率论与数理统计、微分方程数值解法、数值计算(受导师影响,对这个很感兴趣)、数学模型
理论偏应用型2:信息论、算法与数据结构、计算机图形学、最优化理论、编译原理
各种课程的数学实验(用过Mathematica、Maple、Matlab、Lingo等,特别是MATLAB,堪称神器!)
我觉得这些都比较重要,是真正的精华。但是,大学课程只能学一点基础,有兴趣必须要自己去图书馆多借几本书看看,有英文版的教材会更好。
但是话说回来,理论层面需适可而止,专业和实践才是关键,程序员毕竟不是科研型人才,而是工程型人才。我们在考察一个工程型人才的时候,更应该看他的实践经验和成果。