数学 编程中可能用到的数学知识。

stardiviner · 2012年11月25日 · 最后由 lips 回复于 2015年04月03日 · 27029 次阅读

在这里问一下,(条件:普通高中数学水平之后) 编程或者算法之类的会涉及到的数学知识。 比如 线性代数,概率论,矩阵之类的。 求大家贡献下。这里作为一个 wiki 式的总结。 (本人高中水平)

最好能推荐下这些方面最经典(或者适合初学者)的书。 (就像有人问学一门语言,去看哪几本最经典的书)

------------------------ UPDATE -------------- 那各位可以简单说一下一些数学他编程相互关联的一些地方。举个例子:网站对于帖子的排名,会涉及到哪些数学知识。反过来,矩阵被应用在图像,声音等地方。我是想要学习好编程,有的人说不需要很好的数学,有的说需要。不管怎么样,对数学和编程有个详细的了解总是好的。假如我想要自己弄一个排名算法,我还不知道应该从哪里着手。总不至于从高中之后的数学开始学,一步步这么学上去吧?这样不就像是要你从电脑基础知识开始学习:电脑硬件,汇编,C, 高级语言,图形,网络 .... 这里面涉及到的得有多少啊。所以选择性的跳着学习也是一种手段。

------------------------ wiki -------------- 离散,概率 & 统计,随机过程,排列组合,微积分,线性代数,矩阵,组合数学,机器学习

有一个在这方面比较专业的专业叫 "应用数学"

你没有提到最重要的一门课程:离散数学。

貌似,大多数情况下,你只要学过离散数学,有了那种感觉... 其他数学很少用到了。进阶就另说了,不过绝大多数应该用不到。

#1 楼 @zw963 如果你还没用到离散数学以外的数学知识,你编程能解决的问题就太有限了

如果说可能的话,那一切数学知识都可能用到...

匿名 #5 2012年11月25日

那得看你干吗了

@bhuztez 我自然明白一切数学都可能用到。但是那是可能。(确实我也说了"可能", 呵呵,我应该申明是很有可能.) 那些涉及到什么太高级的东西的我肯定不会用到。你们就当做我是新手,对新手而言,在 3,4 年内需要学习和用到的数学就行了。

数学主要是用来证明算法的,做 engineering 用处不是很大。如果说哪方面知识有用,那比较多。 概率,统计,排列组合,微分方程,线性代数,etc.

@pongyo 对啊,就是列举这些,以后我想要解决问题的时候,也好有个搜索的范围嘛

最好这些类别能排个先后什么的。俺一高中生也了解不了多少。

#9 楼 @stardiviner 还是像 5 楼说的那样,那得看你想用来干嘛了

编程不是目的,编程去解决问题才是目的,所以要知道你要解决什么问题才知道需要用什么知识。

你们肯定没弄明白我的意思。我知道你们说的。但是就像你告述一个小学一年级的,让他算出 10 个 5 的总和是多少。他 肯定用加法。而再几年学习后,他就会知道乘法,那个时候他再算这个题就会用乘法。这个故事的重点是,我现在就像那个一年级小学生,不知道有什么更好的方法。我所知道的就是所有我可以使用的资源。而我在这里问你们是想要了解有什么其他更加高级的数学 (高中以上). 这样当我思考一个排序帖子先后时就会想到什么数学是可能可以用到的。如果我什么都不知道,那么我就甚至不会想到去用它们。

高中数学能解决很多问题了。 大部分人每天用到的东西就是简单的四则运算。

推荐楼主一本书 http://book.douban.com/subject/3288908/ 集体智慧编程

@Rei Awesome, This is really a good suggestion. Thanks very much.

与 web 有点关系的应该有离散(最基础),数理统计,概率论,随机过程....线性代数或者以后 webgl 流行会用到。不过,这种东西不在大学打点基础的话,出来一般很难补上的了,很多都是一层依赖一层的。比如要学习随机过程,你最好要统计、离散、概率、复变函数的基础,反正我是暂时缩了。

这个我深有体会,我大学也是高数学不好,结果后来就拼命补。

我想问一下,楼主是不是没上过大学?

@fsword I do not know what do say, but see your upper post.

#19 楼 @stardiviner 英文不行,没看懂你的问话 不好意思,刚才没看回帖,不过看了以后更糊涂了,楼主不是说自己高中水平么?大学没学好也不至于成了高中水平吧,另外高数以外的数学课还有不少的,那些也都有用的

@fsword 上面我说的是假设我是高中水平。我大学主要就是学了高数。

#21 楼 @stardiviner

咳咳,至少楼主大学里还学了不少 E 文,比我强 ... 汗~

@zw963 其实我高三一年就达到这水品了。用一年时间把英语从初级练到过四级的水平。只是进了大学反而不想学习了。

数理逻辑最重要,先修正我们被中小学时代某些奇怪的课教授的神奇逻辑思维...

大概是看罗素写的数学原理 (Principia Mathematica) 看到自然数 "1" 和加法的定义的程度,就应该够了... 数学学多了就会整天和学软件工程的掐架, 不利财...

http://www.okcupid.com/tests/the-difficult-math-test 85 分飘过...

