您好,欢迎来到独旅网。
搜索
您的当前位置:首页计算机算法设计五大常用算法的分析及实例

计算机算法设计五大常用算法的分析及实例

来源:独旅网
摘要

算法(Algorithm)是指解题方而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。

其中最常见的五中基本算法是递归与分治法、动态规划、贪心算法、回溯法、分支限界法。本文通过这种算法的分析以及实例的讲解,让读者对算法有更深刻的认识,同时对这五种算法有更清楚认识

关键词: 算法, 递归与分治法、动态规划、贪心算法、回溯法、分支限界法

1

Abstract

Algorithm is the description to the problem solving scheme ,a set of clear instructions to solve the problem and represents the describe the strategy to solve the problem using the method of system mechanism . That is to say, given some confirm import,the Algorithm will find result In a limited time。If an algorithm is defective or is not suitable for a certain job, it is invalid to execute it. Different algorithms have different need of time or space, and it's efficiency are different.

There are most common algorithms: the recursive and divide and conquer、dynamic programming method、greedy algorithm、backtracking、branch and bound method.According to analyze the five algorithms and explain examples, make readers know more about algorithm , and understand the five algorithms more deeply.

Keywords: Algorithm, the recursive and divide and conquer, dynamic

programming method, greedy algorithm、backtracking, branch and bound method

2

目录

1. 前言 .................................................................................................................................... 4 1.1 论文背景 ........................................................................................................................ 4 2. 算法详解 ............................................................................................................................ 5 2.1 算法与程序 .................................................................................................................. 5 2.2 表达算法的抽象机制 .................................................................................................. 5 2.3 算法复杂性分析 .......................................................................................................... 5 3.五中常用算法的详解及实例 ............................................................................................. 6 3.1 递归与分治策略 ............................................................................................................ 6 3.1.1 递归与分治策略基本思想 ......................................................................................... 6 3.1.2 实例——棋盘覆盖 ...................................................................................................... 7 3.2 动态规划 .......................................................................................................................... 8 3.2.1 动态规划基本思想 ..................................................................................................... 8 3.2.2 动态规划算法的基本步骤 ......................................................................................... 9 3.2.3 实例——矩阵连乘 ..................................................................................................... 9 3.3 贪心算法 ........................................................................................................................ 11 3.3.1 贪心算法基本思想 ................................................................................................... 11 3.3.2 贪心算法和动态规划的区别 ................................................................................... 12 3.3.3 用贪心算法解背包问题的基本步骤: ................................................................... 12 3.4 回溯发 ............................................................................................................................ 13 3.4.1 回溯法基本思想 ....................................................................................................... 13 3.3.2 回溯发解题基本步骤 ............................................................................................... 13 3.3.3 实例——0-1背包问题 ............................................................................................. 14 3.5 分支限界法 ................................................................................................................... 15 3.5.1 分支限界法思想 ....................................................................................................... 15 3.5.2 实例——装载问题 ................................................................................................... 16 总结 ......................................................................................................................................... 18 参考文献 ................................................................................................................................. 18

3

1. 前言

1.1 论文背景

算法(Algorithm)是指解题方而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。

一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。计算机的有限资源促使人们关注程序的执行性能,进而催生了计算机算法这一研究领域。自上世纪60年始至今,已出现了大量解决不同问题的有效算法。由于属于同一问题类的不同问题之间具有相似性,其解决算法也具有一定的共性,因此产生了一般的算法设计技术,如递归技术、分治、动态规划、贪心、图的遍历、回溯、分支限界等。掌握算法、分析算法、将算法应用到其他领域、创造更高效的算法,是对每一个计算机学着的基本要求。

本文主要分析五中常用的算法(递归与分治法、动态规划、贪心算法、回溯发、分支限界发),以及对相应算法的实例详细讲解。通过对五中常用算法的单独讲解、综合对比,分析出各种算法的特点以及适用领域,最后列举相应的算法实例,让读者对这五中常用算法有更深的了解。

4

2. 算法详解

2.1 算法与程序

算法:是满足下述性质的指令序列。

• 输入:有零个或多个外部量作为算法的输入。 • 输出:算法产生至少一个量作为输出。

• 确定性:组成算法的每条指令清晰、无歧义。 • 有限性:算法中每条指令的执行次数有限,执行

每条指令的时间也有限。

程序:

是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)即有限性。

2.2 表达算法的抽象机制

1.从机器语言到高级语言的抽象 高级程序设计语言的主要好处是:

(1)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需 要几周时间的培训就可以胜任程序员的工作;

