ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:928KB ,
资源ID:2728122      下载积分:20 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-2728122.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机算法分析与设计.doc)为本站会员(dreamzhangning)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

计算机算法分析与设计.doc

1、算法是指解决问题的一种方法或一个过程。算法是若干指令的有穷序列,满足性质:(1)输入:有外部提供的量作为算法的输入。(2)输出:算法产生至少一个量作为输出。(3)确定性:组成算法的每条指令是清晰,无歧义的。(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)。分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。1.阶乘函数 阶乘函数可递归地定义为:边界条件递归方程边界条件与

2、递归方程是递归函数的二个要素2.Fibonacci 数列无穷数列 1,1,2,3,5,8,13,21,34,55,称为 Fibonacci 数列。它可以递归地定义为:当一个函数及它的一个变量是由函数自身定义时,称这个函数是双递归函数。Ackerman 函数 A(n,m)定义如下:Ackerman 函数A(n,m) 的自变量 m 的每一个值都定义了一个单变量函数:M=0 时,A(n,0)=n+2M=1 时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2 ,和 A(1,1)=2 故 A(n,1)=2*nM=2 时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A

3、(1,2)=A(A(0,2),1)=A(1,1)=2,故 A(n,2)= 2n 。M=3 时,类似的可以推出M=4 时,A(n,4)的增长速度非常快,以至于没有适当的数学式子来表示这一函数。定义单变量的 Ackerman 函数 A(n)为,A(n)=A(n,n) 。定义其拟逆函数 (n)为: (n)=minkA(k)n 。即 (n) 是使 nA(k) 成立的最小的 k 值。(n)在复杂度分析中常遇到。对于通常所见到的正整数 n,有 (n) 4。但在理论上 (n)没有上界,随着n 的增加,它以难以想象的慢速度趋向正无穷大。6 排列问题设计一个递归算法生成 n 个元素r1,r2,rn的全排列。设

4、R=r1,r2,rn是要进行排列的 n 个元素,Ri=R-ri。集合 X 中元素的全排列记为 perm(X)。(ri)perm(X)表示在全排列 perm(X)的每一个排列前加上前缀得到的排列。R 的全排列可归纳定义如下: 当n=1 时,perm(R)=(r),其中 r 是集合 R 中唯一的元素;当 n1 时,perm(R)由(r1)perm(R1),(r2)perm(R2),(rn)perm(Rn)构成。 7 整数划分问题0)!(!nn10)2()()nFnF1,20),1(),(20,),(mnnA在本例中,如果设 p(n)为正整数 n 的划分数,则难以找到递归关系,因此考虑增加一个自变量

5、:将最大加数 n1 不大于 m 的划分个数记作 q(n,m)。可以建立 q(n,m)的如下递归关系。(3) q(n,n)=1+q(n,n-1);正整数 n 的划分由 n1=n 的划分和 n1n-1 的划分组成。(4) q(n,m)=q(n,m-1)+q(n-m,m),nm1;正整数 n 的最大加数 n1 不大于 m 的划分由 n1=m 的划分和n1n-1 的划分组成。8.Hanoi 塔问题 设 a,b,c 是 3 个塔座。开始时,在塔座 a 上有一叠共 n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为 1,2,n,现要求将塔座 a 上的这一叠圆盘移到塔座 b 上,并仍按同

6、样顺序叠置。在移动圆盘时应遵守以下移动规则:规则 1:每次只能移动 1 个圆盘;规则 2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;规则 3:在满足移动规则 1 和 2 的前提下,可将圆盘移至 a,b,c 中任一塔座上。public static void hanoi(int n, int a, int b, int c) if (n 0) hanoi(n-1, a, c, b);move(a,b);hanoi(n-1, c, b, a); 递归小结:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。缺点:递归算法的运行效率较低,无

7、论是耗费的计算时间还是占用的存储空间都比非递归算法要多。分治法的适用条件分治法所能解决的问题一般具有以下几个特征:1.该问题的规模缩小到一定的程度就可以容易地解决;2.该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质3.利用该问题分解出的子问题的解可以合并为该问题的解;4.该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题

8、分成大小相等的 k 个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。9 二分搜索技术给定已按升序排好序的 n 个元素 a0:n-1,现要在这 n 个元素中找出一特定元素 x。二分搜索算法:public static int binarySearch(int a, int x, int n) / 在 a0 amiddle) left = middle + 1;else right = middle - 1; return -1; / 未找到 x 算法复杂度分析:每执行一次算法的 while 循环

