本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是周四高等数学专题的第7篇文章。
之前的文章和大家聊了许多数学上的理论,今天和大家聊点有用的东西。
我们都知道,工业上的很多问题经过抽象和建模之后,本质还是数学问题。而说到数学问题就离不开方程,在数学上我们可以用各种推算、公式,但是有没有想过在计算机领域我们如何解一个比较复杂的方程?
如果之前没有想过,那你可能得想一想,因为以后很有可能会在面试题当中遇到。
二分法
我们要介绍的第一个方法是二分法。
说到二分法大家应该都不陌生,老实说我第一次在高数课本上看到二分法这三个字的时候,其实是蛮震惊的。后来当我又在统计等数学书上看到许多其他算法之后,才慢慢习以为常。在我转行做算法的这几年当中,我越来越意识到,数学的重要性。虽然这并不意味着你一定要成为数学高手,但如果你还没毕业的话,至少数学课好好听讲还是很有必要的。
我们说回二分法,如果学过二分法,会觉得这是一个非常简单的算法,但如果你们做过LeetCode第四题,又会发现纯二分法的题也可以这么难。如果只是单纯地讲解二分法的原理,我们是很难完完全全将这个算法吃透的。为了达到这点,我思考了很久,最终决定仿照看山是不是山的禅宗理论,将二分法也分成三个层次。
首先是第一个层次,即我们每次将一个东西分成两半。
这个应该是我们最初也是最直观的观念,比如最经典的金币问题。说是我们有若干个个硬币,其中有一个是金币,金币的重量更重,其他的硬币重量相等。我们只有一个天平,怎么样用最少的次数找出金币。
在这个问题当中,我们需要不停地将硬币分成两个部分,用天平锁定其中的一个。通过不断重复上述操作,快速找到答案。
在第二个层次当中,二分法不再是简单地将物体一分为二,而是一个折半查找的函数。这也是本文重点要介绍的解方程的方法。
如果有函数
,它在区间[a, b]上递增或者递减,并且
。那么我们知道函数必然有一个等于0的解,而且这个解我们可以用二分法来求近似解。
在上图当中,
递增,并且
0"/>。我们继续获取了a和b的中点
。根据上图,我们又得到
看成是新的b。于是我们继续寻找a和
的中点,重复上述过程,由于我们最大的误差就是区间的长度,所以当我们区间的长度缩减到足