导读:本文内容主要源自德语大学中发起的科普活动,初衷是让高中生领会算法和计算机科学的奇妙与魅力。阅读本文不需要任何关于算法和计算的预备知识。我们希望不仅学生,而且包括希望了解迷人的算法世界的成年人都能从本书中得到启发与乐趣。
作者:Thomas Seidl, Jost Enderle, Wolfgang P. Kowalk, Berthold Vöcking
本文摘编自《无处不在的算法》,如需转载请联系我们
00 算法的应用
最近几十年来许多技术创新和成果都依赖于算法思想,这些成果广泛应用于科学、医药、生产、物流、交通、通信、娱乐等领域。高效的算法使得你的个人电脑得以运行新一代的游戏,这些复杂的游戏在几年前可能都难以想象。
更重要的是这些算法为一些重大科学突破提供了基础。例如,人类基因组图谱解码得以实现与新算法的发明是分不开的,这些算法能将计算速度提高几个数量级。
算法告诉计算机如何处理信息,如何执行任务。算法组织数据,使得我们能有效地搜索。如果没有聪明的算法,我们一定会迷失在互联网这个巨大的数据丛林中。
同样,如果没有天才的编码和加密算法,我们也不可能在网络上安全地通信。天气预报与气候变化分析也依靠高效模拟算法。
工厂生产线和物流系统有大量复杂的优化问题,只有奇巧的算法能帮助我们解决。甚至当你利用GPS寻找附近的餐厅或咖啡馆时,也要靠有效的最短路计算才能获得满意的结果。
并非像很多人认为的,只有计算机中才需要算法。在工业机器人、汽车、飞机以及几乎所有家用电器中都包含许多微处理器,它们也都依赖算法才能发挥作用。例如,你的音乐播放器中使用聪明的压缩算法,否则小小的播放器会因为存储量不足而无法使用。
现在的汽车和飞机中有成百上千的微处理器,算法能帮助控制引擎,减少能耗,降低污染。它们还能控制制动器和方向盘,提高稳定性与安全性。不久的将来,微处理器可能完全替代人,实现汽车的全自动驾驶。目前的飞机已经能做到在从起飞到降落的全过程中无须人工干预。
算法领域最大的进步都来自美好的思想,它指引我们更有效地解决计算问题。我们面对的问题绝不局限于狭义的算术计算,还有很多表面上不是那么“数学化”的问题。例如:
如何走出迷宫?
如何分割一张藏宝图让不同的人分别保存,但只有重新拼合才可能找到宝藏?
如何规划路径,用最小成本访问多个地方?
这些问题极具挑战,需要逻辑推理、几何与组合想象力,还需要创造力才能解决。这些就是设计算法所需要的主要能力。
01 二分搜索
我新买的Nelly的唱片哪儿去啦?我那专横的妹妹Linda有整洁癖,肯定是她将唱片又插进唱片架上了。我告诉她新买的唱片别插上去。这下我得在架子上的500张唱片中一张一张地找了,这该找到什么时候啊!
不过,走运的话也可能并不需要查看所有唱片就碰到了。但最坏的情况是Linda又把唱片借给朋友了,那得查完所有唱片才知道不在这里了,然后只好去听广播啦。
找找看吧!Aaliyah,AC/DC,Alicia Keys……嗯,Linda好像按字母顺序给唱片排过序了。这样的话我找Nelly的唱片就容易多了。
我先在中间试试。Kelly Family,这太偏左了,必须往右边找。Rachmaninov,这又太偏右了,再往左一点儿……Lionel Hampton,右了点儿,但不远了。Nancy Sinatra……Nelly,找到啦!
这倒很快!因为唱片已经排了序,我只要来回跳几次就找到目标了!即使我要的唱片不在架子上,我也能很快发现。不过如果唱片很多,比如说10 000张,那可能得来回跳上几百次吧。我很想知道如何计算次数。图1-1给出了不同搜索方法的示意。
▲图1-1 顺序搜索与二分搜索图示
1. 顺序搜索
Linda从去年开始学习计算机科学;她应该有些书能告诉我答案。我看看,“搜索算法”可能有用。这里说了如何在一个给定集合(这里是唱片)中按照关键字(这里用艺术家的名字)找一个对象。我刚才的做法应该是“顺序搜索”,又叫“线性搜索”。
就像我想的一样,为了找一个关键字,平均得检查一半的唱片。搜索的步数和唱片数成正比,换句话说,唱片数增加一倍,搜索时间也就增加一倍。
2. 二分搜索
我用的第二种技术好像有个特别的名字,叫“二分搜索”。给定要找的关键字以及排好次序的对象列表,搜索从中间那个对象开始,和