首页 理论教育 算法概述及其应用技术

算法概述及其应用技术

时间:2023-11-18 理论教育 版权反馈
【摘要】:[63]算法作为解决问题的智能工具,常用的算法技术包括蛮力法、分治法、线性规划、时空权衡、动态规划、贪心法、图算法、回溯法、概率法、分支限界法、计算几何等。由分治法产生的子问题往往是原问题的较小模式,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。在这种情况下,这自然导致递归过程的产生,利用递归来实现分治法简单且易实现,往往能产生许多高效算法。

算法概述及其应用技术

算法是解决问题的方法,也是解决问题的一个过程。如我们出门前会根据目的地来规划出行路线,权衡时间、路程交通工具和费用,寻求最佳路线。在规划出行路线算法时,常以贪心原则来逐步求出最佳路线。

算法往往由若干有穷的指令组成一序列,它满足以下性质:①输入:有外部提供的数据作为算法的输入;②输出:算法解决问题后产生至少一个数据作为输出;③确定性:组成算法的每条指令是清晰、无歧义的;④有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的,因此,算法实现过程有始有终,运行一段时间后会终止输出结果。

算法不同于程序,程序是算法用某种程序设计语言的具体实现,程序可以不满足算法的性质。例如,一般的操作系统在运行时,就是一个在无限循环执行的过程,因而程序不是一个算法,操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。

算法是面向问题的,算法面临的常见问题有排序问题、查找问题、图问题、组合问题、几何问题、数值问题等,不同的算法适用于不同的问题,在日常生活中,针对同一个问题,不同的人会采用不同的解决问题的算法,这些不同的算法的效率各不相同,而算法中的某一种算法往往可以处理多个不同的问题,问题的数量是无穷的,包括人类已知的问题与未知的问题。在已知的问题中,人类能解决的问题只是有限个;在人类已解决的问题中,包括计算机能处理与不能处理的问题。如算法不能处理的一个简单问题—“能不能构建一个算法来确定在圆周率π的十进制表示形式中是否存在7个连续的1?”。在算法上一个曾经复杂而著名的不能处理的问题是图同构问题,最近有关此问题的研究成果是2015年芝加哥大学的László Babai,他的研究成果也被认为是计算机理论领域近十年以来最重要的成果。[61]

从理论角度看,算法的研究内容包括如何构造算法、操作算法、理解算法和分析算法等,它一般是面向问题驱动的,用来解决人类生活生产中遇到的一些问题,在解决这些问题的过程中,逐步形成了一些固定的处理流程,包括怎么构造、怎么实现、怎么理解和分析,这些知识积累后组成了算法的研究内容,从更普遍的意义来说,计算机产生和使用的目标就是为了解决人类面临的各种问题,因此,算法也被公认为是计算机科学的基石。

Donald Knuth认为:算法是一种一般性的智能工具,它必定有助于我们对其他学科的理解,不管是化学语言学音乐,还是另外的学科。将知识表述为一种算法,比起简单地按照常规去理解事物,用算法将其形式化会使我们的理解更加深刻。[62]David Harel在其《算法学:计算精髓》一书中认为:算法不仅是计算机科学的一个分支,它更是计算机科学的核心。而且,可以毫不夸张地说,它同绝大多数科学、商业和技术都是相关的。[63]

算法作为解决问题的智能工具,常用的算法技术包括蛮力法、分治法、线性规划、时空权衡、动态规划、贪心法、图算法、回溯法、概率法、分支限界法、计算几何等。

蛮力法(Exhaustive Method)是最主要的算法之一,它是一种简单直接地解决问题的方法,它把问题所有可能发生的情况(状态)都一一考察,找到符合条件的所有情况,就是问题的解。蛮力法又称穷举法、枚举法或暴力法,几乎所有已经解决的问题都是用这个方法解决的。如排序算法中的选择排序、冒泡排序和搜索算法中的顺序查找等都采用了蛮力法来解决问题。

分治法(Divide and Conquer,简称DC)是一种强有力的算法设计技术,它采用“分而治之”的策略,把问题分解成k个子问题,然后对这k个子问题分别求解,如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归地进行下去,直到问题规模足够小,很容易求出其解为止,最后将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。由分治法产生的子问题往往是原问题的较小模式,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。在这种情况下,这自然导致递归过程的产生,利用递归来实现分治法简单且易实现,往往能产生许多高效算法。如合并排序和快速排序算法,合并排序就是把问题将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。快速排序对待排序的序列对每个记录进行比较和交换,比较和交换是从两端向中间进行的,两端两个指针分别向中间运动,如果左指针所指的当前元素比右指针所指的当前元素大,那么左右指针指向的元素交换,然后左右指针继续移动,直到左右指针相遇为止。然后对相遇处的左右两个部分分别递归进行上述操作。

线性规划(Linear Programming,简称LP)是运筹学的一个重要分支,它是辅助人们进行决策和管理的一种数学方法,是研究线性约束条件下线性目标函数极值问题的数学理论和方法。它的研究历史较早、方法较成熟,被广泛应用于经济分析、军事作战、经营管理工程技术等方面,为合理利用有限的人力、物力、财力等资源作出最优决策,提供科学的依据。(www.xing528.com)

时空权衡技术(Time versus Space Trade-offs)是算法中常采用的一种时间和空间交换的技术,一般都是利用空间来换取时间,在问题解决过程中,当一部分结果计算出来后,为了能让它们在后续计算中继续使用,常用缓存空间对这些中间结果进行存储,避免后续计算中再次计算这些结果的可能,节省时间。整数划分问题是时间和空间交换技术的典型例子,整数划分是指把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,其中各加数所构成的集合为n的一个划分。通常用递归函数可以求出每个正整数的划分数,但是由于递归函数需要调用自身多次,所以程序运行次数和正整数n呈指数关系;如果用一个n×n的二维数组存储每一步的计算结果,那么程序运行次数和正整数n呈平方关系,大大降低了运行时间。

