算法的分类

来源:互联网 发布:生物多样性锐减的数据 编辑:程序博客网 时间:2024/05/16 17:16

算法有多种分类方式,可以根据实现方式分类,也可以根据设计方法分类,还可以根据应用领域进行分类。不同的分类方式有不同的特点。

按照实现方式分类,可以将算法分为递归算法、迭代算法、逻辑算法、串行算法和并行算法和分布式算法、确定性算法和非确定性算法、精确算法和近似算法等。

递归算法(recursion algorithms)是一种不断调用自身直到指定条件满足为止的算法。这是一种重要的算法思想。有关递归算法的详细内容,参见本章后面的相关节次。

迭代算法(iteration algorithms)是采用计算机解决问题的一种基本方法。该算法主要是利用计算机运算速度快、适合做重复性操作的特点,让计算机重复执行某种结构或一组指令或一些步骤,在每次执行这种结构(或指令或步骤)时,都从变量的原值推出它的一个新值。也就是说,迭代算法通过从一个初始值出发寻找一系列近似值来解决问题。迭代算法的基本步骤包括确定迭代变量、建立迭代关系式、对迭代过程和结束方式进行控制。

逻辑算法(logical algorithms)又称为逻辑演绎、演绎逻辑,是一种以一般概念、原则为前提,推导出个别结论的思维方法,即根据某类事物都具有的一般属性、关系来推断该类事物中个别事物所具有的属性、关系的推理方法。例如,水果都含维生素,猕猴桃是水果,所以猕猴含维生素。

如果算法指令在计算机中执行的过程是一个指令接着一个指令,在指定的时刻只能有一个指令在执行,那么该算法是就串行算法(serial algorithms)。与串行算法对应的是并行算法、分布式算法。并行算法(parallel algorithms)是并行计算中的重要问题,指在并行机上同时用很多个处理器联合求解问题的方法。分布式算法(distributed algorithms)是一种可以借助计算机网络进行运算的方法。分布式算法广泛应用于通信、科学计算、分布式信息处理等领域。在并行算法和分布式算法中,成本消耗不仅涉及到每一个处理器本身处理数据的消耗,而且包括处理器之间通信所耗费的成本。因此,在选择是采用串行算法,还是并行算法或分布式算法时,要综合考虑成本因素。

确定性算法(deterministic algorithms)是最常见到的算法,其计算行为是可预测的。在确定性算法中,给定一个特定的输入,总是会产生相同的输出结果,且其计算过程总是一样的。例如,求解一元二次方程根的算法就是一个典型的确定性算法。与确定性算法相比,不确定性算法(non-deterministic algorithm)是指计算行为是不可预测的。在很多运算过程中,往往有许多因素造成运算过程或结果是不确定的。在不确定算法中,运算过程往往有一个或多个选择点,且各种选择都有可能发生。

一般地认为,精确算法(exact algorithms)是指总是可以找到最优解的算法,近似算法(approximate algorithms)则是指寻找接近最优解的满意解的算法。在很多实际问题中,往往只能找到近似解,因此近似算法更加有效。

如果根据设计方法来分类,可以将算法分为穷举法、分治法、线性规划法、动态规划法、贪心算法、回溯法等。

穷举法(exhaustive search),又称为强力搜索法(brute-force search)、枚举法(enumeration method),是一种解决问题的基本方法,该方法枚举出所有可能的解决方案,然后对每一个可能的解决方案进行测评以便找到满足条件的方案。例如,寻找自然数n的所有除数、中国传统的百元买百鸡问题(公鸡每只5元、母鸡每只3元、小鸡3只1元,百元买百鸡,问共有多少种买法?)、国际象棋中的8皇后问题等,穷举法是解决这些问题的有效方法。在这种方法中,算法的主要成本是需要枚举出所有可能的解决方案,解决方案数量会随着问题中数据规模的增加而急剧地增大。因此,这种方法适合问题中数据规模有限的情况,或者问题限于特定领域中。

