计算机科学所需要的数学其实相对其他学科来说不算太多, 主线在于“离散”二字. MIT的课程(mit/6.042/spring)Mathematics for Computer Science 其实给出了一个很好的大纲(电子书可以免费下载). 我根据自己的感受来谈一下这门课所涉及的一些内容, 然后逐步讨论一些其他的数学领域, 最后是学习方法和学习目标.
基本内容
数学归纳法. 很多计算机科学的证明技术都会用数学归纳法, 有一个笑话“计算机科学家只会用数学归纳法证明”. 不过数学归纳法在大部分计算机科学的证明也够用了.
数理逻辑. 对于这部分其实很有争议, 有人觉得值得学习, 但是有的实用主义者觉得太过于形式化了.
图论. 对于社交网络的数据挖掘来说, 掌握图论的基本知识是必备的. 另外, 很多图论算法都是非常精彩的, 你可以看到这些巧妙的算法可以高效地完成目标.
组合数学. 这本书里主要讨论的是计数问题, 这部分其实不太好掌握, 可以根据需要来选学. 另外递归式的计算也是很重要的.
离散概率. 这部分在算法和机器学习里都很有用, 比如说很多人搞不清散列的性能只是在期望时间意义下的常数时间, 而不是所有情况下都不会超过常数时间.
数学分析
提问里专门提到《数学分析》. 要说这门课有用, 确实很有用, 特别是在精确的算法分析里. 你能看到各种纷繁复杂的解析公式到处都是. 但是, 学习起来也蛮痛苦的, 最为人熟知的就是吉米多维奇的数学分析习题集. 事实上, 这部分还只是侧重于计算的, 有关理论证明的习题还有更难的《数学分析中的问题和定理》(Polya和Szego).
当然, 《数学分析》学好了还是很有帮助的. 就算法理论来说, 要是数学分析的功底深厚: 首先各种渐近记号随便解决(也就是各种极限问题而已, 可以做到手到擒来), 其实对于理解和证明很多问题很有帮助, 最后对于连续类的数学门类分析功底非常重要.
其他数学
很多数学学科都是作为必修科目开设, 显然它们的重要性不必多言. 线性代数作为基本工具, 到处都能用到, 不过也许我推荐的书过于理论(例如Linear Algebra Done Right). 概率、随机过程还有数理统计也非常有用, 特别是很多统计出身的人在机器学习领域做的非常不错, 这方面不是我所专长的领域, 就不多说了.
不过, 既然这么多数学都很有用, 我们应该怎么学呢?
用时再学
对于已经工作了或者不能投入很多时间集中学习数学的人来说:用的时候再补充就可以, 但是要有比较强的信息搜索能力, 知道这个问题需要用到什么数学知识, 而什么定理和重要技术可以解决你的问题.
华罗庚老先生说过一个要诀, “漫”! 他说:
治学之道应该是“宽、专、漫”. 所谓“宽、专、漫”, 就是基础要宽, 然后对专业要专, 并且还要使自己的专业知识漫到其他的领域.
这里的“漫”字诀就是一个很好的方式, 例如现在已经掌握了A知识, 但是相近的B知识不懂, 可以花一定时间“漫”到B上去, 但是又学到了新内容. 那么, 如果所有的知识都不懂怎么办? 分而治之, 一个难关一个难关啃, 逐步学懂掌握. 而在学习的过程, 先挑选一个最简单的内容, 攻下之后继续前进, 最后必将成功. 另外, 很多书后面会有相关的数学知识附录, 例如《算法导论》附录给出了一些书里会用到的数学知识. 参照这种教材学习也是非常不错的.
还有最关键的一点就是, 人不可能什么都掌握, 而数学现在的发展更是超乎我们的想象, 这时寻求相关专业人士的合作也是一种比较好的选择.
解决问题
对于工科领域的人来说, 学数学最关键的目的是要解决实际问题, 比如算法分析里求解"递推式"的主定理就是为了设计更好的分治算法. 所以我们学习数学一定要有的放矢. 最后, 附上华老的一些经典语录, 对于数学学习非常有帮助:
神奇妙算古名词,
师承前人沿用之,
神奇化易是坦道,
易化神奇不足提。
妙算还从拙中来,
愚公智叟两分开,
积久方显愚公智,
发白才知智叟呆。
埋头苦干是第一,
熟练生出百巧来,
勤能补拙是良训,
一分辛劳一分才。
1963年2月11日
备注
来源于V2EX关于计算机科学数学的一篇讨论,记录于2017年2月17日
因为时间太久无法找到来源