9、, 待搜索数组的大小减少一半。因此,在最坏情况下,while 循环被执行了O(logn) 次。循环体内运算需要 O(1) 时间,因此整个算法在最坏情况下的计算时间复杂性为 O(logn) 。合并排序:基本思想:将待排序元素分成大小大致相同的 2 个子集合,分别对 2 个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 最坏时间复杂度:O(nlogn) 平均时间复杂度:O(nlogn) 辅助空间:O(n)快速排序:最坏时间复杂度: O(n2) 平均时间复杂度:O(nlogn) 辅助空间:O(n)或 O(logn)动态规划算法的基本要素(1)最优子结构性质(2)重叠子问题性质1利

10、用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。2.递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。 备忘录方法备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时

11、查看,避免了相同子问题的重复求解。动态规划基本步骤:1.找出最优解的性质,并刻划其结构特征。2.递归地定义最优值。 3.以自底向上的方式计算出最优值。4.根据计算最优值时得到的信息,构造最优解。动态规划基本思想是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。0/1 背包问题 0/1 背包问题的求解过程一、动态规划函数:物体 被装入背包的情况, 。约束方程和目标函数: 解向i

12、xi 1,0ix Mxwini1 inixpopt1ma量 。背包的载重量: ),(21nxX m:前 个物体中,能装入载重量为 的背包中的物体的最大价值, 。)joptii j j,2动态规划函数: (6.6.1))(0(0joptti(6.6.2) iiiiiii wjpwjoptjt )(),(ax11二、求解过程 1、决策阶段:第一阶段,只装入一个物体,确定在各种不同载重量的背包下,能够得到的最大价值;第二阶段,装入前两个物体,确定在各种不同载重量的背包下,能够得到的最大价值;依此类推,直到第个阶段。n最后, 便是在载重量为 的背包下,装入 个物体时,能够取得的最大价值。)(moptn

13、mn2、解向量的确定从 的值向前倒推。t递推关系式:若 则 (6.6.3))()(1joptjtii0ix若 则 , (6.6.4)jti1i iwj例 6.6 有 5 个物体,其重量分别为 2,2,6,5,4,价值分别为 6,3,5,4,6,背包的载重量为 10,求装入背包的物体及其总价值计算结果,如图 6.7 所示。 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 6 6 6 6 6 6 6 6 6 2 0 0 6 6 9 9 9 9 9 9 9 3 0 0 6 6 9 9 9 9 1 1 14 4 0 0 6 6 9 9 9 10

14、 1 13 14 5 0 0 6 6 9 9 12 12 15 15 15 图 6.7 5 个物体的 0/1 背包问题的例子装入背包的物体为 。1,x0-1 背包问题给定 n 种物品和一背包。物品 i 的重量是 wi,其价值为 vi,背包的容量为 C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?0-1 背包问题是一个特殊的整数规划问题。设所给 0-1 背包问题的子问题的最优值为 m(i,j),即 m(i, j)是背包容量为 j,可选择物品为 i,i+1,n 时 0-1 背包问题的最优值。由 0-1 背包问题的最优子结构性质,可以建立计算 m(i,j)的递归式如下。算法复杂度分析

15、:从 m(i,j) 的递归式容易看出,算法需要 O(nc)计算时间。当背包容量 c 很大时,算法需要的计算时间较多。例如,当 c2n 时,算法需要 (n2n)计算时间。 二叉搜索树(1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;niixv1manixCwini1,0nikkxvakixjxknik,10iii wjjimvwjijim0),1(,a),( nnjvj0),((2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;(3 它的左、右子树也分别为二叉排序树最优二叉搜索树最优二叉搜索树 Tij 的平均路长为 pij,则所求的最优值为 p1,n。由最优二叉

16、搜索树问题的最优子结构性质可建立计算 pij 的递归式如下记 wi,jpi,j 为 m(i,j),则 m(1,n)=w1,np1,n=p1,n 为所求的最优值。计算 m(i,j)的递归式为注意到 可以得到 O(n2)的算法多段图的最短路径问题定义 6.1 有向连通赋权图 ,顶点集合 划分成 个不相交的子集 , , ,使得),(WEVGVkiVki12中的任一边 ,必有 , , 。称为多段图。E),(vuiumiv1令 ,称 为源点, 为收点。1|1kV1skt多段图的最短路径问题,是求从源点 到达收点 的最小花费的通路st一、顶点编号:根据多段图的 个不相交的子集 ,把多段图划分为 段,每一段

17、包含顶点的一个子集。iVk把顶点集合 中的所有顶点,按照段的顺序进行编号。子集中的顶点互不邻接,它们之间的相互顺序无关紧要。顶点个数为 ,顶点 的编号为 0,则收点 的编号为 ,nst1n对 中的任何一条边 ,顶点 的编号小于顶点 的编号。E),(vuuv二、决策过程数组元素 :存放顶点 到达收点 的最小花费cositit数组元素 :存放顶点 到达收点 的最小花费通路上的前方顶点编号pah数组 :存放从源点 出发,到达收点 的最短通路上的顶点编号nrutest第一阶段,确定第 段的所有顶点到达收点 的花费最小的通路。1k第二阶段,用第一阶段的信息,确定第 段的所有顶点到达收点 的花费最小的通路

18、。2kt如此依次进行,直到最后确定源点 到达收点 的花费最小的通路。st最后,从源点 的 信息中,确定它的前方顶点编号 ,spath 1p从 的 信息中,确定 的前方顶点编号 ,1pt12如此递推,直到收点 。t动态规划函数: (6.2.1)cosmincosjtjj(6.2.2)njijpahi 使使三、步骤:1. 对所有的 ,把 初始化为最大值, 初始化为-1; 初始化为 0;2. 令i0, csit ipath1cosnt;3. 根据(6.2.1)式和(6.2.2)式计算 和 ;2ni cos4. ,若 ,转 3;否则,转 5;5. 令 , ;i 0i0irute6. 如果 ,算法结束;

19、否则,转 7;1nroute7. , ;转 6;1i 1iroutepahi例 6.2 求解图 6.3 所示的最短路径问题。min,1,1, jkjkiijkjiji pwwpii jijkji,0)1,( ),(),(, ),()1,(in,1n 1 jmijskjisjki 9 1 4 5 4 8 6 6 7 7 7 8 0 2 5 9 1 6 1 8 8 3 3 4 3 6 5 7 图 6.3 动态规划方法求解多段图的例子: 8i 09coscos89tt 98path: 777: 6i 835,76mincos,min686 ttt 86path: 5 9cscs55 5: 4i ,i

20、,oio447 ttt 4t: 3 14cs363 3:2i 6cos,5cos,o,csincs 262522 ttttt 189,1 3pah: 1i 9,mincs,4omio154 ttt 51path:0 cs,cscs 03020 t3,in 2rute1 pathroutepaho212t 533ttre 84reut 945pathoutpaho最后,得到最短的路径为 0,2,3,5,8,9,费用是 15。贪心算法的基本要素贪心选择性质和最优子结构性质。 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也

21、是贪心算法与动态规划算法的主要区别。动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 最优子结构性质 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。 0-1 背包问题: 给定 n 种物品和一个背包。物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品 i 只有 2 种选择,即装入背包或不

22、装入背包。不能将物品 i 装入背包多次,也不能只装入部分的物品 i。背包问题:与 0-1 背包问题类似,所不同的是在选择物品 i 装入背包时,可以选择物品 i 的一部分,而不一定要全部装入背包,1i n。这 2 类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而 0-1 背包问题却不能用贪心算法求解。 用贪心算法解背包问题的基本步骤: 首先计算每种物品单位重量的价值 Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过 C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,

23、直到背包装满为止。算法 knapsack 的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为O(nlogn) 。当然,为了证明算法的正确性,还必须证明背包问题具有贪心选择性质。最优装载有一批集装箱要装上一艘载重量为 c 的轮船。其中集装箱 i 的重量为 Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。最优装载问题可用贪心算法求解。采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。算法 loading 的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间为 O(nlogn)。哈夫曼编码对每一个字符规定

24、一个 0,1 串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。表示最优前缀码的二叉树总是一棵完全二叉树,即树中任一结点都有 2 个儿子结点。平均码长定义为: 使平均码长达到最小的前缀码编码方案称为给定编码字符集 C 的最优前缀码。构造哈夫曼编码哈夫曼提出构造最优前缀码的贪心算法,由此产生的编码方案称为哈夫曼编码。哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树 T。算法以|C|个叶结点开始,执行 |C|1 次的“合并” 运算后产生最终所要求的树 T。 算法 huffmanTree 用最小堆实现优先队列 Q。初始化优先队列需要 O(n)计算时间,由于最小堆的r

25、emoveMin 和 put 运算均需 O(logn)时间,n1 次的合并总共需要 O(nlogn)计算时间。因此,关于 n 个字符的哈夫曼算法的计算时间为 O(nlogn) 。哈夫曼算法的正确性:要证明哈夫曼算法的正确性,只要证明最优前缀码问题具有贪心选择性质和最优子结构性质。 (1)贪心选择性质 (2)最优子结构性质单源最短路径给定带权有向图 G =(V,E),其中每条边的权是非负实数。另外,还给定 V 中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。算法基本思想:dijkstra 算法是解单源最短路径问题

26、的贪心算法。基本思想是,设置顶点集合 S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合 S 当且仅当从源到该顶点的最短路径长度已知。初始时,S 中仅含有源。设 u 是 G 的某一个顶点,把从源到 u 且中间只经过 S 中顶点的路称为从源到u 的特殊路径,并用数组 dist 记录当前每个顶点所对应的最短特殊路径长度。 Dijkstra 算法每次从 V-S 中取出具有最短特殊路长度的顶点 u,将 u 添加到 S 中,同时对数组 dist 作必要的修改。一旦 S 包含了所有 V中顶点,dist 就记录了从源到所有其它顶点之间的最短路径长度。)()(cdfTBTCcDijkstra 算法的迭代过

27、程: 迭代S u dist2 dist3 dist4 dist5初始 1 - 10 maxint 30 1001 1,2 2 10 60 30 1002 1,2,4 4 10 50 30 903 1,2,4,3 3 10 50 30 604 1,2,4,3,5 5 10 50 30 60计算复杂性:对于具有 n 个顶点和 e 条边的带权有向图,如果用带权邻接矩阵表示这个图,那么 Dijkstra算法的主循环体需要 时间。这个循环需要执行 n-1 次,所以完成循环需要 时间。算法的其余部分所需要时间不超过 。解最短路径的狄斯奎诺(Dijkstra)算法是 中的边, 是边的长度。 划分为两个集合

28、和 : 中所包含的顶点,它们到 的距离已经),(vuEvuc, VSTu确定; 中所包含的顶点,它们到 的距离尚未确定。Tu是从顶点 到顶点 的最短路径中 的前一顶点xpxx1. 置 , ;SV2. ,若 ,则 , ;否则, , ;Eu),(xucd,up)(xud, 1)(xp3. 寻找 ,使得 ,则; 就是 到 的距离;Tt |min, Tt td,4. , ;5. 若 ,算法结束;否则,转 6;6. 对与 相邻接的所有顶点 ,如果 ,直接转 3;否则,令 , ,转t xxtuxc, xtuxcd,tp)(3;例 5.3 在图 5.3 的有向赋权图中,求顶点 到其它所有顶点的距离。如果用邻

29、接表来存放顶点之间的距离,a则邻接表如图 5.4 所示。 b e 1 9 1 2 6 2 4 3 5 a c f h 4 3 4 1 3 7 d g 图 5.3 顶点 a 到其它所有顶点的最短距离的有向赋权图)(2O)(n )(2nOa 0 b 1 c 4 d 4 b 0 c 2 e 9 c 0 d 3 e 6 f 3 g 4 d 0 g 7 e 0 h 1 f 0 e 2 h 5 g 0 f 1 h 3 h 0 图 5.4 图 5.3 中所表示的赋权图的邻接表表 5.1 表示对上面的有向赋权图,执行狄斯奎诺算法时,每一轮循环的执行过程。从顶点 到其它所有顶a点的路径,如图 5.5 所示。 表

30、 5.1 狄斯奎诺算法的执行过程Sbad,c,da,e,fa,gd,ha,td,1 a 1 4 4 1 b2 a,b 3 4 10 3 c3 a,b,c 4 9 6 7 4 d4 a,b,c,d 9 6 7 6 f5 a,b,c,d,f 8 7 11 7 g6 a,b,c,d,f,g 8 10 8 e7 a,b,c,d,f,g,e 9 9 h8 a,b,c,d,f,g,e,h b a c b a d a e f c b a f c b a g c b a h e f c b a 图 5.5 各个顶点到顶点 a 的路径最小生成树 设 G =(V,E)是无向连通带权图,即一个网络。E 中每条边 (

31、v,w)的权为 cvw。如果 G 的子图 G是一棵包含 G 的所有顶点的树,则称 G为 G 的生成树。生成树上各边权的总和称为该生成树的耗费。在 G 的所有生成树中,耗费最小的生成树称为 G 的最小生成树。最小生成树性质:设 G=(V,E)是连通带权图,U 是 V 的真子集。如果(u,v)E,且 uU,v V-U,且在所有这样的边中,(u,v)的权 cuv最小,那么一定存在 G 的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为 MST 性质 。 普里姆(Prim )算法1 1 1 1 3 7 1 3 7 1 3 7 2 5 2 5 2 5 2 3 4 2 3 4 2 3 4 9

32、 8 6 9 8 6 9 6 4 4 8 4 5 6 5 6 5 6 10 10 10 (a) ( b) ( c) 1 1 1 1 7 1 7 1 7 3 3 3 2 5 2 5 2 5 2 3 4 2 3 4 2 3 4 9 6 9 6 9 6 8 4 8 4 8 4 5 6 5 6 5 6 10 10 10 ( d) ( e) ( f) 顶点集为 ,与顶点 , 相关联的边为 ,权用 表示,1,0nV ijjie, jic是最小花费生成树的边集。维护两个顶点集合 和 ,开始时:令 , , 。T SNT0SSVN选取 , ,并且 最小的 和 ; , , 。SiNjjicijj,jie重复上述步

33、骤,直到 为空,或找到 条边为止。n步骤:1 , , ;2. 如果 为空,算法结束;否则,转 3;3. 寻找使 , ,0SV ij并且 最小的 和 ;4. , , ;转 2;jicijjj,jieT图 5.9 普里姆算法的工作过程Prim 算法 设 G=(V,E)是连通带权图,V=1,2,n。构造 G 的最小生成树的 Prim 算法的基本思想是:首先置 S=1,然后,只要 S 是 V 的真子集,就作如下的贪心选择:选取满足条件 iS,jV-S,且 cij最小的边,将顶点 j 添加到 S 中。这个过程一直进行到 S=V 时为止。 在这个过程中选取到的所有边恰好构成 G 的一棵最小生成树。 在上述

34、 Prim 算法中,还应当考虑如何有效地找出满足条件 iS,jV-S,且权 cij最小的边(i,j)。实现这个目的的较简单的办法是设置 2 个数组 closest 和 lowcost。在 Prim 算法执行过程中,先找出 V-S 中使 lowcost 值最小的顶点 j,然后根据数组 closest 选取边(j,closestj),最后将 j 添加到 S 中,并对 closest 和 lowcost 作必要的修改。用这个办法实现的 Prim 算法所需的计算时间为 Kruskal 算法: Kruskal 算法构造 G 的最小生成树的基本思想是,首先将 G 的 n 个顶点看成 n 个孤立的连通分支。

35、将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接 2 个不同的连通分支:当查看到第 k 条边(v,w)时,如果端点 v 和 w 分别是当前 2 个不同的连通分支 T1 和 T2 中的顶点时,就用边(v,w)将 T1 和 T2 连接成一个连通分支,然后继续查看第 k+1 条边;如果端点 v 和 w 在当前的同一个连通分支中,就直接再查看第 k+1 条边。这个过程一直进行到只剩下一个连通分支时为止。 关于集合的一些基本运算可用于实现 Kruskal 算法。 按权的递增顺序查看等价于对优先队列执行 removeMin 运算。可以用堆实现这个优先队列。 对

36、一个由连通分支组成的集合不断进行修改,需要用到抽象数据类型并查集 UnionFind 所支持的基本运算。当图的边数为 e 时,Kruskal 算法所需的计算时间是 。当 时,Kruskal 算法比 Prim 算法差,但当 时,Kruskal 算法却比 Prim 算法好得多。回溯法适用于解一些组合数相当大的问题。)(2nO回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。问题的解向量:回溯法希望一个问题的解

37、能够表示成一个 n 元式(x1,x2,xn)的形式。显约束:对分量 xi 的取值限定。隐约束:为满足问题的解而对不同分量之间施加的约束。解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。生成问题状态的基本方法扩展结点:一个正在产生儿子的结点称为扩展结点活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点死结点:一个所有儿子已经产生的结点称做死结点深度优先的问题状态生成法:如果对一个扩展结点 R,一旦产生了它的一个儿子 C,就把 C 当做新的扩展结点。在完成对子树 C(以 C 为根的子树)的穷尽搜索之后,将 R 重新变成扩展结点,继续生成 R 的下

38、一个儿子(如果存在)宽度优先的问题状态生成法:在一个扩展结点变成死结点之前,它一直是扩展结点回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法回溯法的基本思想(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。常用剪枝函数:用约束函数在扩展结点处剪去不满足约束的子树;用限界函数剪去得不到最优解的子树。子集树与排列树遍历子集树需 O(2n)计算时间 v

39、oid backtrack (int t)if (tn) output(x);elsefor (int i=0;in) output(x);elsefor (int i=t;i=n;i+) swap(xt, xi);if (legal(t) backtrack(t+1);swap(xt, xi); 装载问题有一批共 n 个集装箱要装上 2 艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 wi,且21cwi装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这 2 艘轮船。如果有,找出一种装载方案。容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(

40、1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近。由此可知,装载问题等价于以下特殊的 0-1 背包问题。用回溯法设计解装载问题的 O(2n)计算时间算法。在某些情况下该算法优于动态规划算法。n 后问题解向量:(x1, x2, , xn) 显约束:xi=1,2, ,n隐约束:1)不同列:xixj 2)不处于同一正、反对角线:|i-j|xi-xj|0-1 背包问题解空间:子集树 可行性约束函数:图的 m 着色问题给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 的各顶点着色,每个顶点

41、着一种颜色。是否有一种着色法使 G 中每条边的 2 个顶点着不同颜色。这个问题是图的 m 可着色判定问题。若一个图最少需要 m种颜色才能使图中每条边连接的 2 个顶点着不同颜色,则称这个数 m 为该图的色数。求一个图的色数 m 的问题称为图的 m 可着色优化问题。解向量:(x1, x2, , xn)表示顶点 i 所着颜色 xi 可行性约束函数:顶点 i 与已着色的相邻顶点颜色不重复。复杂度分析图 m 可着色问题的解空间树中内结点个数是对于每一个内结点,在最坏情况下,用 ok 检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时 O(mn)。因此,回溯法总的时间耗费是 连续邮资问题假设国家发行了

42、 n 种不同面值的邮票,并且规定每张信封上最多只允许贴 m 张邮票。连续邮资问题要求对于给定的 n 和 m 的值,给出邮票面值的最佳设计,在 1 张信封上可贴出从邮资 1 开始,增量为 1 的最大连续邮资区间。例如,当 n=5 和 m=4 时,面值为(1,3,11,15,32)的 5 种邮票可以贴出邮资的最大连续邮资区间是 1 到 70。 解向量:用 n 元组 x1:n表示 n 种不同的邮票面值,并约定它们从小到大排列。x1=1 是唯一的选择。 可行性约束函数:已选定 x1:i-1,最大连续邮资区间是1:r ,接下来 xi的可取值范围是xi-1+1:r+1。回溯法效率分析通过前面具体实例的讨论

43、容易看出,回溯算法的效率在很大程度上依赖于以下因素:(1)产生 xk的时间;(2)满足显约束的 xk值的个数;(3)计算约束函数 constraint 的时间;(4)计算上界函数 bound 的时间;(5)满足约束函数和上界函数约束的所有 xk的个数。好的约束函数能显著地减少所生成的结点数。但这样的约束函数往往计算量较大。因此,在选择约束函数时通常存在生成结点数与约束函数计算量之间的折衷。nixcwxininii1,0s.tma111cxwnii分支限界法分支限界法与回溯法(1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,

44、或是在满足约束条件的解中找出在某种意义下的最优解。 (2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 常见的两种分支限界法:(1)队

45、列式(FIFO)分支限界法: 按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 (2)优先队列式分支限界法: 按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。0/1 背包问题 分支限界法解 0/1 背包问题的思想方法和求解过程个物体重量分别为 ,价值分别为 ,背包载重量为n10,nw 10,np M物体按价值重量比递减的顺序,排序后物体序号的集合为 。,0S:选择装入背包的物体集合, :不选择装入背包的物体集合, :尚待选择的物体集合。 、1S2S 3 )(1kS、 :搜索深度为 时的三个集合中的物体。开始时,)(2k)(3k )(1)0(2S1,03n一、分支的选择

46、及处理:比值 最大的物体序号, 。siwp/ 3Ss把物体 装入背包的分支结点,不把物体 装入背包的分支结点。就是集合 中的第一个元素。)(3kS搜索深度为 时,物体 的序号就是集合 中的元素 。s k物体 装入背包的分支结点作如下处理:s)()1(kk)()1(22kS)()1(33kS不把物体 装入背包的分支结点则做如下处理:s)()(11S)()(22)()(33二、上界的确定 :搜索深度为 时,分支结点的背包中物体的价值上界kbk。若: 令 (8.3.1),)(3nk )(1SiiwM0)(kb若: 令:llkikSi xwM1)(1 )(,033kSllx llkiSi pxpkb1)(1((8.3.2)三、求解步骤1. 把物体按价值重量比递减顺序排序;2. 建立根结点 ,令 , , , , ;

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报