@luikore This suggestion is good. thanks.

Q 3: 你是否认为数学和/或物理是一种很重要的编程技能?为什么?

David Heinemeier Hansson:根本没用。至少对业务编程和 Web 应用来说没用。但是数学可能对一个人的写作有很重要的帮助。

http://coolshell.cn/articles/8275.html

数学要看你编程序解决什么问题,例如你要做一个台球游戏,那你懂基本的数据就行,但要知道力,角度,加速度关系,碰撞的物理学原理。你做一个垃圾邮件过滤,可能用到概率相关的数学,例如贝叶斯的概率理论。你做文档相似度分析,你可能要懂点线性代数。如果你要做曲线拟合,你可能要用到插值算法,这个是研究生课程里的内容。你要做图像识别,那又是是支持向量机的模型。

@jimrokliu 我知道,所以我才在这里问了,我问是为了了解,就像你们所有人的回答组合起来就是一个小的 wiki, 而一个不知道的人就会去 wiki 上查。而对于编程和数学还没这方面的可以查找的资料。至少我不知道。(所以我才在这里问嘛)

如果你真正的学过高数的话,不会不知道,数学都是成套的体系,一个概念建立在另外一个概念基础上。如果你大一没学好,大二时候根本就学不下去了。

为啥这里的有些人都不喜欢看清楚话捏。我上面不是说到了么?reference 17 楼。这属于什么?属于断章取义? 假设我真的没有学过高数,或者没学好高数,其实也和这个问题没太大关系。 我这么说可能得罪人,但我觉得我有我的道理,这我前面或多或少回了好几个,怎么着也该懂我的意思和情况 ( 俺上过大学,只是大三退学了。高数确实学的不咋好,但是补考还是 80 分过了。要说什么数学是怎样怎样的大道理,俺也懂,但是懂有个屁用啊,我现在需要去了解,来问了,那就再明显的大道理也是废话。) 了吧,难道是我语文太好,或者我自己主观上自动补全了很多非大众的观点或者知识啥的?以至于我说的你们都不明白?还是你们纯粹就是来说说什么大道理,但是又不给出实际帮助的?不过其实也无所谓,水贴很正常。我没有权利要求别人做什么或怎么做。

如果我是来回答这个帖子的,那我会这样做,说明:如果楼主大学学过数学,并且还可以的,就推荐下编程可能设计的一些常见的块,比如:离散,概率统计,随机,矩阵,微积分,线性代数,(这些大学里都学过). 或者再深一点或者再具体一点,给出比如像 27 楼那样的,对应不同的常见的领域上的方面。再假设我没学过大学数学的,就推荐让楼主学 习下大学数学,那是对其他数学来说是基础。而楼主既然问了,而且说了是了解,(像 wiki 那样,大家没看过 wiki 么?wiki 上就是讲一个大概,怎么可能是专业知识,就像查一个感冒,只要知道大概是什么样子的,有个了解就好了啊。而且上 面我也讲了一个很好的例子,小学生那个例子来说明为什么我要问这个问题) 那就像上面那个假设一样的做法。

唉,我激动了,大家见谅,如果我是二逼,请见谅,最近月经失调。

再猜测,还是说,你们都保守着,不想把知识传授给别人?(这个比较没有可能)

这个问题其实我是想在 Quora 上问的,但是我英语不是很好,应付 Quora 上回答的英语有些吃力,怕理解错了。这里是中文的,又觉得玩 Ruby 应该都是比较强的高手,才选了这里,其实问问题哪里不可以,只是觉得这里还不错。唉,多蛋疼的一个事儿啊.....

楼主有点激动,所以我想说两句, 我初中数学不错,大学的时候只学过微积分,而且没用心学,等于没学。 工作以后,一些同事对我说,数学对编程有用,但是没有说具体用在什么地方。 至于算法,我依靠对数据结构的掌握,大部分问题都能顺利解决。 但是,曾经一个生物数据分析的问题,一直让我很困惑, 我查了些资料,那个问题的确和数学有关。 我想,软件开发的某些特殊领域,的确和数学有关, 但是我接触的很少,我认识的程序员,他们接触的也很少。 说了这么多,我觉得我不能给出楼主满意的答案。 但是我曾经和楼主一样困惑,到底那些数学对编程有用? 虽然,我对自己的编程能力很自信,但这些自信和高等数学没有任何关系, 也许和代数有点关系,因为我擅长把复杂的代码,变得简单易懂。 我读过不少编程的书籍,基本上没有一本提到过数学。 我真的不知道,数学对编程有啥用? 我猜大部分程序员都不知道,数学到底对编程有啥用? 所以在这里你很难得到满意的答案。 也许他只对某些特殊问题有用, 而这些特殊问题实在是太不常见了。 如果你需要特别的算法,我建议你去问问数学系的朋友。 有个专业叫做应用数学,和计算机编程有关系,你可以去问问他们。

#35 楼 @ery 感觉数学在编程上的作用主要是理清思路,跟内功差不多。看起来没用,但对某语言了解程度相似的程序员数学知识知道得多的解决问题往往能更快更好。