动态规划是20世纪50年代由美国数学家Richard Bellman发明,他提出了一个最优化原理:一个最大优策略的子策略,对于它的初态和终态而言也必是最优的。动态规划是一种多阶段决策过程最优化的通用方法,对于由交叠的子问题所构成的一类问题,如果满足最优化原理,并且其状态满足无后效性(即某个状态以前的过程不会影响以后的状态),就可以用动态规划来很好地解决,对于这些交叠的子问题,可以把每个较小的子问题的解存储于一个表中,在后续的计算中可以反复使用,大大降低计算的复杂度。动态规划一般的实现步骤是:①找出最优解的性质,并刻画其结构特征;②递归地定义最优值;③以自底向上的方式计算出最优值;④根据计算最优值时得到的信息,构造最优解。动态规划是应用最广泛的算法技术之一,它的经典问题有二项式系数计算、最短路径问题、动态时间规划、最长公共子序列、矩阵连乘问题、图的任意两点间的最短距离等。

贪心法(Greedy Algorithm)是指在问题求解过程中,总是做出在当前状况下最好的选择,在每一步选择时不从整体最优上加以考虑,而选择在局部上的最优解。当然贪心法的运用不是对所有问题都能得到整体最优解,但是往往能在许多问题上求得最优解。贪心法的关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心法在日常生活生产领域的运用非常广泛,如商业活动中的找零问题,一般以最少钱币个数为找零原则,这就是运用了贪心法。贪心法的运用需要满足使用贪心法的基本条件:①可行性:必须满足问题约束;②局部最优:它是当前步骤中所有可行选择中最佳的局部选择;③不可取消:选择一旦做出,在以后的步骤中就无法改变。贪心法也是应用最广泛的算法技术之一,它的经典问题有:最小生成树问题、单源点最短路径问题、哈夫曼编码、有期限的任务安排问题等。

图是指由各个顶点和顶点间的连接构成的结构,常用的图可分为无向图、有向图和网络图。这些不同类别的图有很多不同的图算法,这些算法包括各种遍历算法,寻找最短路径的算法,寻找网络中最低代价路径的算法等,图算法可应用到多种场合,例如,优化管道、路由表、快递服务、通信网站等。图的经典算法包括图的遍历、最小生成树、最短路径等。图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作是图的一种基本操作,图的许多操作都建立在遍历操作的基础之上,是几乎所有有关图的图算法的基础,如判断图是不是连通的问题。图的遍历算法又分为图的深度优先搜索(Depth-First Search)与广度优先搜索(Breadth-First Search)两种,深度优先搜索相对而言应用更广泛一些。深度优先搜索假设给定图G的初态是所有顶点均未曾访问过;在G中任选一顶点v为初始出发点(源点),然后进行如下步骤:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w;若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。

蛮力法、分治法、动态规划、贪心法、图算法等方法都被证明是非常有效的算法。但是,还有大量的实际问题人类尚未找到有效的算法,解决这些问题的时间常常需要用年或世纪来计算,如图的4着色问题,对世界上二百多个国家和地区进行着色时,如果用蛮力法,需要对多种不同的状态进行判断,这个状态数比整个宇宙的原子数量还大。

面对这些困难问题,有三套经典的解决方案,分别是基于搜索剪枝技术、基于精确的概率概念和基于近似的解。基于搜索剪枝技术适用于那些在平均情况下能够显示出良好的时间复杂性,但在最坏情况下很难得到多项式解法的问题。此方法对问题的状态空间进行搜索,并在搜索过程中进行剪枝,回溯法和分支限界法是常用的搜索剪枝算法。基于精确的概率概念的算法是一个简单的决策或测试过程,能够精确地完成一个任务,经过这样的反复测试,将能够构造解,或者增加解的可信度到所期望的程度。基于近似解的算法适用于只需要得到渐进解的问题,利用此方法,可以通过在解的质量上的妥协以换得更快的(多项式时间)解。回溯法的基本过程是:①针对所给问题,定义问题的解空间;②确定易于搜索的解空间结构;③以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。利用回溯法解决的经典问题如图的3着色问题和国际象棋的8皇后问题。分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。分支限界法以广度优先或以最小耗费优先的方式搜索解空间树。

上述算法技术适用于不同的问题,对于同一问题,通常解决的方法很多,如何度量不同方法之间的好坏呢?算法在解决实际问题时的复杂程度叫算法复杂度,算法复杂性就是算法解决问题时所需要的计算机资源,计算机资源包括占用处理器的时间和占用存储空间的大小,它们分别称为时间复杂度和空间复杂度,一般来说,问题的规模越大,占用的计算机资源就越大,如果用n是问题的规模(输入大小),那么占用处理器的时间复杂度用T(n)表示,占用存储空间大小的空间复杂度用S(n)表示。

一般而言,T(n)或S(n)是问题的规模n相关的同数量级函数f(n),常见的数量级f(n)有:1,log2n,n,n×log2n,n2,n3,……,n!等。为了表示方便,T(n)或S(n)用同数量级f(n)来表示,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n)),这样常见的时间/空间复杂度为:O(1),O(n),O(n×log2n),O(n2),O(n3),O(n!)等。如快速排序和合并排序这两个排序算法的平均时间复杂度都是O(n×logn),其中n是待排序序列的元素个数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