关于计算机算法的ppt,计算机算法设计与分析 第9章.ppt

a7f4a3f590493a1e451dd952a488fd7c.gif 计算机算法设计与分析 第9章.ppt

(53页)

69b6b3b81a321bc476eaa9cd1f4f3b9c.gif

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

29.9 积分

*第9章 NP完全性理论与近似算法*学习要点理解RAM,RASP和图灵机计算模型理解非确定性图灵机的概念理解P类与NP类语言的概念 理解NP完全问题的概念理解近似算法的性能比及多项式时间近似格式的概念通过范例学习NP完全问题的近似算法(1)顶点覆盖问题;(2)旅行售货员问题;(3)集合覆盖问题;(4)子集和问题。*9.1 计算模型在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型,包括定义该计算模型中所用的基本运算。建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。3个基本计算模型:随机存取机RAM(Random Access Machine);随机存取存储程序机RASP(Random Access Stored Program Machine)图灵机(Turing Machine)。这3个计算模型在计算能力上是等价的,但在计算速度上是不同的。*9.1.1 随机存取机RAM1、RAM的结构*RAM 基本指令操作数 类型: =i, i, *I指令: 操作数 说明*9.1.1 随机存取机RAM2、RAM程序 一个RAM程序定义了从输入带到输出带的一个映射。可以对这种映射关系作2种不同的解释。解释一:把RAM程序看成是计算一个函数 若一个RAM程序P总是从输入带前n个方格中读入n个整数x1,x2,…,xn,并且在输出带的第一个方格上输出一个整数y后停机,那么就说程序P计算了函数f(x1,x2,…,xn)=y 解释二:把RAM程序当作一个语言接受器。 将字符串S=a1a2…an放在输入带上。在输入带的第一个方格中放入符号a1,第二个方格中放入符号a2,…,第n个方格中放入符号an。然后在第n+1个方格中放入0,作为输入串的结束标志符。如果一个RAM程序P读了字符串S及结束标志符0后,在输出带的第一格输出一个1并停机,就说程序P接受字符串S。P可接受的语言L : P可接受的所有字符串的集合 *f(n) = nn, n>0; 0, otherwise; int f(int r1){ cin>>r1; // 输入 n if(r10) { r2=r2*r1;r3=r3-1; } return r2;}函数计算f(x1,x2,…,xn)=y int accept(void){ int x; int d=0; cin>>x; while(x!=0) { if(x!=1) d--; else d++; cin>>x; } if(d==0) return 1; else return 0;}语言接受器 *f(n) = nn, n>0; 0, otherwise; int f(int r1){ cin>>r1; // 输入 n if(r10) { r2=r2*r1;r3=r3-1; } return r2;}函数计算f(x1,x2,…,xn)=y 相应的RAM程序*9.1.1 随机存取机RAM3、 RAM程序的耗费标准标准一:均匀耗费标准 在均匀耗费标准下,每条RAM指令需要一个单位时间;每个寄存器占用一个单位空间。以后除特别注明,RAM程序的复杂性将按照均匀耗费标准衡量。 标准二:对数耗费标准 对数耗费标准是基于这样的假定,即执行一条指令的耗费与以二进制表示的指令的操作数长度成比例。在RAM计算模型下,假定一个寄存器可存放一个任意大小的整数。因此若设l(i)是整数i所占的二进制位数,则 *复杂性三种类型的操作数的对数耗费*复杂性RAM 指令的对数耗费*9.1.2 随机存取存储程序机RASP1、RASP的结构 RASP的整体结构类似于RAM,所不同的是RASP的程序是存储在寄存器中的。每条RASP指令占据2个连续的寄存器。第一个寄存器存放操作码的编码,第二个寄存器存放地址。RASP指令用整数进行编码。 RASP 指令*9.1.2 随机存取存储程序机RASP2、RASP程序的复杂性 不管是在均匀耗费标准下,还是在对数耗费标准下,RAM程序和RASP程序的复杂性只差一个常数因子。在一个计算模型下T(n)时间内完成的输入-输出映射可在另一个计算模型下模拟,并在kT(n)时间内完成。其中k是一个常数因子。空间复杂性的情况也是类似的。 *9.1.3 图灵机 (Turing machine)*9.1.3 图灵机 根据有限状态控制器的当前状态及每个读写头读到的带符号,图灵机的一个计算步可实现下面3个操作之一或全部。 (1)改变有限状态控制器中的状态。 (2)清除当前读写头下的方格中原有带符号并写上新的带符号。 (3)独立地将任何一个或所有读写头,向左移动一个方格(L)或向右移动一个方格(R)或停在当前单元不动(S)。 k带图灵机可形式化地描述为一个7元组(Q,T,I,δ,b,q0,qf),其中:(1)Q是有限个状态的集合。 (2)T是有限个带符号的集合。(3)I是输入符号的集合,IT。(4)b是唯一的空白符,b∈T-I。(5)q0是初始状态。 (6)qf是终止(或接受)状态。(7)δ是移动函数。它是从QTk的某一子集映射到Q (T{L,R,S})k的函数。 δ(q,a1,a2,..ak)=(q’,(a1’,d1),(a2’,d2), …(ak’,dk))*9.1.3 图灵机 图灵机M的时间复杂性T(n)是它处理所有长度为n的输入所需的最大计算步数。如果对某个长度为n的输入,图灵机不停机,T(n)对这个n值无定义。 图灵机的空间复杂性S(n)是它处理所有长度为n的输入时,在k条带上所使用过的方格数的总和。如果某个读写头无限地向右移动而不停机,S(n)也无定义。 与RAM模型类似,图灵机既可作为语言接受器,也可作为计算函数的装置。 *例子Q={q0,q1,q2,q3,qy,qn};T={0,1,#};I={0,1}#-spaceq0qy : 接受x,停机在状态qy;qn: 拒绝接受x,停机在状态qnδ: (q0,0)→(q0,R) (q0,1)→(q0,R), (q0,#)→(q1,L),(q1,0)→(q2,#) (q1,1)→(q3,#), (q1,#)→(qy,#),(q2,0)→(q3,#) (q2,1)→(qn,#), (q2,#)→(qn,#),(q3,0)→(qy,#) (q3,1)→(qn,#), (q3,#)→(qy,L),*状态*设 输入 x=101000#**问题变换和计算复杂性归约问题A 变换为问题B 问题A的输入变成问题B 的适当输入 解出问题B 将问题B的输出变换问题A的正确解若用O(t(n))完。省略部分。费用就是这2点间的欧氏距离时,费用函数c就具有三角不等式性质。 旅行售货员问题的一些特殊性质:*1 满足三角不等式的旅行售货员问题 对于给定的无向图G,可以利用找图G的最小生成树的算法设计找近似最优的旅行售货员回路的算法。 void approxTSP (Graph g){ (1)选择g的任一顶点r; (2)用Prim算法找出带权图g的一棵以r为根的最小生成树T;O(n2) (3)前序遍历树T得到的顶点表L; (4)将r加到表L的末尾,按表L中顶点次序组成回路H,作为计 算结果返回;} 当费用函数满足三角不等式时,算法找出的旅行售货员回路的费用不会超过最优旅行售货员回路费用的2倍。 *(b)表示找到的最小生成树T;(c)表示对T作前序遍历的次序;(d)表示L产生的哈密顿回路H;(e)是G的一个最小费用旅行售货员回路。 设: H*:图G的最小费用回路H : 图aproxTsp算法最小费用回路 c(H) ≤2c(H*) , c(A)=∑c(u,v) , (u,v) ∈AW: 对T的遍历 c(H) ≤ c(W)=2c(T) ≤ 2c(H*)*2 一般的旅行售货员问题 在费用函数不一定满足三角不等式的一般情况下,不存在具有常数性能比的解TSP问题的多项式时间近似算法,除非P=NP。换句话说,若P≠NP,则对任意常数ρ>1,不存在性能比为ρ的解旅行售货员问题的多项式时间近似算法。 *9.4.4 集合覆盖问题的近似算法 问题描述:给定一个完全无向图G=(V,E),其每一边(u,v)∈E有一非负整数费用c(u,v)。要找出G的最小费用哈密顿回路。 集合覆盖问题的一个实例〈X,F〉由一个有限集X及X的一个子集族F组成。子集族F覆盖了有限集X。也就是说X中每一元素至少属于F中的一个子集,即X= 。对于F中的一个子集CF,若C中的X的子集覆盖了X,即X= ,则称C覆盖了X。集合覆盖问题就是要找出F中覆盖X的最小子集C*,使得 |C*|=min{|C||CF且C覆盖X} *9.4.4 集合覆盖问题的近似算法集合覆盖问题举例:用12个黑点表示集合X。F={S1,S2,S3,S4,S5,S6,},如图所示。容易看出,对于这个例子,最小集合覆盖为:C={S3,S4,S5,}。 *9.4.4 集合覆盖问题的近似算法集合覆盖问题近似算法——贪心算法 算法的循环体最多执行min{|X|,|F|}次。而循环体内的计算显然可在O(|X||F|)时间内完成。因此,算法的计算时间为O(|X||F|min{|X|,|F|})。由此即知,该算法是一个多项式时间算法。 Set greedySetCover (X,F){ U=X; C=; while (U !=) { 选择F中使|S∩U|最大的子集S; U=U-S; C=C∪{S}; } return C; } *9.4.5 子集和问题的近似算法 问题描述:设子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,…,xn}是一个正整数的集合,t是一个正整数。子集和问题判定是否存在S的一个子集S1,使得 。*1 子集和问题的指数时间算法int exactSubsetSum (S,t){ int n=|S|; L[0]={0}; for (int i=1;i<=n;i++) { L[i]=mergeLists(L[i-1],L[i-1]+S[i]); 删去L[i]中超过t的元素; } return max(L[n]);}算法以集合S={x1,x2,…,xn}和目标值t作为输入。算法中用到将2个有序表L1和L2合并成为一个新的有序表的算法mergeLists(L1,L2)。 *2 子集和问题的完全多项式 时间近似格式 基于算法exactSubsetSum,通过对表L[i]作适当的修整建立一个子集和问题的完全多项式时间近似格式。 在对表L[i]进行修整时,用到一个修整参数δ,0<δ<1。用参数δ修整一个表L是指从L中删去尽可能多的元素,使得每一个从L中删去的元素y,都有一个修整后的表L1中的元素z满足(1-δ)y≤z≤y。可以将z看作是被删去元素y在修整后的新表L1中的代表。 举例:若δ=0.1,且L=〈10,11,12,15,20,21,22,23,24,29〉,则用δ对L进行修整后得到L1=〈10,12,15,20,23,29〉。其中被删去的数11由10来代表,21和22由20来代表,24由23来代表。 *2 子集和问题的完全多项式 时间近似格式对有序表L修整算法List trim(L,δ){ int m=|L|; L1=〈L[1]〉; int last=L[1]; for (int i=2;i<=m;i++) { if (last=t)L2=L2=L2=L3=L3=L3=L4=L4=L4= z=302, 而最优解104+102+101=307, 误差2%算法的复杂性: T(n)=O(n2/ ε)*课后作业习题 9-6,9-7,9-4,9-5,9-9,9-16*期末安排:12月5,7日 (周一)(周三)复习12月12日 (周一) 答疑12月14日 (周三)上机测试。12月19日 (周一) 答疑12月21日 (周三)考试。时间: 3:00-5:00 pm 地点: 数学楼202 关 键 词: 分析 算法 设计 计算机

4d91c43bfc72ca913299809b07b4968f.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值