哪些編程工作需要高階數學知識?

所謂高階是指高於工科線性代數、微積分、概率論的數學知識。

其實這個提問有另一個目的:那些更高級的數學知識在信息領域的應用情況是怎樣的?


我能想到的有以下這些:

  1. 現代資訊理論(Information theory):自從香農提出經典資訊理論之後,這門學科獲得了長足發展,現在有信息代數(Information algebra)、信息幾何(Information Geometry)等分支。前者將「信息處理」抽象化為代數過程,而後者將微分幾何應用於信息概率論。
  2. 計算複雜度理論(Computational complexity theory)及其他理論計算機科學:最為人所熟知的P!=NP問題(P versus NP problem),在試圖解決它的道路上使用到的數學已經不止是「高階」能夠形容的了。與之類似的還有很多基礎計算機科學領域,比如計算拓撲學(Computational topology)中要解決的各種扭結問題,都需要紮實的高階數學基礎。
  3. 計算機視覺(Computer vision):很多計算機視覺的工作需要用到群論(Group theory)的知識,CMU還開過一門課(Group Theory applications in Computer Vision)
  4. 密碼學(Cryptography)密碼學本身就是演算法理論和數論交叉最緊密的學科。除了數論知識之外,密碼學還糅合了抽象代數(Abstract Algebra)和組合數學(Combinatorics)等數學分支。
  5. 計算機圖形學(Computer Graphics):上邊有人提到了,本身就是對真實世界的模擬,當然需要解PDE/做隨機分析/搭幾何模型了。


圖形學和機器學習的例子其他人舉過了,舉個編程語言的例子吧。。

編程語言的原型:untyped lambda calculus/simply typed lambda calculus/PCF/System F....

各種抽象機器:CEK/CEKS/G machine/Krivine machine....

程序分析技術:k-CFA/abstract interpretation....

涉及的數學知識主要就是抽象代數了,set theory,type theory,category theory(根據隔壁某老師的言論,範疇論其實不是很有必要,PL社區一部分人喜歡用而已。。),domain theory(研究denotational semantics之類的有用),還有mathematical logic。

一般人寫程序根本用不到這些知識。用更「高級」一些的語言的時候,需要對類型系統有一些直覺,能充分利用類型系統的表達能力寫well typed的程序,能拎清楚call by value/call by name/call by need之類概念的區別等等。如果了解抽象代數,無疑對提高程序抽象能力有幫助,但不了解也不那麼嚴重,比如我寫個monad就為了用do語句做錯誤處理比較爽,哪管範疇論里單子是什麼鬼函子的什麼鬼範疇。

再深入一點的話,就是設計/實現/分析語言,不掌握需要的數學知識的話真不行了。。而且你不一定要做新語言,或者寫編譯器才會用得到。比如前一段時間MSRA系統組來人給我們做「PL Big Data」的報告,他們微軟內部有一個大數據的平台,然後提交到那個平台的job有一定幾率會fail掉,造成很大浪費。。然後為了盡量避免,他們搞了一套靜態分析的輪子來分析C#程序,包括控制流分析什麼的技術都有用到。。不過在我看來如果強迫用函數式的DSL來寫那些job,把數據的schema做到類型系統里,就可以避免N多無腦錯誤了。。比如Table["column_name"]之類的。。


比如多媒體這個坑吧,基本上都是要用數學來挖的吧,比如圖形、圖像、視頻編解碼,計算機視覺,模式識別等等花樣找規律,花樣降維,花樣調參數的方向。就算你不做科研,看懂spec也需要這些基本的數學語言啊,除了題主心中這幾個「高階」的數學課之外,近世代數、數論、隨機過程、聚類、測度這不都是基礎中的基礎么


有機會能直接使用到的有:

1、最優化,來求解統計學習等問題;

2、傅里葉變換,數字信號處理,尤其是手機感測器信號的處理;

3、隨機控制系統,涉及到模型的建立以及相關濾波演算法的設計;

4、解析幾何,其實這個也不算「高階數學」;

5、計算數學;

無法在編程中直接用到,但在看一些書籍和文章時會涉及到的數學知識有:

1、資訊理論,最大熵等;

2、泛函分析中的部分理論,各種空間等;

3、大量統計分析的內容,例如各種分布、極大擬然估計等;

