1.1 什么是算法
什么是算法(Algorithm)呢?算法就是用于计算的方法,通过这种方法可以达到预期的计算结果。
除此定义外,在一般的教科书或者字典上也有关于算法的专业解释。例如:算法是解决实际问题的一种精确描述方法;算法是对特定问题求解步骤的一种精确描述方法等。目前,广泛认可的算法的专业定义是模型分析的一组可行的、确定的和有穷的规则。
通俗地讲,可以将算法理解为一个完整的解题步骤,由一些基本运算和规定的运算顺序构成。通过这样的解题步骤可以解决特定的问题。从计算机程序设计的角度来看,算法由一系列求解问题的指令构成,能够根据规范的输入在有限的时间内获得有效的输出结果。算法代表了用系统的方法来描述解决问题的一种策略机制。
下面举一个例子来看算法是如何在现实生活中发挥作用的。最典型的例子就是统筹安排,假设有3件事(事件A、事件B和事件C)要做。
做事件A需要耗费5分钟。
做事件B需要耗费5分钟但需要15分钟的时间才可以得到结果,例如烧水等待水开的过程。
做事件C需要耗费10分钟。
那么我们应该如何来合理安排这3件事呢?一种方法是依次做,如图1-1所示。做完事件A,再做事件B,最后做事件C。这样总的耗时是5+(5+15)+10=35分钟,这显然是一种浪费时间的方法。
在实际生活中比较可取的方法是,先做事件B,在等待事件B完成的过程中做事件A和事件C。这样,等待事件B完成的15分钟正好可以完成事件A和事件C。此时,总的耗时是5+15=20分钟,效率明显提高,如图1-2所示。
图1-1 方法一
图1-2 方法二
在上面的例子中,提到了两种方法,可以看作是两种算法。第一种算法效率低,第二种算法效率高,但都达到了做完事情的目的。从这个例子可以看出,算法是有好坏之分的,好的算法可以提高工作效率。算法的基本任务就是对一个具体的问题找到一个高效的处理方法,从而获得最佳的结果。
一个典型的算法一般都可以从其中概括出5个特征:有穷性、确切性、输入、输出和可行性。下面结合上面的例子来分析这5个特征。
(1)有穷性
算法的指令或者步骤的执行次数必须是有限的,执行时间也是有限的。例如,在上面的例子中,通过短短的几步就可以完成任务,而且执行时间都是有限的。
(2)确切性
算法的每一个指令或者步骤都必须有明确的定义和描述。例如,在上面的例子中,为了完成3件事的任务,每一步做什么都有明确的规定。
(3)输入
一个算法应该有相应的输入条件,用来刻画运算对象的初始情况。例如,在上面的例子中,有3个待完成的事件,事件A、事件B和事件C便是输入。
(4)输出
一个算法应该有明确的输出结果。这是很容易理解的,没有结果的算法是毫无意义的。例如,在上面的例子中,输出结果便是3件事全部做完了。
(5)可行性
算法的执行步骤必须是可行的,且可以在有限的时间内完成。例如,在上面的例子中,每一个步骤都切实可行。无法执行的步骤是毫无意义的,解决不了任何实际问题。
目前,算法的应用非常广泛,常用的算法包括递推算法、递归算法、穷举算法、贪婪算法、分治算法、动态规划算法和迭代算法等。本书将依次逐步向读者展示各种算法的原理和应用。