购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第4章

算法,网络时代的生活秘诀

阿达·洛夫莱斯

分析引擎编制代数的模式,就如同用提花织布机编织出鲜花和绿叶一般。

当下,我们的生活完全依赖于算法。上网搜索内容,使用GPS导航,观看由奈飞公司(Netflix)推荐的电影,或是在线预约,我们都要依赖算法。算法正在引导我们进入数字时代,但很少有人意识到在计算机诞生之前,算法作为数学的核心已存在了数千年。

自古希腊以来,算法的身影一直伴随着数学的诞生与发展。在欧几里得(Euclid)的巨著《几何原本》 中,他除了证明素数有无穷多个外,还发现了一个方法,按照这个方法就能解决最大公约数等问题。

这也许有助于我们更清楚地认识和解决问题。想象一下,如果你的厨房长36英尺 ,宽15英尺,那么能够覆盖整个地面而无须切割的方形瓷砖是多大尺寸呢?你该怎么计算呢?2000年前解决这类问题的算法是这样的:

假设你有两个数字,M和N,且N小于M。首先用M除以N,得到的余数记为N1。如果N1为零,那么N就是能够将这两个数整除的最大的数,即这两个数的最大公约数。如果N1不为零,则用N除以N1,得到的余数记为N2。如果N2为零,则N1是能将M和N整除的最大的数。如果N2不为零,则继续上述步骤,用N1除以N2并得到余数N3。依此类推,得到的余数是一个整数,并且随着计算的进行会越来越小,直到变为零。那么,算法最终一定会找到一个能够同时将M和N整除的最大的数,这个数被称为最大公约数。

现在让我们回到厨房地板的问题。我们知道,厨房是长方形的,而我们要寻找的是正方形的瓷砖。假定我们讨论的是一种理想状态:瓷砖的尺寸不会受到生产厂家某些规格标准的限制。现在,我们可以开始了。首先,我们找到适合原始形状的最大方形瓷砖;然后,我们寻找到适合剩余部分的最大正方形瓷砖,依此类推……剩余的地面空间逐渐缩小,直至成为一个正方形,这时刚好就可以用一整块瓷砖严丝合缝地填充进去。整个过程不需要切割任何一块瓷砖,如图4-1所示。

图 4-1

我们将上述问题的解决思路(算法)用数学的方式加以描述:假设M=36且N=5,则用M除以N得到余数N 1 =6,用N除以N 1 得到余数N 2 =3,而N 1 除以N 2 根本就没有余数,所以就可以得出3是36和15的最大公约数。

你可以看到整个计算过程隐含有许多类似于“如果……那么……”的条件判断句式,这是算法的典型特征,也是计算机程序中算法的妙趣所在。欧几里得的古老方法触及了任何算法都应该具备的四个关键特征的核心:

(1)它应该由一组精确的陈述和明确的指令组成。

(2)无论输入的参数如何,这个过程都应该完成(不应该进入无限循环)。

(3)它应该给输入算法的任何参数以答案。

(4)在理想情况下,它的运行速度应该很快。

在欧几里得的算法中,任何阶段都不存在歧义。因为余数在每一步运算后都会变小,有限的步数之后它必为零,这时算法就会停止并给出结果。算法的执行时间与问题的规模成正比,数字越大,耗时越长。

如果最古老的算法可以追溯到2000多年以前,那为什么“算法”这一名词的提出要归功于一位9世纪的波斯数学家呢?穆罕默德·阿尔·花拉子密(Muhammad Al-Khwarizmi)是巴格达智慧馆 (great House of Wisdom)的首批负责人之一,他负责将古希腊数学原著翻译成阿拉伯文。“算法”是拉丁文对他名字的翻译。尽管欧几里得的算法在《几何原本》中早已阐明,但欧几里得所使用的语言非常笨拙,而且古希腊人的思维非常几何化(数字只是线条的长度,就连证明的过程都是由图片组成的——有点像我们用瓷砖铺厨房地板的例子),所以他的算法并没有被后世所广泛采用。这是因为图片并不是一种严谨的数学方法,你需要的是代数的语言,即一个字母可以作为变量代表任何数字,而这正是花拉子密的发明。

你需要一种语言来清楚地表达算法的工作原理,并允许你在不指定数值的情况下讨论数学问题。我们已经看到这种语言能解释欧几里得算法的工作原理,给予数字一个形式化的符号名称——N和M,这些符号可以代表任何数字(我们称之为变量)。这种新的描述语言是一种高度概括的语言,它对数学的发展影响巨大,意味着数学家不需要挨个讨论遇到的所有问题,而可以运用形式化的描述方法来掌握数学运算背后的模式。一个好的算法应该满足上述的第三个特征,就好比代码和程序,它们可以不需要确定具体的参数就能够编译运行。

算法已成为我们这个时代通行的“货币”,因为它们是计算机系统的完美素材。算法利用我们解决问题的模式,反过来引导我们去找到解决问题的方案。计算机不需要思考,它只要不停地遵循算法、执行指令即可,就像变魔术一样,答案自己就会蹦出来。 I+/Fsrq3UDEJQKAPLDKPFCQbAiILvKeCF1TdUNH68OBeGmS34iQRIcdIKIylfbae

点击中间区域
呼出菜单
上一章
目录
下一章
×