另外感覺應用層面的工程問題,如果說用到數學,都大量集中在分析、概率、以及線性代數的範疇內,而數學能力的高低,直接體現是建模,至於解法大都有現成演算法,對於一些簡單的應用,實現不是難事。


應該是離散數學,計算幾何,圖論這一類偏向於計算機科學的書吧?圖靈出過一套,看一看看(才不會告訴你我一本沒看)


期權定價


我覺得編程需要的數學知識是你要解決的業務問題決定的。

你要解決某個問題,建立一個數學模型,然後用代碼實現它。

而且很多時候你把結論直接拿來用就可以,不必要像數學家一樣去證明。


請打開Mathworks公司網站觀賞其產品

請打開Adobe公司網站觀賞其產品

請打開Ansys公司網站觀賞其產品


我們的項目之一是花樣解量子力學方程…………


稍微高階的工作都需要你說的低階數學知識,怎麼了?


演算法優化要很多數論的東西。

密碼學算編程么,那需要用多多的數論。


大量應用,之前做過網格模型上特徵線提取要用微分幾何,模型在給定力學條件下體積優化要用有限元法,又得解大型稀疏矩陣,現在做的感覺沒有什麼數學的了,可是想想也用了不少基本的矩陣計算…還有一種情況是,最後實現只需要一個簡單的公式,確實用不到多少數學,但是推導過程複雜到我都沒法看下去,這時候覺得能自由運用數學是一件多麼屌的事!很多時候真是想避開不用但是都避不開


編程這個事本身不用多少數學知識。初中數學也就夠了。當然一定要說,還有範疇論,來研究程序本身的。但關鍵對很多人來說編程是個工具。

關鍵是你要用這個工具去解決什麼問題。比如寫個密度泛函(理論上計算電子云密度的),你得懂量子力學。要懂量子力學你得懂微積分,線性代數,李群李代數,泛函…… 這就沒底了。但如果你只是做個前端,當然用不到這麼多數學啦。


我是程序員,我工作中用到過的數學知識有下面:

1.信號處理,這些主要用於各種感測器,包括手機,如手機加速度,用到fft速傅氏變換,波形去燥。高級的引伸有,模式識別,專家系統。其實很多編程都可以用信號處理的知識,如日誌處理,可以根據日誌來調整伺服器的運行狀態。

2.防止sql注入或構建自定義查詢語言。用到編譯原理知識,分詞演算法,有狀態機什麼的。

3.資料庫查詢。用到集合理論,查找演算法,樹。

4.加密技術。用到對稱加密,不對稱加密,數學簽章,ic卡加密,md5加密等等。

5.通信技術,用到分散式系統知識。

6.界面顯示。用到數據結構,樹,圖,凸包,幾何知識。

7.圖形系統。用到線性代數,各種變換,特徵分析。

8.hadoop系統。用到推薦數學,相似分析。


其實CS專業其本質在於演算法,編程只是一種工具來證明演算法的正確性。

而演算法不論是設計還是優化都需要數學。


蒙特卡洛法數值解PDE


圖形學啊。機器學習啊。不過其實用的都是你覺得高階的低階知識。另外大學數學課不掛科基本上能保證會用已有方法。


機器學習。


具體一點的話,機器視覺、神經網路、深度學習等等方向對數學的要求是極高的(大前提就是得學好概率並且十分紮實),當然這些方向也不是完全獨立,會交織在一起。


我最近參與的 的項目都是企業的內部項目 ,進銷存 。 只要會小學應用題就能做了 。


基本上涉及演算法的地方都會多多少少涉及到數學


很多啦,演算法工程師,模式識別經常和數學打交道滴


關於這個可以看下《數學之美》


工業界有數學? 別tm開玩笑了.能看懂結果一般術語代碼一樣寫,難道真需要知道前應後果是怎麼來的么. 知道各位大神見多識廣,就不要誤導人家一錢徒光明的碼農把技能樹點歪了. research scientist 入行待遇又不比碼農高,而職業發展難度又高的多. 順帶吐槽下,認為做機器學習演算法工程師需要大量數學的要不沒學過數學,要不數學太差.


推薦閱讀:

做軟體的需要上Computer Architecture這門課嗎?
設計優秀的 API 有什麼特徵?
近幾年有服務端有哪些新技術?

TAG:程序員 | 軟體開發 | 數學 | 編程 |