优秀开发人员应该知道的核心数学概念是什么?

时间:2008-09-09 15:33:58

标签: algorithm math language-agnostic

自2006年毕业于一所非常小的学校以来,他的形状非常差。过时的课程(我是外国人,当时并不知道任何更好的学校)我已经意识到我错过了很多基础概念来自数学和数学。软件视角主要是其他更高概念的基础。

即。我试图在Introduction to Algorithms上听MIT的开放课件,但很快意识到我错过了几个数学概念,以便更好地理解课程。

那么优秀的软件工程师应该知道的核心数学概念是什么?您推荐我的书籍/网站有哪些?

27 个答案:

答案 0 :(得分:62)

Math for Programmers。好读。

答案 1 :(得分:19)

布尔代数是理解控制结构和重构的基础。例如,我看到很多程序员不知道(或不能使用)deMorgan定律导致的错误。作为另一个例子,有多少程序员立即认识到

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%以上的时间差别不大。但是当你遇到一个不熟悉的情况时,很高兴有自己的工具来解决这个问题。

最后,无论具体技术如何,数学所需的严谨性/精确性都是非常有用的编程准备。再一次,我在职业生涯中看到的编程(甚至规范)中的许多错误都是对其根本原因的粗心思考。

答案 2 :(得分:12)

我会选择Landon所说的字段:

  

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

并添加数学逻辑。

这可以让你掌握CS的大部分领域。如果你想进入特殊领域,你必须深入研究某些领域:

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory

答案 3 :(得分:10)

按重要性排序:

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

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

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

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

我的观点是:一个十岁的孩子应该知道足够的数学能够理解编程。基本理解事物所需的数学并不多。这完全取决于逻辑。

答案 4 :(得分:9)

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

答案 5 :(得分:9)

Big O notation在一般算法分析中,与标准集合有关(排序,检索插入和删除)

答案 6 :(得分:8)

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

答案 7 :(得分:7)

从CS人称之为“离散数学”开始。微积分和线性代数也可以派上用场,因为它们可以帮助您进入许多应用领域。一旦你掌握了这三个,就去概率论了。这4个将使你获得95%(我做到了)应用领域的能力。

答案 8 :(得分:7)

Concrete Mathematics涵盖了大多数主要议题。关于离散数学的好书,如罗森的Discrete Mathematics and Its Applications,将填补任何空白。

答案 9 :(得分:5)

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

我倾向于更多地在使用方面而不是制作样张,虽然我想我多年来已经做了一些聪明的事情,但我从未坐下来开发了一个新的排序程序。我能给出的最好的建议就是了解你所在领域需要什么,但要让自己暴露在更高的水平,这样你才能知道它存在以及需要学习的东西,否则你将无法获得更多的成长。

答案 10 :(得分:4)

我会说布尔逻辑。 AND,OR,XOR,NOT。 我发现作为程序员,我们比其他数学概念更频繁地使用它。

答案 11 :(得分:3)

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

答案 12 :(得分:2)

当我看到不了解它的开发人员时,这是一个让我感到困惑的简单方法:
- 运营顺序

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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

答案 15 :(得分:1)

查看书籍Foundations of Computer Science
本书由Al Aho和Jeff Ullman撰写,整本书可在线获取。

这是作者在前言中对本书的目标所说的:

计算机科学基础涵盖经常被发现分裂的科目 离散数学课程与计算机二年级课程之间的关系 数据结构中的科学。我们一直打算选择数学 基础着眼于计算机用户真正需要的东西,而不是 数学家可能会选择什么。“

答案 16 :(得分:1)

刷新数学的网站: http://www.khanacademy.org/

答案 17 :(得分:1)

有一本书被推荐......标题就像混凝土数学。在几个问题中建议。

答案 18 :(得分:0)

  • 布尔代数
  • 设定理论
  • 离散数学

答案 19 :(得分:0)

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

即使你是“企业的Java”或“服务器端的PHP”,你会发现一些统计和算法的复杂性(因此组合,归纳,总结,系列等)在你的老板要你的时候很有用让服务器更快地工作,添加新硬件似乎没有帮助。 :-)我曾经历过那一次。

答案 20 :(得分:0)

  • 布尔代数
  • 设定理论

答案 21 :(得分:0)

为什么每个人都在黄金榜中包括概率和统计数据而没有提到微积分?如果没有极限,衍生物,积分和系列的工作知识,人们无法理解概率和统计是什么。总而言之,微积分(与线性代数一起)是所有数学的主力。

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

我的数学背景非常差(地质学家通过培训),但我在高中时参加了discrete math课程,我每天都将这些概念用作程序员。这可能是我在所有教育中最有价值的课程,因为它与我目前的专业有关。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

概率和统计非常有用,如果你不得不做任何类似于机器学习的事情。

我在“Computing Your Skill”博客文章中介绍了基础知识,其中讨论了Xbox Live的TrueSkill排名和配对算法的工作原理。