哪些開發會用到微積分、離散數學、線性代數、概率論的知識?
以我正在做的搜索和推薦系統為例:
- 微積分,推薦系統需要對點擊分布函數做大量的統計分析,分析長尾分布肯定要用到微積分。
- 離散數學,各種推薦內容的排列組合不就是離散數學的內容么。
- 線性代數,幾乎所有的聚類演算法都大量使用線性代數,比如在K-Means演算法就用到一大堆矩陣運算。
- 概率論,著名的分詞演算法HMM就是一個條件概率模型,搜索系統里有多少地方要用分詞就不用我多說了吧。
如果你用 functional programming (函數語言),你會意識到程式其實是一個數學結構。
函數語言,因為其抽象性,可以幫你看到表面背後的更高層次的結構。 封裝 (encapsulation) 就是這個意思。
如果不懂高等數學,可能看不到那些結構,或想不出好的意念 (idea)。
現代數學已經發展到融會貫通的地步,例如代數、幾何、樸拓、微積分等互相有很抽象、很深的關係。 例如最近我學到 微分形式 (differential form) 與樸拓 的關係,叫 上同調 (cohomology)。
多數問題的 input (輸入),都是某個數學空間的元素,例如向量空間。 符號 (symbolic) 的結構,則可以用抽象代數中的群論、單子 (monad) 等描述。 而這些數學結構在深層意義上都是相通的。
用程式解決問題就是玩那些數學結構。
如果你覺得數學就是「微積分」那些,可能是你見的書不夠多,要到國際水平的研究圖書館看看。 數學已經是一個很龐大的學科。
例如我昨天隨意看到一本關於張量分析的書,原來張量和 P=NP 的問題也有關 (因為矩陣的行列式計算是一個多項式,多項式有多少次乘法就是其複雜性,而張量是關於矩陣變換的法則。) 總之,那只是冰山一角。如果你沒用到離散數學,那麼要麼你不懂離散數學,要麼你不懂開發。
別的不說,任何一種程序設計語言,都是一種形式文法。
- 微積分 - 遊戲的物理引擎、流體模擬
- 離散數學 - 地圖導航
- 線性代數 - 3D CG
- 概率論 - 搜索引擎、語音識別、郵件過濾
等等等等
做個遊戲,尤其 3D 遊戲。
- 線性代數:渲染管線中的各種變換,攝像機和角色的關係,移動、旋轉物體,等等。
- 概率論:隨機的敵人、掉落包、……。
- 離散數學:高級一點解析一些策劃配置的公式是不是算用到了形式文法呢?還有有限狀態機估計遊戲里到處都是。另外,你可能會用到圖論相關的一些東西,比如最短路徑、深度/寬度有限搜索之類的。
- 微積分:一時沒有想到。畢竟,編程玩兒的是數字系統,不是連續系統。
電子設計自動化(EDA工具)肯定全用到……同理,matlab肯定全用到。
最近在學scala函數編程,monad是非常重要的一個概念,來自於範疇論
big data一定會用到,尤其是從線性代數開始,講相似度,ml之後就更是跑步進入應用統計學了,不過光會理論沒屁用,因為infrastructure不夠,如果你不知道怎麼獲取數據,怎麼使喚機器,光知道理論毫無意義
看了一圈,我說說我所知道的吧。
1. 純粹的業務開發,幾乎用不到,你只有在面試的時候可能推導下一些常見演算法的時間複雜度。
2. 如果你是搞模型的,例如推薦系統、廣告系統中的點擊率預估、轉化率預估。那麼恭喜你,線性代數、概率你肯定會用到了。
3. 如果你是做遊戲策劃相關的,那麼正態分布、柏松分布你應該有所了解吧。
4. 如果你是做商業相關的,那麼逃(
微積分寫論文最基本。概率論最實用
推薦閱讀:
※為什麼自己寫的qsort比不上C語言庫里自帶的qsort效率高?
※Mathematica 是怎麼做不定積分的?能不能用幾個簡單的例子,簡述一下求不定積分的演算法?
※程序員如何通過《演算法導論》學習?這本書適不適合演算法基礎薄弱的程序員?
※如何生成多個互不重疊的不同半徑圓?