学好算法(数据结构)是不是要从数学入手应该咋做
虽然我不知道楼主对『学好』的定义是什么,我就自己的经验来谈。大致分三个阶段:一 好奇与功能最开始学算法和数据结构的时候,只是单纯的觉得算法能解决问题,有的还很快,很牛逼。一口气实现n个不同的算法来算相同的问题,再用实验验证它们的运行时间和时间复杂度吻合,感觉很有趣。那时我觉得自己『学好』了的标准是:能实现各种方法解决典型的习题,并从实验上观察到相应的时间复杂度。这个阶段我认为并不需要什么数学背景。二 实用与局限进了高年级后,开始解决一些开发和研究上的问题。为了找到思路,偶尔需要去查阅算法书甚至数学书。这时我对『学好』的标准是:对算法数据结构有比较系统的认识。具体体现在 1. 面对问题,知道自己需要的是一个普通算法/数据结构(如字符串处理)还是数值算法(如优化问题、解微分方程)。 2. 明白如何在计算效率和实现成本上做平衡。平心而论,我见过的绝大多数产品/研究项目都不是在用效率最高的算法,而是简单易实现的算法。更甚的是,多数时候是调用现成的算法(如MATLAB)。这个阶段我对『学好』的标准是:对于常见的问题,很快能通过查手册找到合适的算法/数据结构甚至合适的库。对于比较特殊的问题,能够在常见算法的基础上进行改造。更重要的是,意识到算法的局限性。即是说在实际生活中,几乎所有问题都不会采用理论上最优的算法,而倾向于使用人力成本低的方法。这个阶段我认为需要掌握的数学主要取决于面向的问题。算法本身蕴含的数学知识超不过高数。例如在工业界最常见的机器学习算法就是逻辑回归了。简单易用,性能过得去。在学术界,更多时候倾向于使用MATLAB这样的库,因为在实际问题面前,算法多数时候只是一个必要部件,而非主要挑战。毕竟绝大多数算法问题都已经有可以凑和使用的方法了。三 学术研究读研究生后,开始针对特定问题设计算法。此时最大的挑战是找到具有原创性的算法问题。个人的体验是许多时候,都只不过是在现有算法的基础上,根据特定问题作出调整。原创性十分有限。这个阶段我对『学好』的标准是,泛泛的知道哪些领域有值得注意的算法问题。这时为了理解问题本身,可能就需要可观的数学背景。但并不一定(如DNA测序其实还是传统的字符串匹配,不过是有更高的并行计算要求)。我比较喜欢的例子是计算支持向量机SVM的SMO算法。SMO的作者利用了SVM的一些数学性质,加快了运算效率。总结:算法不是科学,主要目的是解决实际问题。所以不能用对待理论物理那样的态度来对待算法。当然,可以找到神来之笔的算法为例,背后有让人称绝的数学思想。但个人经验是,更多的流行算法背后是码农一把泪一把汗的实践经验。所以在下认为,楼主多挥洒些汗水定能精通算法的。数学问题会在实践中涌现的。
推荐阅读
- 达内和传智播客培训机构出来的人才们,你们当初学好第一份工作是学校推荐的还是自己找的
- 计算机专业大三,应该扎实学好基础专业课,还是该随大流去参加培训机构培训
- 为啥这个算法误差的看起来这么小
- 高考改革|学好数学还能靠刷题吗新课标来了
- 我想学java和安卓软件开发?
- 使用算法帮助人们筛选reader的信息是否存在可能
- 请问如果想成为算法工程师的话,大学选专业是选软件工程好还是计算机科学与技术好。
- 设计师应该咋快速理解程序,我很想学好程序,但没咋理解程序是咋实现的,大部分教程都是教写的过程
- 神经网络算法是否真的属于人工智能范畴
- 以算法为例,是否存在讲解者认为“懂得自然懂了,不懂的我说再多也白搭”的心理
