在一段时间的算法学习以后,我们会有一定量的算法积累。借助这些算法,我们可以解决许多现成的问题。并且我们可以看到,当一个算法给定时,具体的数据结构无需指定。为使运行时间尽可能地少,需要由编程人员来选择适当的数据结构。
但是,有时候我们不得不把注意力从算法的实现转向算法的设计,因为已有的算法和数据结构并不能完全解决我们在编程中遇到的所有问题。
因此,这里我们将集中讨论用于求解问题的五种通用类型的算法。对于许多问题,很可能这些方法中至少有一种方法是可以解决问题的。特别地,对于每种类型的算法,我们将:
- 了解一般的处理方法
- 考察几个例子
- 概括地讨论时间和空间的复杂度
这五种通用类型算法分别为:
贪婪算法(greedy algorithm)
贪婪算法分阶段地工作。在每一个阶段,可以认为所做决定是好的,而不考虑将来的后果。通常,这意味着选择的是某个局部最优。这种“眼下能够拿到的就拿”的策略是这类算法名称的来源。当算法终止时,我们希望局部最优等于全局最优。如果是这样的话,那么算法就是正确的;否则,算法得到的是一个次最优解(suboptimal solution)。如果不要求绝对最佳答案,那么有时可以选择使用简单的贪婪算法生成近似的答案,而不是使用通常产生准确答案所需要的复杂算法。
贪婪算法的例子:Dijkstra算法、Prim算法和Kruskal算法。
分治算法(divide and conquer)
分治算法由两部分组成:
- 分(divide):递归解决较小的问题(基本情况除外)