分治法(divide and conquer algorithm)的基本思想是把一个大问题分解成多个子问题,这些子问题可以继续再分解(递归方式),直到分解后的子问题容易解决为止,然后把这些子问题的解决方案组合起来得到最终的结果。其主要步骤如下:按照指定的约束条件把问题进行分解直至得到容易解决的子问题,分别解决每个子问题,把子问题的方案组合起来。需要注意的是,分治法与递归法不同,虽然两者都强调层层分解得到子问题,但是递归强调子问题的形式与初始问题的形式完全一样,而分治法则不强调子问题的形式与初始问题完全一样,只是强调子问题是否容易得到解决,不同的子问题可以有不同的解决方式。二分搜索算法就是一个典型的分治法,其基本思想是,对于有序序列,确定待查记录的范围,然后逐步缩小范围直到找到记录为止。

线性规划法(linear programming method,LPM)又称为线性规划技术,是一种解决多变量最优决策的典型方法。线性规划法是指在各种相互关联的多变量约束条件下,解决一个对象的线性目标函数最优化的问题。其中,目标函数是决策者要求达到目标的数学表达式,用一个极大或极小值来表示;约束条件是指实现目标的能力资源和内部条件的限制因素,用一组等式或不等式表示。线性规划法是经营管理决策中最常用的数学方法,主要用来解决管理决策、生产安排、交通设计、军事指挥等问题。

动态规划法(dynamic programming method,DPM)是1953年美国应用数学家Richard Bellman提出用来解决多阶段决策过程问题的一种最优化方法。多阶段决策过程是把研究问题分成若干个相互联系的阶段,每一个阶段都做出决策,从而使整个过程达到最优化。动态规划法是一种多阶段决策方法,其基本思想是按时空特点将复杂问题划分为相互联系的若干个阶段,在选定系统行进方向之后,从终点向始点逆向计算,逐次对每个阶段寻找决策,使整个决策过程达到最优。该方法又称为逆序决策过程。许多实际问题利用动态规划法处理往往比线性规划法更有效。动态规划法与分治法类似,都是将问题归纳为较小的、相似的子问题,通过求解子问题产生一个全局解。但是,分治法中的各个子问题是独立的,一旦求出各个子问题的解后,可以自下而上地将子问题的解合并成问题的最终解。动态规划法则允许这些子问题不独立,该方法对每个子问题只解一次,并将结果保存起来,避免每次碰到时都重复计算。动态规划法适合于解决资源分配、优化调度等优化问题。

贪心算法(greedy algorithms)类似于动态规划法,在对问题求解时,先把问题分成若干个子问题,总是贪心地做出在当前看来是最好的选择。也就是说,贪心算法不是从整体最优上加以考虑,所做出的决策仅是在某种意义上的局部最优解。虽然对于许多问题,贪心算法不能给出整体最优结果,但是贪心算法是运算速度最快的方法,并且对许多问题能产生整体最优解或整体最优解的近似解。Kruskal提出的最小生成树算法就是一个典型的贪心算法。贪心算法与动态规划法类似,但也有不同之处。贪心算法的当前选择可能要依赖已经做出的所有选择,但不依赖于有待于做出的选择和子问题。动态规划法的当前选择不仅依赖已经做出的所有选择,而且还依赖于有待于做出的选择和子问题。

回溯法(backtracking algorithms)是一种选优搜索法,按选优条件向前搜索,以达到目标。当搜索到某一步时,发现原先选择并不优或达不到目标,就退回上一步重新选择。这种走不通就退回再走以便达到优化目的的方法称为回溯法。如果搜索方式合理的话,回溯法往往比穷举法要快,因为回溯法可以根据一次尝试而删除大量可选的解决方案。

如果根据应用领域进行分类的话,算法的种类就更多了。每种应用领域都会有大量的算法。一些典型的算法包括排序算法、搜索算法、图论算法、机器学习、加密算法、数据压缩算法、语法分析算法、数论与代数算法等。