以背包问题为例课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《以背包问题为例课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 背包 问题 课件
- 资源描述:
-
1、目录10.1算法分析技术算法分析技术 10.1.1 空间代价分析空间代价分析 10.1.2 时间代价分析时间代价分析10.2算法设计技术算法设计技术 10.2.1 分治法分治法 10.2.2 贪心法贪心法 10.2.3 动态规划法动态规划法 10.2.4 回溯法回溯法 10.2.5 分枝界限法与分枝界限法与0/1背包问题背包问题*10.1 算法分析技术评价一个算法的代价,主要看执行算法时所需要占用的计算机空间的大小和计算过程需要花费的计算机CPU时间的多少。算法的分析主要包含时间和空间两个方面。10.1.1 空间代价分析根据算法执行过程中对存储空间的使用方式,可以把对算法空间代价分析分成两种:
2、静态分析和动态分析。一个算法静态使用的存储空间,称为静态空间。静态分析的方法比较容易,只要求出算法中使用的所有变量的空间,再折合成多少空间存储单位即可。静态分析例例10.1直接插入排序的空间代价分析(参看算法8.1)被排序的记录的个数决定了问题的规模。被排序的对象在调用函数中申请,并用一个指针变量pvector传递给被调函数,空间大小显然是O(n);在排序程序中,算法以静态方式定义了两个整型变量i和j、一个存储插入元素的临时变量temp,所以在算法中分配的空间为一个 常量,记为O(1)(对于常量c而言,O(c)与O(1)为相同复杂度)。动态分析动态分析一个算法在执行过程中,必须以动态方一个算法
3、在执行过程中,必须以动态方式分配的存储空间是指在算法执行过程式分配的存储空间是指在算法执行过程中才能分配的空间称为动态空间。中才能分配的空间称为动态空间。动态空间的确定主要由两种情况构成:(1)函数的递归;(2)执行动态分配函数。对于递归函数而言,由于每次调用需要分配不同的运行空间,所以递归函数的空间代价,不能简单地采用静态分析方法。假设静态分析一个递归函数的空间代价为一个常量c,如果递归深度为(h的大小依赖于程序的动态执行),动态空间代价应该为C*h。函数的递归调用例例10.2 快速排序(参看算法8.8)对函数静态分析的空间与待排序记录的个数无关,为一常量。递归深度最大等于,这时动态空间代价
4、为O(n);若每次都选较短的部分先处理,则递归深度不会超过log2n,这时动态空间代价即为O(log2n)。一个函数(或过程)如果使用了malloc和free函数,malloc和free所开辟、释放的空间只能在算法执行过程中加以确定,这些空间属于动态空间。下面的讨论中,假设每次分配的空间与问题规模无关,只是一个常数C。执行动态分配函数没有使用free函数 动态空间代价为O(k),k为使用malloc的次数(包括在循环和递归调用中动态执行的次数)。分如下两种情况讨论:使用使用free函数函数 设free使用次数为j。令:0,pi(i=1.j)为第i-1次使用free和次使用free之间 执行ma
5、lloc的次数。用公式i=i-1+p i-1 可以计算出在第i-1次使用free和第i次使用free(i=1.j)之间使用的最大动态空间数。再定义j如下:于是整个算法使用的动态空间代价为:使用。无后次使用若第使用;有后次使用若第malloc,freej,jmalloc,freej,1jj)Cmax(Oiji1例例10.3 一个算法执行过程中malloc和free顺序为(代表malloc,代表free)。,jj0=,1,2,3,4,5,6,7。3max71iiC10.1.2 时间代价分析时间代价分析 算法的执行时间绝大部分花在循环和递归上。循环循环语句的时间代价一般用以下三条原则分析:()对于一
6、个循环,循环次数乘以每次执行简单语句的数目即为其时间代价。()对于多个并列循环,可先计算每个循环的时间代价,然后按大表示法的加法规则计算总代价。()对于多层嵌套循环,一般可按大表示法的乘法规则计算。但如果嵌套是有条件的,为精确计算其时间代价,要仔细累加循环中简单语句的实际执行数目,以确定其时间代价。例例10.510.5求带权图中每一对结点之间的最短路径的算法的时间代价(参看算法9.7)。解 问题规模:带权图顶点数目为。算法中共有五个循环,前两个循环与后三个是并列关系。前两个循环是嵌套关系,后三个之间也是嵌套关系。最内层循环的时间代价为一常数C,则前两个循环时间代价为:后三个循环时间代价为:所以
7、总的时间代价为O(n3)。ninjnOC112;)(ninjnknOC1113)(。例例10.6 为实现无回溯的匹配,而要计算模式串的NEXT数组算法的时间代价(参看算法3.8)。问题规模:模式串长度。从形式上来看,这是一个二重循环,每重循环最多执行m次,最大运行时间可能达到O(m2)。仔细分析:因为每执行一次外层(第4行)循环,i严格增1(第6行),所以外层循环正好执行m1次;但是,k的值从(第2行)-1开始,k+恰好执行(第6行)m1次,并且只有在这一语句中k被增值。而在内层循环(第5行)中,语句knextk至少使k减少1,整个算法中,这个语句的执行次数累计起来不可能超过m1次(否则,k将
8、小于-1,这是不可能的),所以内层循环总的执行次数最大为m1。因此算法3.8的执行时间为O(m)。递归对于递归算法,一般可把时间代价表示为一个递归方程。解这种递归方程最常用的方法是进行递归扩展,通过层层递归,直到递归出口,然后再进行化简。例如例如,有某递归算法,当n=1时是递归出口,执行的时间是一个常量;当n1时,可以把问题分解成a(a=1)个子问题的递归计算,每个子问题的规模是原来问题的b(b=1)分之一;分解问题和合并子问题解的花费为d(n)。整个问题的时间代价可以表示为下面一类递归方程的计算:。为正常数)b(a,(n)dT(n/b)aT(n)1;T(1)递归扩展过程如下:10223322
9、2222)/()/()()/()/()/()()/()/()/()()/()/()()/()/()()/()(ijjjiibndabnTandbnadbndabnTandbnadbndbnaTandbnadbnTandbndbnaTandbnaTnT设k,则又设d(x)为“积性函数”:d(x*y)=d(x)*d(y)1k0jjkjkk)b(daa)n(T,1)1(T)b/n(T则有:1)()(1)(1)()()()()()()(101010bdabdabdabdabdbdabdabdbdabdakkkkkjjkkjjkjkjjkj时当以下分三种情况讨论:(1)d(b),则 kkkaO1)b(d
10、a)b(d(a)n(O)n(O)a(O)a(O)a(O)a(O)a(O)a(O)n(Talogblog1blog1nlogblognlognlogkkkbaaaaab(2)d(b),则),)b(d(O1)b(da)b(d(akkk)n(O)b(d(O)b(d(O)a(O)n(T)b(dlogkkkb(3)d(b),则,kaa)b(d(ak1k0j1k0jkjkj)nn(logO)ka(O)ka(O)a(O)n(Talogbkkkb例例10.810.8求快速排序法的时间代价。此算法的递归方程可表示为:T(n)T(n/2)n,这里,d(x)是积性函数。因为d(b),所以 结论与8.4节所得结果一样
11、。)log()(log)(22log22nnOnnOnT10.2 10.2 算法设计技术算法设计技术 10.2.1分治法分治法分治法(Divide and Conquer)是把一个规模为的问题分成两个或多个较小的与原问题类型相同的子问题,通过对子问题的求解,并把子问题的解合并起来从而构造出整个问题的解,即对问题分而治之。如果子问题的规模仍然相当大,可以对此子问题重复地应用分治策略。分治法的算法框架return_type d_and_c(objArray*p,int i,int j)int temp;if(simple(p,i,j)return solve(p,i,j);/*基值处理*/temp
12、=divide(p,i,j);/*分解问题*/return(combine(d_and_c(p,i,temp-1),d_and_c(p,temp,j);/*递归调用与合并处理*/例子二分法检索就是我们所学过的应用分治策略的典型的例子。快速排序算法,归并排序算法、梵塔问题等都可以用分治策略求解。快速排序算法每趟把一个元素放入排完序后它所应在的位置,这个位置把原表分成了两个宏观有序的子表;归并排序算法是把规模为的问题分成规模为n/2的两个子问题;而梵塔问题分原问题为两个规模为n-1的子问题。讨论分治策略把问题分成若干个子问题,分成的子问题的数目一般不大。如果每次分成的各子问题的规模相等或近乎相等的
13、话,则分治策略的效率较高,否则效率就比较低。例如:直接插入排序(算法8.1)可以看作是把原问题分解成两个子问题,一个是规模为的问题,另一个是规模为n-1的问题,算法的时间代价是O(n)级的。而归并排序把原问题分成了两个大小为n/2的问题,算法的时间代价是O(nlog2n)级的。10.2.2贪心法贪心法求着色问题近似解的贪心法贪心法(greedy)其基本思想为:先用一种颜色给尽可能多的结点上色,然后再用另一种颜色在未着色的结点中给尽可能多的结点上色,如此反复直到所有结点都被着色为止。Dijkstra的最短路径算法 求从源点到其它各结点的最短路径 它总是从那些最短路径还不知道的结点中挑选一个到源点
14、最近的结点。另一采用贪心策略的算法是Kruskal的求最小生成树算法背包问题:给定个物体和一个背包,已知物体的重量为i,价值为pi,背包能容纳物体的重量为。要求确定一组分数i(i),能够把物体的i部分放入背包,使得 最大(即将尽量多的价值装入背包)。n1iiixp因为:p/w25/181.38,p/w24/151.6,p3/w315/101.5,p/wp/wp/w。所以首先把物品2全部放入背包,然后考虑物品3,最后如果还有余地考虑物品1。这样得到的结果为(x,x2,x3)(0,1,1/2),例如:3,20,(p1,p2,p3)=(25,24,15),(w1,w2,w3)=(18,15,10)解
15、背包问题的贪心算法的实现:其中参数数组其中参数数组p和和w中中,按按pi/wi的降序分别存放物体的价格和重量;的降序分别存放物体的价格和重量;m是背包是背包能放的物体总重量,能放的物体总重量,n是物体件数。是物体件数。x存放解向量。存放解向量。float knapSack(float*p,float*w,float*x,float m,int n)int i=0;float s=0;while(in&pim)m-=wi;s+=pi;xi=1;i+;if(i0)s+=pi*m/wi;xi=m/wi;i+;for(;in;i+)xi=0;return(s);讨论贪心法在各个阶段,选择那些在某些意义
16、下是局部最优的方案,但不是每次都能成功地产生出一个整体最优解。仍然以着色问题为例,如果要着色的图如图10.1所示,采用贪心法,并且按a、b、c、d、e的顺序处理,得到的结果则需要三种不同的颜色:第一种颜色着a和b,第二种颜色着c和d,剩下的e还需要一种颜色才行。对某些问题,如果只要求得一个与最优解相差不多的次优解就满足要求时,选用贪心法可以帮助我们很快地得到这样的解。a e c d b 10.2.3 动态规划法动态规划法有些问题常常在分解时会产生大量的子问题,同时子问题界限不清,互相交叉,因而可能重复多次解同一个子问题。解决这种重复的方法:可以在得到每个子问题的解(包括其子子问题的解)时,把解
展开阅读全文