程序员必会的40种算法
上QQ阅读APP看书,第一时间看更新

1.1 什么是算法

简而言之,算法是求解问题的计算规则集,每条规则都执行某种计算。它旨在根据精确定义的指令,为任何有效的输入产生对应的输出结果。在英语词典(如American Heritage Dictionary)中查找算法这个词,你将得到这个概念的定义如下:

“算法是由无歧义指令构成的有限集合,它在给定的一组初始条件下按预定顺序执行,直到满足给定的可识别的结束条件,以实现某种目的。”

算法设计致力于设计一种最高效的数学步骤来有效地求解实际问题。以所得的数学步骤为基础,可以开发一个可复用且通用性更强的数学方案来求解更广泛的类似问题。

算法的各个阶段

图1-1展示了开发、部署和使用算法的各个阶段。

图 1-1

可以看到,整个过程始于从问题表述中了解算法的设计需求,明确需要完成的事项细节。一旦问题被明确表述,就可以进入开发阶段。

开发阶段由两个阶段构成:

  • 设计阶段:设计阶段要构思算法的架构、逻辑和实现细节并形成文档。设计算法时,既要考虑算法的准确性,又要考虑算法的性能。为给定问题设计算法时,很多时候最终会得到多个候选算法。算法设计阶段是一个迭代的过程,需要对各种候选算法进行比较。有些算法简单而快速,但可能会牺牲一些准确性。其他算法可能非常准确,但由于其复杂度高,可能需要大量的运行时间。在这些复杂的算法中,也有一些算法比其他算法更高效。在做出选择之前,应该仔细研究候选算法的所有内在平衡因素。特别是,为复杂问题设计高效算法非常重要。恰当设计的算法是一个有效的解决方案,它不仅具有令人满意的性能,还具有令人信服的准确性。
  • 编码阶段:编码阶段将设计好的算法转化为计算机程序。重要的是,实际程序必须实现设计阶段提出的所有逻辑和结构。

算法的设计阶段和编码阶段本质上是一个迭代过程。设计出同时满足功能性需求和非功能性需求的算法,往往需要花费大量的时间和精力。算法的功能性需求明确刻画了给定输入数据对应的正确输出结果,而非功能需求主要是指在给定数据规模上的性能需求。本章稍后将讨论算法的验证和性能分析。算法验证就是验证算法是否满足其功能性需求,而性能分析则是验证算法是否满足其主要的非功能性需求,亦即性能需求。

一旦将选用的算法用编程语言进行了代码设计和代码实现,就可以部署算法的代码了。部署算法需要设计代码运行的实际生产环境,其设计需要根据算法的数据和处理需求来展开。例如,并行算法需要恰当地选择集群中计算机节点的数量,以确保算法被高效执行;数据密集型算法则需要设计数据传递管道、数据缓存策略和数据存储策略。生产环境的设计将在第13章和第14章中更加详细地讨论。一旦生产环境被设计和实现,算法就可以部署了。之后,算法就接收并处理输入数据,并按照要求生成输出结果。