62

自从 2006 年从一所规模很小的学校毕业后,课程的形式很糟糕且过时(我是外国人,当时不知道更好的学校),我开始意识到我错过了很多基本概念数学和软件视角,主要是其他更高概念的基础。

即我试图听/看麻省理工学院关于算法介绍的开放课件,但很快意识到我错过了几个数学概念以更好地理解这门课程。

那么一个优秀的软件工程师应该知道哪些核心数学概念呢?您会向我推荐哪些可能的书籍/网站?

4

27 回答 27

62

程序员的数学。很好的阅读。

于 2008-09-09T15:55:21.377 回答
19

布尔代数是理解控制结构和重构的基础。例如,我见过许多由不了解(或无法使用)德摩根定律的程序员引起的错误。再举一个例子,有多少程序员立即意识到

if (condition-1) {
    if (condition-2) {
        action-1
    } else {
        action-2
} else {
    action-2
}

可以改写为

if (condition-1 and condition-2) {
    action-1
} else {
    action-2
}

离散数学和组合学对于理解各种算法和数据结构的性能非常有帮助。

正如 Baltimark 所提到的,数学归纳法在推理循环和递归方面非常有用。

集合论是关系数据库和 SQL 的基础。

通过类比,让我指出木匠在建造屋顶和楼梯等东西时经常使用各种经验法则技术。但是,几何知识可以让您解决没有“固定”经验法则的问题。这就像通过语音学习阅读与基本词汇的视觉识别相比。90+%的时间没有太大区别。但是,当您遇到不熟悉的情况时,拥有自己制定解决方案的工具非常好。

最后,数学要求的严谨性/精度对于编程来说是非常有用的准备,无论具体技术如何。同样,我在职业生涯中看到的许多编程(甚至规范)错误的根本原因都是草率的思考。

于 2008-09-09T16:57:00.820 回答
12

我会选择兰登所说的领域:

离散数学、线性代数、组合学、概率与统计、图论

并添加数学逻辑。

这将使您掌握 CS 的大多数领域。如果你想进入特殊领域,你必须深入一些领域,尤其是:

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
于 2008-09-09T17:13:28.177 回答
10

按重要性排序:

  • 计数(循环所需)
  • 加法、减法、乘法、除法。
  • 代数(仅真正需要了解变量的使用)。
  • 布尔代数、布尔逻辑和二进制。
  • 指数和对数(即理解 O(n) 表示法)。

比这更高级的东西通常是特定于算法或特定于域的。根据您感兴趣的领域,以下内容也可能是相关的:

  • 线性代数和三角学(3D 可视化)
  • 离散数学和集合论(数据库设计、算法设计、编译器设计)。
  • 统计(嗯,用于统计和/或科学/经济应用。也可能对算法设计有用)。
  • 物理学(用于模拟)。

理解函数也很有用(不记得该领域的数学术语是什么),但如果你知道如何编程,你可能已经知道了。

我的观点是:一个十岁的孩子应该知道足够的数学知识才能理解编程。对事物的基本理解并不需要太多的数学知识。这都是关于逻辑的,真的。

于 2008-09-09T18:34:09.137 回答
9

“归纳证明”是程序员要知道的核心数学概念。

于 2008-09-09T15:42:11.017 回答
9

一般算法分析中的大 O 表示法,以及与标准集合相关的(排序、检索插入和删除)

于 2008-09-09T15:57:05.943 回答
8

对于离散数学,是来自 Arsdigita 大学的一组很棒的 20 场讲座。每个大约有一个小时二十分钟。

于 2008-09-09T17:12:10.957 回答
7

从我们 CS 人员所说的“离散数学”开始。微积分和线性代数也可以派上用场,因为它们可以让您踏入许多应用领域的大门。一旦你掌握了这三个,就去学习概率论。这 4 项将使您具备 95%(我编造的)应用领域的能力。

于 2008-09-09T15:37:22.620 回答
7

具体数学涵盖了大部分主要主题。一本关于离散数学的好书,如罗森的离散数学及其应用,将填补任何空白。

于 2008-09-09T19:52:41.430 回答
5

我认为这取决于你的注意力。几年前,我购买了 Donald Knuth 的《计算机编程艺术》。看了书后,我意识到几乎所有东西都是微积分证明。如果您有兴趣为它们开发自己的通用算法和证明,那么我建议您能够理解上述书籍,因为这是您在那个世界中要处理的内容。另一方面,如果您只想/需要使用各种排序/搜索/树/等...例程,那么至少大 O 表示法、布尔数学和一般代数就可以了。如果您正在处理 3D,那么几何和三角也是如此。

我更倾向于使用而不是做证明,虽然我想这些年来我做了一些聪明的事情,但我从来没有坐下来开发一个新的分类程序。我能给出的最好建议是了解你的领域需要什么,但要让自己接触更高的水平,这样你就知道它的存在以及还有多少要学,否则你不会有太多的成长。

于 2008-09-09T16:26:43.267 回答
4

我会说布尔逻辑。与、或、异或、非。我发现作为程序员,我们比其他数学概念更频繁地使用它。

于 2008-09-09T16:11:36.390 回答
3

基本代数和统计是很好的起点,也是许多其他领域的基础。

于 2008-09-09T15:40:50.817 回答
2

当我看到不理解它的开发人员时,这是一个让我感到困惑的简单问题:
- 操作顺序

于 2008-09-09T17:13:47.880 回答
2

“计算机编程的艺术”的第 1 章旨在提供这一点。

于 2008-09-18T15:39:46.470 回答
1

推荐了一本书……书名类似于《具体数学》。在几个问题中被推荐。

于 2008-09-09T15:38:21.277 回答
1

回到学校,我的一位导师说,对于商业应用程序,所有你需要知道的加、减、乘和除。请求者将知道并告知您需要什么的所有其他公式。现在意识到这是为以报告和应用程序为重点的学校提供​​资金。直到今天,这对我来说都是正确的。我从来不需要知道更多。

于 2008-10-24T20:36:38.047 回答
1

查看《计算机科学基础》
这本书的作者:Al Aho 和 Jeff Ullman,整本书可在线获取。

这就是作者在他们的序言中对本书目标所说的话:

"计算机科学基础涵盖的科目通常分为
离散数学课程和数据结构中计算机科学的二年级序列
。我们的目的是选择数学
基础,着眼于计算机用户真正需要什么,而不是
数学家可能会选择什么。”

于 2009-12-17T12:08:16.497 回答
1

一个复习数学的网站: http ://www.khanacademy.org/

于 2010-04-29T13:34:02.293 回答
0

我的数学背景真的很差(受过地质学家培训),但我在高中上过一门离散数学课,作为程序员,我每天都在使用这些概念。这可能是我所有教育中最有价值的课程,因为它与我目前的职业有关。

于 2008-09-09T15:39:51.070 回答
0

离散数学
线性代数
组合
概率和统计
图论

于 2008-09-09T17:03:47.967 回答
0
  • 布尔代数
  • 集合论
  • 离散数学
于 2008-09-09T17:38:12.657 回答
0

嗯,这取决于你的目标是什么。正如有人所说,如果你要解决难题,线性代数、组合学、概率统计和图论很重要。函数的渐近增长(bit-Oh 表示法)非常重要。如果您需要分析一些更复杂的算法,您还需要掌握求和和级数(参见 Cormen 和其他算法介绍的附录)。

即使你喜欢“企业级 Java”或“服务器端 PHP”,当你的老板希望你获得服务器时,你会发现一些统计和算法复杂性(因此是组合、归纳、求和、系列等)很有用更快地工作,添加新硬件似乎无济于事。:-) 我经历过一次。

于 2008-10-18T15:58:25.050 回答
0
  • 布尔代数
  • 集合论
于 2008-10-24T15:29:16.170 回答
0

为什么每个人都将概率和统计列入金榜,却不提微积分?如果没有极限、导数、积分和级数的工作知识,就无法理解概率和统计是关于什么的。总而言之,微积分(连同线性代数)是所有数学的主力。

于 2008-10-24T15:58:05.377 回答
0

我认为算法和理论非常重要。能够提出快速、正确的解决方案是优秀程序员与其他程序员的区别所在。此外,能够证明您的算法(使用标准证明技术——归纳、矛盾等)同样重要。

于 2008-11-13T07:25:14.847 回答
0

是的,我想说对归纳的基本理解有助于你理解 n 在算法中代表什么。一些逻辑和离散结构也很有帮助。

于 2010-04-14T17:08:42.933 回答
0

如果您必须做任何类似于机器学习的事情,概率和统计将非常有用。

我在“计算你的技能”博客文章中介绍了基础知识,其中讨论了 Xbox Live 的 TrueSkill 排名和匹配算法的工作原理。

于 2010-04-14T17:14:14.817 回答