简单来说,所谓算法(algorithm)就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出。亦即,算法就是一系列计算步骤,用来将输入数据转换成输出结果。
我们还可以将算法看作是一种工具,用来解决一个具有良好规格说明的计算问题。有关该问题的表述可以用通用的语言,来规定所需的输入/输出关系。于子对应的算法则描述了一个特定的计算过程,用于实现这一输入/输出关系。
例如,假设需要将一列数按非降顺序进行排序,在实践中,这一问题经常出现。它为我们引入许多标准的算法设计和分析工具提供了丰富的问题场景。下面是有关系排序问题的形式化定义:
输入:有n个数构成的一个序列(a1,a2......,an)。
输出:对输入序列的一个排序(重排)(a'1,a'2....a'n),使得a'1<=a'2<=a'n。
例如,给定一个输入序列(31,41,59,26,26,41,58),一个排序算法返回的输入序列式(26,31,41,41,58,59)这样的一个输入序列称为该排序的问题的一个实例(instance) 一般来说某一个问题的实例包含了求解该问题所需的输入(它满足有关问题的表述中给出的任何限制)。
在计算机科学中,排序时一种基本的操作(很多程序都将它用作一种中间步骤),因此,迄今为止,科研人员提出了多种非常好的排序算法,对于一项特定的应用来说,如何选择最佳的排序算法要考虑多方面的因素,其中最主要的是考虑待排序的数据项数,这些数据项已排好序的程序、对数据项取值的可能限制、打算采用的存储设备的类型(内存、磁盘、磁带)等。
如果一个算法对某每一个输入实例,都能输出正确的结果并停止,则称它是正确的。我们说一个正确的算法解决了给定的计算问题。你正确的算法对于某些输入来说,可能根本不会停止,或者停止时给出的不是预期的结果,然而,与人们对不正确算法的看法相反,如果这些算法的错误率可以得到控制的话,它们有时也是有用的。关于这一点,在第31章中研究用于寻找大质数的算法时介绍了一个例子。但是,一般而言,我们还是