非形式地说,算法就是任何良定义(对于良定义我的理解是给出的定义是清晰,不是模棱两可的)地计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。
我们也可以把算法看成是用于求解良说明的计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。
关于排序问题的形式定义:
输入:n个数的一个序列<a1,a2,...,an>。
输出:输入序列的一个排列<b1,b2,...,bn>,满足b1<=b2<=b3...<=bn。
假如,给定输入序列<31.41.59.26.41.58>,排序算法将返回序列<26,61,41,41,58,59>作为输出。这样的输入序列称为排序问题的一个实例。一般来说,问题实例由计算该问题解所必需的(满足问题陈述中强加的各种约束的)输入组成。
若对每个输入实例,算法都以正确的输出停机,则称该算法是正确的,并称正确的算法解决了给定的计算问题。不正确的算法对某些输入实例可能根本不停机,也可能以不正确的回答停机。
算法可以用英文说明,也可以说明成计算机程序,甚至说明成硬件设计。唯一的要求是这个说明必须精确描述所要遵循的计算过程。
许多有趣的算法问题所共有的两个特征:存在许多候选解(通常我们是寻找真正的解或一个最好的解)。存在实际问题(比如最短路径问题可以解决一些实际的导航问题)。
计算机并不是无限快,存储器也不是免费的。你应该明智地使用这些资源,在时间或空间方面有效的算法将帮助你怎样使用资源。求解相同问题而设计的不同算法在效率方面常常具有显著的差别。
最后,是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。