程序员数学思维与编程实践.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

本文由简悦SimpRead转码,原文地址

你好,我是公瑾,欢迎来到《程序员的数学课》。一些同学可能知道,之前我在拉勾教育就开设了一个

《数据结构与算法》课程,目的是帮助大家提升编码能力,打牢代码基础,在结也受到许多同学的

好评,表示所讲的内容在面试和工作中都很有实用性。

编程一类的基础能力固然重要,但这些依旧不是程序员全部的“立足之本”。个人角度而言,从我在

院的博士经历,再到后来从事机器学习、数据挖掘等算法研发工作,都是数学作为我的基础思维

能力支撑我一路走来。

程序员为什么要注重数学?

在《数据结构与算法》课程中,许多留言问题高频集中在:复杂度如何计算、某个代码优化是否降低了

时间复杂度,或者是动态规划的状态转移方程问题,等等。这的确是在学习数据结构中遇到的,但

剥离了外壳,你会发现本质上都是数学问题。

举个例子,对于一个有序数组中查找目标值的问题,应该采用二分查找算法。而且随着数组元素越来越

多,二分查找相对全局遍历而言,性能上的优势会越来越明显。从数学视角来看,这是因为当x很大

时,lnxx。比如x=100,ln100=4.6100。

y=lnx与y=x的函数图

可能许多同学知道二分查找效率更高,但二分查找的代码,是需要采用递归进行实现的。很多同学为了

实现方便,就会考虑采用搜索的查找方式,也就是一个for循环搞定。但如果你知道了它背后的数

学原理,并且深刻体会到ln100=4.6100,你就再也不会用for循环去实现有序数组的查找问题了。

此外,数学还可以帮助你降低代码的复杂度。

我们看一个编程问题。一个数组中,只有数字obj出现了一次,其他数字都出现了两次。请查找出

obj,约束为O(n)的时间复杂度、O(1)的空间复杂度。

例如在数组a=[2,1,4,3,4,2,3]中,则输出1。因为2、3、4都出现了两次,唯独1只出现一次。

这是个在无序数组中,涉及与其他元素匹配的查找问题。常规解法的复杂度应该是:O(n²)时间复杂

度、O(1)空间复杂度,或者O(n)时间复杂度、O(n)空间复杂度。显然,这并不符合题目的约束。

要想解决这个问题,需要借助数学的异或运算。异或有这样两个性质:第一,任何数异或自己为零;第

二,任何数异或零,是它自己。借助异或运算,你只需要把数组a中所有元素计算一下异或就可以得到

obj了。实现起来,就是如下所示的O(n)时间复杂度的for循环,且不需要额外开辟复杂变量。

从上面的例子中你便能认识到数学的重要性,越是优雅的程序,越是能用简单的代码实现同样的需求。

工作场景之外,在求职面试中,大量的算法题也是对程序员数学能力的考察,与其直接海量刷题,不如

先打好知识基础和建好思维逻辑,再有方法论地刷题,才能未雨绸缪、有备无患。

程序员学数学有哪些痛?

下定决心开始学习数学,绝大多数的程序员都会下面几个问题。

第一,数学的海洋过于广阔,不知道学什么。

从数学的知识体系看,它至少包括了微积分、线性代数、几何、概率论、数理统计等内容。而对于程序

员,只需要精通那些对代码开发有指导性帮助的数学知识就足够了。那么哪些数学是必要的呢?又如何

区分必备的数学知识的边界呢?这对于许多程序员来说是模糊的。

第二,各种数学理论,如何联系到工作实践中?

结合前面“降低代码复杂度”的例子,你会发现自己很难想到利用“异或”去查找前面数组中的obj。先从

编程思想来看:时间复杂度是O(n),这就意味着可以使用一个for循环;空间复杂度是O(1),这就意味

着处理过程只能做一些基本运算。

接着围绕题目来看,除了obj以外的元素都出现两次。奇想一下,如果可以有一个类似于“连连看”

的计算,能把相同元素清掉,最终不就只保留了obj吗?“相同元素”清掉,这就是异或运算口诀中的“同

零异一”,这就与异或的数算构建了联系。因此,学习数学时,死读书是没用的,必须落地到实

践,做到知行合一。

第三,数学本身很难,工作又很忙,不知道怎么学?

不说,数学并不简单。学好数学,必要的时间、脑力投入肯定少不了。然而程序员节奏紧张,工作

大,这就要求程序员在学习数学的时候,必须掌握学习方法,提高学习效率。这也是我们本课程要

解决的问题。

我将怎么带你学数学?

如果你是数学专业者,需要追求

您可能关注的文档

文档评论(0)

wx5620 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档