作为一个非科班出身的算法小菜鸟,想写下自己的思考,总结一下现有的学习心得,记录自己的成长。
我对于算法的理解和做数学题差不多。最根本的目的都是利用现有的条件,计算想要的结果或给出策略。但是因为计算能力的差别,所以计算机算法和人脑思考的策略不尽相同,比如辗转相除、异或计算,这些算法在人类计算看来麻烦而枯燥,但却恰恰适合机械计算的计算机实现。那么如何实现从计算机角度设计策略,便是算法的重点和难点。
算法本身在不断发展,我觉得是有以下三个步骤,来逐步替代人类脑力的功能。基础:计算步骤,进阶:策略步骤,最终:思考步骤。
算法代替计算步骤,就像把计算机当做一个更百搭的计算器。这步骤虽然是基础,但往往是入门时期令人望而却步的高门槛,这部分学习重点在于如何把人类计算思考的思路转化为计算机解决问题的方式。比如说我在学习统计R语言的初期,就往往随着自己数据分析的节奏去使用算法,线性回归、单因素方差分析等,方法依旧是统计的计算方式,计算机只作为简化计算,缩短时间的工具,而并没有专属的工作流程与方法。当时还觉得好像挺简单的,但是当我试着不使用已有的函数工具去完成计算,发现计算效率相较于现有工具会慢很多,而两者的差距就在于计算方式的差别。因而简要地查看了下前人为简化计算所做的努力,不去谈汇编语言这些更深层次不太理解的领域,就拿本科课程《数值计算》来说,这种利用讨论简化矩阵计算的方向涵盖了矩阵论、泛函分析等数学方法,而今也已经逐渐发展成熟成了一门精深的数学领域。而也是这一次尝试,让我意识到计算机编程背后的黑箱蕴藏了何等的空间。而一般来说,面试笔试考察的coding部分也就是这部分内容(手撕代码令人害怕),这些算法都要求在一定空间时间要求下得到最优解,常提到的方法一般有各种排序算法,回溯法(递归法),动态规划等。
算法代替策略步骤,也就是最近最火热的机器学习方向。机器学习代表着计算机本身具有根据数据适应性调整参数的能力,可以实现在设定好的算法结构上对参数进行调整。同时,算法的输出具有一定的模糊性,不再具有唯一性,会在一定范围内波动,而这种结果更像对现实中的观察。常见的算法有神经网络,支持向量机,随机森林等。这部分也是考察的重点,但是这个方向的重点因为比较复杂,难以短期实现,所以主要是设计算法的原理等。
算法代替思考步骤,也是最终的目标,只要设定已有环境和目标能自主实现和自主调整的地步。这个步骤暂时还无法实现,只是一个科幻般的设想,起码要通过图灵测试吧,之后可能世界很快就要被硅基生物所统治了(误)。