#35 楼 @ery 当写算法的时候一定会用到数学的,至少算法的效能分析就是第一个门槛。算法的正确性证明是第二个门槛。所以不是写软件会不会用数学。而是写软件会用多复杂的算法,算法需要多复杂的数学。平时里大部分程序员解除到的工作是这样一个 IO,把现实世界的事物映射到计算机数据里,把食物的逻辑和规律映射到代码语句里,这里面能有非常多的数学吗?表面没有,因为数学不在表面,是人类抽象出来的。所以对于处理表面的东西大部分 coder 都能做了。 但绝逼有相当多的程序需要复杂的算法。系统级的程序是需要的,因为性能要快。大体说底层的都会或多或不少的涉及到,比如 ruby 解释器的实现云云。高级一些的工程也可能是会用到的,比如搜索引擎的算法等等。 所以讨论数学和计算机,还是去讨论算法吧,讨论纯技术性的东西,没有太大的意义。 结论就是,编一些涉及复杂算法的程序,(往往这些程序要想出来如何实现都比较困难),需要精深的数学。 平时做做 app 做做网站(看语气就知道我说的是哪种规模和强度的实践),不是特别需要,毕竟非计算机专业的人做计算机的太多了(因为计算机专业的人都得学离散,而别的不一定学,一定程度上可以区分会不会数学)

看了那么多人对数学的自我看法,这让我一个是外语专业的现在干了几年开发的人鸭梨很大啊。。。

#38 楼 @ywjno 化工专业辍学的我表示压力很大……

个人觉得线性代数,矩阵分析分析都是高度抽象的东西,不懂可以不管 真要用到的算法可以看看机器学习方面的,顺便说说组合数学比较有趣

现在这些回答才像样多了嘛。(表示激动是应该的,不激动那是麻木)

@ery Thanks, very good suggestion: 应用数学。对于数学的看法,我赞同@pepsin 的。

好,俺更新下问题,作为总结,再有新的回答就继续更新。

我倒不觉得“数学是内功”,只是有些特定的算法需要数学基础才能理解,比如图像处理方面需要很多线代的东西,智能算法数据挖掘很多需要概率统计知识,计算复杂度算法分析感觉大多是高中数学的知识了。 楼主的现状最好先看 数据结构 和 算法,然后如果有学习强迫症,推荐看《CONCRETE MATHEMATICS》http://book.douban.com/subject/1231910/ 这本书,应该足够程序员用了

我记得我们初中的一个老师说过,数学是为了锻炼大脑的逻辑能力。我觉得是有一定道理的。就像我说的那个小学生的故事,用加法虽然也能完成任务,但是没有其他的知识,就会缺少从另一个角度看问题的情况。说到内功我觉得比喻还是比较像的,正如我上面所说,锻炼大脑逻辑能力,而内功则是增强个人武功修为的一个内在因素。(跑题了). 这个就不讨论了。欢迎大家继续提供新的数学知识点。

@paranoyang 嗯,是得看看数据结构和算法,我已经开始看了。那本书不错。我喜欢。谢了。

对一般的开发来说,可能完全用不到任何数学知识,就像会计用不到奥数的知识一样。 对于特定领域的复杂问题,完全不是自己随便自学能搞定的,楼主还是先搞清楚自己的方向吧。我前东家的技术元老就是数学系的,程序里面的无线模拟信号处理和图像识别都是他自己做的,压根就没有别人能在这方面插手。

@undead__king 听别人说总是别人说的,能不能行,我要自己学了才知道。不能因为别人说很难就不去尝试。

周六在书城翻到一本《程序员的数学》,不知道是否值得楼主看下: http://www.douban.com/note/247042813/

@gingerhot 谢了,很不错。挺符合要求的。

用的最多的还是逻辑。

如果是社会逻辑,我好的不行,但是数学逻辑一般般,空间逻辑还不错。心理逻辑我也很强。总的来说我逻辑还不错....

我設計抽獎網站,抽獎機率需要數學。 設計一個拋物線排列的 UI,需要三角函式,是數學。 設計一個簡單的加密演算法,是數學。 你說#content 跟#sidebar 的 responsive web design 吧,要怎樣算彼此之間的距離會比較好?是數學。 黃金比例?依舊是數學。

同事在寫 WP8 的 app, 在繪製線段上要平順:數學。 一張圖要能轉,這牽扯到 Matrix 了吧?數學。 接收 Stylus 傳來的壓力數值轉換筆頭粗細,還要有 Smooth 的效果,這怎麼做?數學。

1+2+3+4+5+6+7+8+9+10 = (1+10) * 10 / 2

數學不好,寫前面;數學好,寫後面 我數學差,但聽老師教 Data Structure 的時候提過 BigO 請問哪個效率比較好?

一切都是數學:)

@hechian you're right, I think so too. That's why I want to learn.

看到社区里这么多能人啊

最近遇到一个问题 主要涉及的是数归的(数学归纳) 在算法设计中 迭代循环常见,而层次间关系也经常出现递归的问题。 所以这提一下

#14 楼 @Rei 这本书不错,不过买了很多年,都没怎么看,你看完了么?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号