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