让我们从我经常被问到的一个问题开始:“什么是算法?”
一个常见的回答是,“完成一个任务所需的一系列步骤。”在日常生活中经常会碰到算法。刷牙的时候会执行一个算法:打开牙膏盖,拿出牙刷,持续执行挤牙膏操作直到足量的牙膏涂在你的牙刷上,盖上牙膏盖,将牙刷放到嘴的1/4处,上下移动牙刷N秒,等等。如果你必须乘通勤车去工作,乘通勤车也是一个算法。诸如此类。
但是本书是关于运行在计算机上的算法的,或者更概括地来讲,是关于运行在计算设备上的算法的。正如你日常所运行的算法会影响你每天的生活一样,在计算机上运行的算法也会影响你的生活。你使用过GPS来寻找旅行路线吗?它运行一种称为“最短路径”的算法以寻求路线。你在网上购买商品吗?那么你会使用(应该正在使用)一个运行加密算法的安全网站。当你在网上购买商品时,它们是由一个私营快递公司发货的吗?它使用算法将包裹分配给不同的卡车,然后确定每个司机发件的顺序。算法运行在各种设备上——在你的笔记本上,服务器上,智能手机上,嵌入式系统上(例如你的车中,你的微波炉中,或者气候控制系统中)——无处不在!
运行在计算机上的算法和你在日常生活中执行的算法有什么区别呢?当粗略地描述一个算法时,你可能能够容忍它的非精确性,但是计算机不能。例如,如果你开车上班,你的drive-to-work算法可能会说“如果交通不畅,可以选择其他路线”。虽然你可能知道“交通不畅”是什么意思,但是计算机不知道。
因此,一个计算机算法是完成一个任务所需的一系列步骤,且这些步骤需要足够精确地描述,以使得计算机能够运行它。如果你已经用Java、C、C++、Python、Fortran、Matlab或者类似的编程语言编写过哪怕一丁点的计算机程序,那么你会对精确度标准的含义有一些概念。如果你从来没有编写过计算机程序,那么当你看了本书中如何描述算法后,可能你会对精确度有一点概念。
我们思考下一个问题:“我们想从一个计算机算法中获取什么?”
计算机算法解决计算问题。我们希望从一个计算机算法中获取两个结果:给定一个问题输入,它应该总能够产生该问题的正确输出结果,并且在运行该算法时,应该能够有效地利用计算资源。让我们依次看看这两个必要条件。