数学对编程有多大作用?
“程序员需要学数学吗”一直是个行业热门议题,正方说因为不懂数学绕过一些弯路,反方会说绝大多数工作都用不上那些原理。总之,做这个 battle 就像西西弗斯推石头,没完没了没意义。
我刚入行时觉得,数学是解决一些问题的工具,但是业余时间宁愿学写设计模式,也不会花时间学数学原理。工作几年后终于理解这句话:编程的本质就是数学问题。
举个最基础的例子,衡量代码运行效率的一个重要因素是复杂度。空间复杂度和时间复杂度的分析就源于数学的极限的概念。复杂度的计算就是一个关于输入数据量 n 的函数,只要你稍有数学思维,就能从平时的编程经验中得出这些结论:
一个顺序结构的代码,时间复杂度是O(1), 二分查找,时间复杂度是O(logn), 一个简单的 for 循环,时间复杂度是 O(n), 两个顺序执行的 for 循环,时间复杂度是 O(n)+O(n)=O(2n),其实也是O(n), 两个嵌套的 for 循环,时间复杂度是 O(n²)。
具备这些意识,工作中再去分析代码的时间复杂度会容易很多。实现基本功能的代码,谁都能写,真正的能力门槛是把代码写得简洁、优雅、可持续优化。
越往高处走,越是基本功的比拼。数学基础好的人,逻辑思维不会差,在编程世界中,理解底层原理、数据结构、算法,都会比别人快一步,这可能被被误认是优秀程序员的“天分”,我更相信,这是数学功底带来的养料。
数学不好,怎么办?
数学这个庞大学科是出了名的高深,听原理名词就能劝退很多人,不过我们的目标不是学成数学家,没必要追求大而全。学好程序员用得上的数学,就足以让你成为我们这一行的专家。
哪些知识是程序员用得上的数学?
行业大佬最有发言权,认识这个大佬源于之前一个爆款课程《重学数据结构与算法》,履历很不错,既是中科院博士,又是国内一线互联网公司的资深算法专家,学科背景扎实,一线代码经验也很丰富。所以这次他做了这个专门给程序员的数学课,我是非常信赖的。
这个课会怎么讲?
坦诚地讲,我看了目录后发现,这个课对数学这个学科来说,只是冰山一角,而对程序员来说,却是工作中用得上的绝对部分。
实践永远是真理的落脚点,数学原理对我们不是空中楼阁,而是一定要用于代码优化。举个简单例子,回到我们最初讨论的,如何降低代码复杂度:
一个无序数组查找问题,数组中只有数字 obj 出现了一次,其他数字都出现了两次,查找 obj ,常规解法的复杂度应该是:O(n²) 时间复杂度、O(1) 空间复杂度,或者 O(n) 时间复杂度、O(n) 空间复杂度。但我们加个约束为O(n) 的时间复杂度、O(1) 的空间复杂度。
如果你熟知数学的异或运算的这两个性质:任何数异或自己,为零,任何数异或零,是它自己。你就会轻易找到解决办法,把数组中所有元素计算一下异或就可以了。实现代码如下:
a = [2,1,4,3,4,2,3]
result = a[0]
for i in range(1,len(a)):
result = result ^ a[i]
print result
通过这个例子是想告诉你,这个课不会给你讲异或运算的前世今生,就像去证明哥德巴赫猜想,而是让你聚焦工作领域,夯实基本功,先把这些基础知识搞定,你的逻辑、思想模式,将不拘泥于代码本身,而是能用数学思想解决问题。
这个课程会讲些什么?
① 养成无处不在的数学思维。第一模块通过数制转化、数学逻辑、经典公式等原理与业务代码示例,讲解数学思维是如何运用在日常编程工作中的,让你重新审视数学思维在工作中的作用。
② 程序员必备的数学原理:代数与统计。精简的数学知识,比如求极值、向量与导数,这些应用于实际工作哪些方面:如何找到复杂业务最优解,如何完成海量高维度数据计算。这一模块将带你认识数学原理的实际应用,更为你打好理论基础。
③ 打好编程基本功:算法与数据结构。这一模块会讲到二分法、动态规划、递归等通用算法和重要思想,从数学角度找到算法背后的规律,还会结合实战场景,如:利用指数爆炸优化程序,将数学原理、算法与实战结合,事半功倍地夯实开发基本功。
④ AI 与机器学习,热门领域的核心技术。AI 与机器学习的技术核心其实是数学问题,这一模块将通过几个常用技术点,逻辑回归、决策树等,带你入门 AI 建模,从数学角度理解当前热门领域。
程序员用得上的数学知识,都在这个大纲里
大诗人陆游曾说“工夫在诗外”,数学对程序员来说,也是如此,它不是你学完即用的技术,却是你必不可少的滋养,希望数学这个“诗外之工”让你离一流程序员,更近一步。
额外福利:
点击“阅读原文”免费获得:
1.领取配套学习资料
2.加入学习交流群、反馈学习难题
3.不定期技术公开课免费听