(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计 出来的程序可读性好,可维护性强,可靠性高;

(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而 所写出来的程序可植性好、重用率高 2.抽象数据类型

抽象数据类型是算法的一个数据模型连同定义在该模型上 并作为算法构件的一组运算。

抽象数据类型带给算法设计的好处有: (1)算法顶层设计与底层实现分离;

(2)算法设计与数据结构设计隔开,允许数据结构自由选择;

(3)数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; (4)用抽象数据类型表述的算法具有很好的可维护性; (5)算法自然呈现模块化;

(6)为自顶向下逐步求精和模块化提供有效途径和工具;

(7)算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。

2.3 算法复杂性分析

算法复杂性是算法运行所需要的计算机资源的量,需要时间资源的量称为 时间复杂性,需要的空间资源的量称为 空间复杂性。这个量应该只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示复杂性,那么,应

5

该有C=F(N,I,A)。一般把时间复杂性和空间复杂性分开,并分别用T和S来 表示,则有:T=T(N,I)和S=S(N,I)。一般只考虑最坏情况、最好情况和平均情况下的复杂度。

3.五中常用算法的详解及实例

3.1 递归与分治策略

3.1.1 递归与分治策略基本思想

任何一个可以用计算机求解的问题所需要的计算时间都与其规模有关,问题的规模越小,解题所需的时间往往越少,从而比较容易处理,但想直接解决一个较大的问题,有时是相当困难的。分治法的设计思想,是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。分解出来的子问题都可解,并且利用这些子问题的解求出原问题的解,那么这种分治法是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复使用分治手段,可以使子问题与原问题类型一致而规模却不断减小,最终使子问题缩小到很容易求出其解。这样就自然导致递归算法的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计中,并由此产生许多高效算法。

图3.1 递归与分治策略基本思想

其中,|P|表示问题P的规模,n0为一阀值,表示问题P的规模不超过n0,问题已容易求解,不再分解。Adhoc(P)是该分治法中的基本算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时,直接用算法Adhoc(P)求解。算法Merge(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1,P2,P3,…,Pk合并为P的解。

6

3.1.2 实例——棋盘覆盖

(1):问题描述

在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格,显然,特殊方格在棋盘中出现的位置有4k种情形,因而就有 种不同的棋盘(如图3.2)。

图3.2 4×4棋盘格式

棋盘覆盖问题要求用如图3.3所示的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

图3.3 4中L型骨牌 (2):算法实现

棋盘覆盖问题中数据结构的设计:

①棋盘:用二维数组Board[size][size]表示一个棋盘, Board[0][0]是棋盘的左上角方格。其中size=2k。为了在递归处理的过程中使用同一个棋盘,将数组Board设为全局变量;

②子棋盘:在棋盘数组Board[size][size]中,由子棋盘左上角的下标tr、tc和棋盘边长s表示;

③特殊方格:用Board[dr][dc]表示,dr和dc是该特殊方格在棋盘数组Board中的下标;

④L型骨牌:一个4k的棋盘中有一个特殊方格,所以用到L型骨牌的个数为( -1)/3将所有L型骨牌从1开始连续编号,用一个全局整型变量tile表示,其初始值为0。

算法的输入参数是:

tr:棋盘左上角方格的行号

7

tc:棋盘左上角方格的列号 dr:特殊方格所在的行号 dc:特殊方格所在的列号 (3)算法详细实现

图3.4 棋盘覆盖算法

本算法的时间复杂度为T(K)=O(4k),需要骨牌个数为(4k-1)/3,是一个在渐进意义下的最优算法。

3.2 动态规划

3.2.1 动态规划基本思想

动态规划过程中,每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态

8

保存在一个二维数组中。与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。能采用动态规划求解的问题的一般要具有3个性质:

① 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

② 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

③有重叠子问题:即子问题之间是不的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

3.2.2 动态规划算法的基本步骤

动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。

初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。

实际应用中可以按以下几个简化的步骤进行设计: (1)分析最优解的性质,并刻画其结构特征。 (2)递归的定义最优解。

(3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值

(4)根据计算最优值时得到的信息,构造问题的最优解

3.2.3 实例——矩阵连乘

(1)问题描述

9

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…,n 。考察这n个矩阵的连乘积A1A2…An由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积

(2)算法设计

①.分析最优解的结构

设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的结构特征。我们将矩阵连乘积AiAi+1....Aj简记为A[ i : j ]。考察计算A[ 1: n]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k②.建立递归关系

设计动态规划算法的第二步就是递归地定义最优值。对于矩阵连乘积的最有计算次序问题,设计算A[ i : j ], 1<=i<=j<=n,所需的最少数乘次数为m[ i ][ j ],则原问题的最优值为m[ 1 ][ n]。

当i=j时,A[ i ; j ]=Ai,为单一矩阵,无需计算,因此m[ i ][ i ]=0。 当i < j时,可以利用最优子结构的性质来计算m[ i ][ j ]。事实上,若计算A[ i : j ]的最优次序在Ak和Ak+1之间断开,i<=k当i=j m[ i ][ j ] = 0

当i③.计算最优值

根据计算m[ i ][ j ]的递归式,容易写一个递归算法计算m[ 1 ][ n ]。但是简单地递归将好费指数计算时间。在递归计算时,许多子问题被重复计算多次。这也是该问题可以用动态规划算法求解的又一显著特征。用动态规划算法解决此问题,可依据其递归是以自底向上的方式进行计算。在计算的过程中,保存以解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算 。

(3)详细实现:

10

图3.5 矩阵连乘算法

3.3 贪心算法

3.3.1 贪心算法基本思想

顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质。

①贪心选择性质

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

②最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特

11

征。

3.3.2 贪心算法和动态规划的区别

贪心算法和动态规划算法都要求问题具有最优子结构性质,这是2类算法的一个共同点。但是,对于具有最优子结构的问题应该选用贪心算法还是动态规划算法求解?是否能用动态规划算法求解的问题也能用贪心算法求解?下面研究2个经典的组合优化问题,并以此说明贪心算法与动态规划算法的主要差别。

0-1背包问题:

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。

背包问题:

与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n。

这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。

3.3.3 用贪心算法解背包问题的基本步骤:

首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。 图3.5 背包问题算法 12

算法knapsack的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为 O(nlogn)。

3.4 回溯发

3.4.1 回溯法基本思想

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

解问题P的最朴素的方法就是枚举法,即对E中的所有n元组逐一地检测其是否满足D的全部约束,若满足,则为问题P的一个解。但显然,其计算量是相当大的。在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,…,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。

3.3.2 回溯发解题基本步骤

(1)针对所给问题,定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 两个常用的剪枝函数:

(1)约束函数:在扩展结点处减去不满足约束的子数 (2)限界函数:减去得不到最优解的子树

用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点

13

到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))。而显式地存储整个解空间则需要O(2^h(n))或O(h(n)!)内存空间。

有递归回溯和迭代回溯。回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。

3.3.3 实例——0-1背包问题

0—1背包问题是一个子集选取问题,适合于用子集树表示0—1背包问题的解空间。在搜索解空间树是,只要其左儿子节点是一个可行结点,搜索就进入左子树,在右子树中有可能包含最优解是才进入右子树搜索。否则将右子树剪去。 图3.6 背包问题的解空间书

图3.7算法核心代码

14

3.5 分支限界法

3.5.1 分支限界法思想

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

(1):常见的两种分支限界法 (1)队列式(FIFO)分支限界法

按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法

按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 (2):分支限界法与回溯法的不同

①求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

②搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

(3):分支限界法的设计思路

设求解最大化问题,解向量为X=(x1,…,xn),xi的取值范围为Si,|Si|=ri。在使用分支限界搜索问题的解空间树时,先根据限界函数估算目标函数的界[down, up],然后从根结点出发,扩展根结点的r1个孩子结点,从而构成分量x1的r1种可能的取值方式。

对这r1个孩子结点分别估算可能的目标函数bound(x1),其含义:以该结点为根的子树所有可能的取值不大于bound(x1),即:

bound(x1)≥bound(x1,x2)≥…≥ bound(x1,…,xn)

若某孩子结点的目标函数值超出目标函数的下界,则将该孩子结点丢弃;否则,将该孩子结点保存在待处理结点表PT中。

再取PT表中目标函数极大值结点作为扩展的根结点,重复上述。 直到一个叶子结点时的可行解X=(x1,…,xn),及目标函数值bound(x1,…,xn)。

15

3.5.2 实例——装载问题

(1):问题描述

有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船上,其中集装箱i的重量为wi,且w1+w2+...+wn <= c1+c2; 装载问题要求确定,是否有一个合理的装载方案可将这n个集装箱装上2艘轮船。如果有,找出一种装载方案。 例如,当n=3,c1=c2=50,且w=[10,40,40]时,可将集装箱1和集装箱2装上一艘轮船,而将集装箱3装在第二艘轮船;如果=[20,40,40],则无法将这3个集装箱都装上轮船。当w1+w2+...+wn = c1+c2时,装载问题等价于子集和问题。当c1=c2,且w1+w2+...+wn = 2c1时,装载问题等价于划分问题。即使wi,i=1,2,...,n为整数,c1和c2也是整数。子集和问题与划分问题都是NP难的。由此可知,装载问题也是NP难的。容易证明,如果一个给定的装载问题有解,则采用下面的策略可以得到最优装载方案。

① 首先将第一艘轮船尽可能装满。 ②然后将剩余的集装箱装上第二艘轮船。 (2) 算法实现

图3.8 装载问题算法

16

算法MaxLoading的计算时间和空间复杂度为O(2n).

17

总结

算法是程序设计的灵魂,本文通过对常见五中算法(递归与分治理、动态

规划、贪心算法、回溯发、分支限界发)的系统分析和实例讲解,让本人对算法的设计和分析有了生科的体会,同时更深刻地了解了五中常见的算法。在论文结束之时,回顾一下此次设计的过程,有许多的感慨。由于此次设计主要是在校内进行的,在设计的过程中得到了导师和同学以及论坛上朋友的大量的帮助,从而能顺利的完成该设计。在这个过程中令我受益匪浅,特在此表示衷心的感谢!同时还要尤其感谢我的指导老师的悉心指导,为我的设计提供科学的指导和分析,同时也为我提供第一手的研究资料,使我在设计的过程中能够迅速解决难题,再次表示衷心的感谢!

参考文献

[1] 王晓东编著. 计算机算法设计与分析.北京市 电子工业出版社,2001.1 [2] 郑丽英等编著.算机算法设计与分析. 北京市 国铁道出版社,2009.6

18

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- dcrkj.com 版权所有 赣ICP备2024042791号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务