第15讲 NP完全性理论与近似算法 欢迎辞.

Slides:



Advertisements
Similar presentations

Advertisements

一、 一阶线性微分方程及其解法 二、 一阶线性微分方程的简单应用 三、 小结及作业 §6.2 一阶线性微分方程.
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
第八章 第四节 机动 目录 上页 下页 返回 结束 一个方程所确定的隐函数 及其导数 隐函数的微分法.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
复习: :对任意的x∈A,都有x∈B。 集合A与集合B间的关系 A(B) A B :存在x0∈A,但x0∈B。 A B A B.
复杂性理论.
第三章 函数逼近 — 最佳平方逼近.
《高等数学》(理学) 常数项级数的概念 袁安锋
§1 线性空间的定义与性质 ★线性空间的定义 ★线性空间的性质 ★线性空间的子空间 线性空间是线性代数的高等部分,是代数学
第一章 行列式 第五节 Cramer定理 设含有n 个未知量的n个方程构成的线性方程组为 (Ⅰ) 由未知数的系数组成的n阶行列式
最大团问题 回溯法应用 作者:余新华 时间:
一、原函数与不定积分 二、不定积分的几何意义 三、基本积分公式及积分法则 四、牛顿—莱布尼兹公式 五、小结
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
2-7、函数的微分 教学要求 教学要点.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
非线性反馈移位寄存器探讨 戚文峰.
第二章 矩阵(matrix) 第8次课.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
走进编程 程序的顺序结构(二).
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
计算机数学基础 主讲老师: 邓辉文.
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
第一章 函数 函数 — 研究对象—第一章 分析基础 极限 — 研究方法—第二章 连续 — 研究桥梁—第二章.
What have we learned?.
逆向工程-汇编语言
动态规划(Dynamic Programming)
使用矩阵表示 最小生成树算法.
第八模块 复变函数 第二节 复变函数的极限与连续性 一、复变函数的概念 二、复变函数的极限 二、复变函数的连续性.
无向树和根树.
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
第一章 函数与极限.
数列.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
Partial Differential Equations §2 Separation of variables
第二十二章 曲面积分 §1 第一型曲面积分 §2 第二型曲面积分 §3 高斯公式与斯托克斯公式.
实数与向量的积.
顺序表的删除.
模型分类问题 Presented by 刘婷婷 苏琬琳.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
复习.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
正切函数的图象和性质 周期函数定义: 一般地,对于函数 (x),如果存在一个非零常数T,使得当x取定义域内的每一个值时,都有
定理21.9(可满足性定理)设A是P(Y)的协调子集,则存在P(Y)的解释域U和项解释,使得赋值函数v(A){1}。
第16讲 相似矩阵与方阵的对角化 主要内容: 1.相似矩阵 2. 方阵的对角化.
§8.3 不变因子 一、行列式因子 二、不变因子.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
1.2 子集、补集、全集习题课.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
树和图 tree and graph 蔡亚星.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
学习任务三 偏导数 结合一元函数的导数学习二元函数的偏导数是非常有用的. 要求了解二元函数的偏导数的定义, 掌握二元函数偏导数的计算.
第七、八次实验要求.
上杭二中 曾庆华 上杭二中 曾庆华 上杭二中 曾庆华.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
§2 方阵的特征值与特征向量.
算法基础课程大纲.
第三章 从概率分布函数的抽样 (Sampling from Probability Distribution Functions)
§4.5 最大公因式的矩阵求法( Ⅱ ).
第二次课后作业答案 函数式编程和逻辑式编程
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
9.3多项式乘多项式.
Presentation transcript:

第15讲 NP完全性理论与近似算法 欢迎辞

学习要点 理解RAM,RASP和图灵机计算模型 理解非确定性图灵机的概念 理解P类与NP类语言的概念 理解NP完全问题的概念 理解近似算法的性能比及多项式时间近似格式的概念 通过范例学习NP完全问题的近似算法 (1)顶点覆盖问题; (2)旅行售货员问题; (3)集合覆盖问题; (4)子集和问题。

15.1 计算模型 在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型,包括定义该计算模型中所用的基本运算。 15.1 计算模型 在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型,包括定义该计算模型中所用的基本运算。 建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。 3个基本计算模型: 随机存取机RAM(Random Access Machine); 随机存取存储程序机RASP(Random Access Stored Program Machine) 图灵机(Turing Machine)。 这3个计算模型在计算能力上是等价的,但在计算速度上是不同的。

15.1.1 随机存取机RAM 1、RAM的结构

2、RAM程序 15.1.1 随机存取机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。

3、 RAM程序的耗费标准 15.1.1 随机存取机RAM 标准一:均匀耗费标准 在均匀耗费标准下,每条RAM指令需要一个单位时间;每 性将按照均匀耗费标准衡量。 标准二:对数耗费标准 对数耗费标准是基于这样的假定,即执行一条指令的耗费 与以二进制表示的指令的操作数长度成比例。在RAM计算模型下, 假定一个寄存器可存放一个任意大小的整数。因此若设l(i)是整 数i所占的二进制位数,则

1、RASP的结构 2、RASP程序的复杂性 15.1.2 随机存取存储程序机RASP RASP的整体结构类似于RAM,所不同的是RASP的程序是存 储在寄存器中的。每条RASP指令占据2个连续的寄存器。第一个 寄存器存放操作码的编码,第二个寄存器存放地址。RASP指令用 整数进行编码。 2、RASP程序的复杂性 不管是在均匀耗费标准下,还是在对数耗费标准下,RAM 程序和RASP程序的复杂性只差一个常数因子。在一个计算模型下 T(n)时间内完成的输入-输出映射可在另一个计算模型下模拟, 并在kT(n)时间内完成。其中k是一个常数因子。空间复杂性的情 况也是类似的。

15.1.3 图灵机

15.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的函数。

15.1.3 图灵机 与RAM模型类似,图灵机既可作为语言接受器,也可作为计算函数的装置。 图灵机M的时间复杂性T(n)是它处理所有长度为n的输入所需的最大计算步数。如果对某个长度为n的输入,图灵机不停机,T(n)对这个n值无定义。 图灵机的空间复杂性S(n)是它处理所有长度为n的输入时,在k条带上所使用过的方格数的总和。如果某个读写头无限地向右移动而不停机,S(n)也无定义。

15.2 P类与NP类问题 一般地说,将可由多项式时间算法求解的问题看作是易处理的问题,而将需要超多项式时间才能求解的问题看作是难处理的问题。 有许多问题,从表面上看似乎并不比排序或图的搜索等问题更困难,然而至今人们还没有找到解决这些问题的多项式时间算法,也没有人能够证明这些问题需要超多项式时间下界。 在图灵机计算模型下,这类问题的计算复杂性至今未知。 为了研究这类问题的计算复杂性,人们提出了另一个能力更强的计算模型,即非确定性图灵机计算模型,简记为NDTM(Nondeterministic Turing Machine)。 在非确定性图灵机计算模型下,许多问题可以在多项式时间内求解。

15.2.1 非确定性图灵机 在图灵机计算模型中,移动函数δ是单值的,即对于QTk中的每一个值,当它属于δ的定义域时,Q(T{L,R,S})k中只有唯一的值与之对应,称这种图灵机为确定性图灵机,简记为DTM(Deterministic Turing Machine)。 非确定性图灵机( NDTM ):一个k带的非确定性图灵机M是一个7元组:(Q,T,I,δ,b,q0,qf)。与确定性图灵机不同的是非确定性图灵机允许移动函数δ具有不确定性,即对于QTk中的每一个值(q;x1,x2,…,xk),当它属于δ的定义域时,Q(T{L,R,S})k中有唯一的一个子集δ(q;x1,x2,…,xk)与之对应。可以在δ(q;x1,x2,…,xk)中随意选定一个值作为它的函数值。

P={L|L是一个能在多项式时间内被一台DTM所接受的语言} NP={L|L是一个能在多项式时间内被一台NDTM所接受的语言} 15.2.2 P类与NP类语言 P类和NP类语言的定义: P={L|L是一个能在多项式时间内被一台DTM所接受的语言} NP={L|L是一个能在多项式时间内被一台NDTM所接受的语言} 由于一台确定性图灵机可看作是非确定性图灵机的特例,所以可在多项式时间内被确定性图灵机接受的语言也可在多项式时间内被非确定性图灵机接受。故P  NP。

若用邻接矩阵表示图G,用二进制串表示整数k,则团问题的一个实例可以用长度为 的二进位串表示。因此,团问题可表示为语言: 15.2.2 P类与NP类语言 NP类语言举例——无向图的团问题。 该问题的输入是一个有n个顶点的无向图G=(V,E)和一个整数k。要求判定图G是否包含一个k顶点的完全子图(团),即判定是否存在V’V,|V’|=k,且对于所有的u,v∈V’,有(u,v)∈E。 若用邻接矩阵表示图G,用二进制串表示整数k,则团问题的一个实例可以用长度为 的二进位串表示。因此,团问题可表示为语言: CLIQUE={w#v|w,v∈{0,1}*,以w为邻接矩阵的图G有一个k顶点的团,其中v是k的二进制表示。}

15.2.2 P类与NP类语言 接受该语言CLIQUE的非确定性算法:用非确定性选择指令选出包含k个顶点的候选顶点子集V,然后确定性地检查该子集是否是团问题的一个解。算法分为3个阶段: 算法的第一阶段将输入串w#v分解,并计算出n= ,以及用v表示的整数k。若输入不具有形式w#v或|w|不是一个平方数就拒绝该输入。显而易见,第一阶段可 在时间内完成。 在算法的第二阶段中,非确定性地选择V的一个k元子集V’V。 算法的第三阶段是确定性地检查V’的团性质。若V’是一个团则接受输入,否则拒绝输入。这显然可以在 时间内完成。因此,整个算法的时间复杂性为 。 非确定性算法在多项式时间内接受语言CLIQUE,故CLIQUE∈NP。

15.2.3 多项式时间验证 多项式时间可验证语言类VP可定义为: 15.2.3 多项式时间验证 多项式时间可验证语言类VP可定义为: VP={L|L∈∑*,∑为一有限字符集,存在一个多项式p和一个多项式时间验证算法A(X,Y)使得对任意X∈∑*,X∈L当且仅当存在Y∈∑*,|Y|≤p(|X|)且A(X,Y)=1}。 定理15-1:VP=NP。 例如(哈密顿回路问题):一个无向图G含有哈密顿回路吗? 无向图G的哈密顿回路是通过G的每个顶点恰好一次的简单回路。可用语言HAM-CYCLE 定义该问题如下: HAM-CYCLE={G|G含有哈密顿回路}

15.3 NP完全问题 PNP。 直观上看,P类问题是确定性计算模型下的易解问题类,而NP类问题是非确定性计算模型下的易验证问题类。 大多数的计算机科学家认为NP类中包含了不属于P类的语言,即P≠NP。 NP完全问题有一种令人惊奇的性质,即如果一个NP完全问题能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内求解,即P=NP。 目前还没有一个NP完全问题有多项式时间算法。

15.3.1 多项式时间变换 设 , 是2个语言。所谓语言 能在多项式时间内变换为语言 (简记为 ∝p )是指存在映身f: ,且f满足: 15.3.1 多项式时间变换 设 , 是2个语言。所谓语言 能在多项式时间内变换为语言 (简记为 ∝p )是指存在映身f: ,且f满足: (1)有一个计算f的多项式时间确定性图灵机; (2)对于所有x∈ ,x∈ ,当且仅当f(x)∈ 。 定义:语言L是NP完全的当且仅当 (1)L∈NP; (2)对于所有L’∈NP有L’ ∝p L。 如果有一个语言L满足上述性质(2),但不一定满足性质(1),则称该语言是NP难的。所有NP完全语言构成的语言类称为NP完全语言类,记为NPC。

定理的(2)可用来证明问题的NP完全性。但前提是:要有第一个NP完全问题L。 15.3.1 多项式时间变换 定理15-2:设L是NP完全的,则 (1)L∈P当且仅当P=NP; (2)若L∝p ,且 ∈NP,则 是NP完全的。 定理的(2)可用来证明问题的NP完全性。但前提是:要有第一个NP完全问题L。

15. 3.2 一些典型的NP完全问题 部分NP完全问题树

15.4 NP完全问题的近似算法 迄今为止,所有的NP完全问题都还没有多项式时间算法。 对于这类问题,通常可采取以下几种解题策略。 (1)只对问题的特殊实例求解 (2)用动态规划法或分支限界法求解 (3)用概率算法求解 (4)只求近似解 (5)用启发式方法求解 本节主要讨论解NP完全问题的近似算法

学习要点: 理解近似算法的性能比的概念 理解多项式时间近似格式的概念 通过范例学习NP完全问题的近似算法

概述 近似算法设计思想 放弃求解最优解,用近似最优解代替最优解,以此换取: 近似算法是可行的: 算法设计上的简化 时间复杂性的降低 问题的输入数据是近似的; 问题的解允许有一定程度的误差; 近似算法可在很短的时间内得到问题的近似解。

15.4.1 近似算法的性能 衡量近似算法性能的标准: 时间复杂性:必须是多项式阶的——基本目标 解的近似程度:——重要目标 若一个最优化问题的最优值为c*,求解该问题的一个近似算法求得的近似最优值为c,则将该近似算法的近似比定义为 = 在通常情况下,该性能比是问题输入规模n的一个函数ρ(n),即 ≤ρ(n) 最小化问题 c≥c* 最大化问题,c*≥c  ≥1;且越大,近似解越差!

15.4.1 近似算法的性能 近似算法的相对误差λ定义为: λ= λ表示一个近似最优解与最优解相差的程度。 若问题的输入规模为n,存在一个函数ε(n),使得: ≤ε(n) ε(n)称为近似算法的相对误差界。且有: ε(n)≤ρ(n)-1

15.4.2 顶点覆盖问题的近似算法 问题描述:无向图G=(V,E)的顶点覆盖是它的顶点集V的一个子集V’V,使得若(u,v)是G的一条边,则v∈V’或u∈V’。顶点覆盖V’的大小是它所包含的顶点个数|V’|。 近似算法思想: 初始时边集E’=E,顶点集V’={},每次从边集E’中任取一条边(u, v),把顶点u和v加入到顶点集V’中,再把与u和v顶点相邻接的所有边从边集E’中删除,直到边集E’为空。

15.4.2 顶点覆盖问题的近似算法 VertexSet approxVertexCover ( Graph g ) { cset=; 15.4.2 顶点覆盖问题的近似算法 VertexSet approxVertexCover ( Graph g ) { cset=; e1=g.e; while (e1 != ) { 从e1中任取一条边(u,v); cset=cset∪{u,v}; 从e1中删去与u和v相关联的所有边; } return c Cset用来存储顶点覆盖中的各顶点。初始为空,不断从边集e1中选取一边(u,v),将边的端点加入cset中,并将e1中已被u和v覆盖的边删去,直至cset已覆盖所有边。即e1为空。 算法的时间复杂性:O(n+e)

算法approxVertexCover的性能比为2。 求解过程: 初始:E’=E={(a, b), (b, c), (c, d), (c, e), (d, e), (d, f), (d, g), (e, f)} A={(b, c)} V’={b, c} 图(a)~(e)说明了算法的运行过程及结果。(e)表示算法产生的近似最优顶点覆盖cset,它由顶点b,c,d,e,f,g所组成。(f)是图G的一个最小顶点覆盖,它只含有3个顶点:b,d和e。 A={(b, c), (e, f)} V’={b, c, e, f} A={(b, c), (e, f), (d, g)} V’={b, c, e, f, d, g} 算法approxVertexCover的性能比为2。

15.4.3 旅行售货员问题近似算法 问题描述:给定一个完全无向图G=(V,E),其每一边(u,v)∈E有一非负整数费用c(u,v)。要找出G的最小费用哈密顿回路。 旅行售货员问题的一些特殊性质: 比如,费用函数c往往具有三角不等式性质,即对任意的3个顶点u,v,w∈V,有:c(u,w)≤c(u,v)+c(v,w)。 当图G中的顶点就是平面上的点,任意2顶点间的费用就是这2点间的欧氏距离时,费用函数c就具有三角不等式性质。

1 满足三角不等式的旅行售货员问题 对于给定的无向图G,可以利用找图G的最小生成树的算法设计找近似最优的旅行售货员回路的算法: 首先生成图G的最小生成树T; 然后,对T进行深度优先遍历, 得到的遍历序列就是近似最优的旅行售货员回路。

1 满足三角不等式的旅行售货员问题 void approxTSP (Graph G) { (1)选择G的任一顶点r; 1 满足三角不等式的旅行售货员问题 void approxTSP (Graph G) { (1)选择G的任一顶点r; (2)用Prim算法找出带权图G的一棵以r为根的最小生成树T; (3)前序遍历树T得到的顶点表L; (4)将r加到表L的末尾,按表L中顶点次序组成回路H,作为计 算结果返回; } 算法的时间复杂性:O(n2) 当费用函数满足三角不等式时,算法找出的旅行售货员回路的费用不会超过最优旅行售货员回路费用的2倍。

示例求解过程: 线路: a→b→c→b→h→b →a→d→e→f→e→g→e→d→a L=(a, b, c, h, d, e, f, g) (b)表示找到的最小生成树T;(c)表示对T作前序遍历的次序;(d)表示L产生的哈密顿回路H; (e)是G的一个最小费用旅行售货员回路。 H=(a→b→c→h→d→e →f→g→a) H*=(a→b→c→h→f →g→e→d→a)

2 一般的旅行售货员问题 在费用函数不一定满足三角不等式的一般情况下,不存在具有常数性能比的解TSP问题的多项式时间近似算法,除非P=NP。 换句话说,若P≠NP,则对任意常数ρ>1,不存在性能比为ρ的解旅行售货员问题的多项式时间近似算法。

15.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}

15.4.4 集合覆盖问题的近似算法 集合覆盖问题举例: 15.4.4 集合覆盖问题的近似算法 集合覆盖问题举例: 用12个黑点表示集合X。F={S1,S2,S3,S4,S5,S6,},如图所示。容易看出,对于这个例子,最小集合覆盖为:C={S3,S4,S5,}。

15.4.4 集合覆盖问题的近似算法 集合覆盖问题近似算法——贪心算法 Set greedySetCover (X,F) { U=X; 15.4.4 集合覆盖问题的近似算法 集合覆盖问题近似算法——贪心算法 Set greedySetCover (X,F) { U=X; C=; while (U !=) { 选择F中使|S∩U|最大的子集S; U=U-S; C=C∪{S}; } return C; 算法的循环体最多执行min{|X|,|F|}次。而循环体内的计算显然可在O(|X||F|)时间内完成。因此,算法的计算时间为O(|X||F|min{|X|,|F|})。由此即知,该算法是一个多项式时间算法。

15.4.5 子集和问题的近似算法 问题描述:设子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,…,xn}是一个正整数的集合,t是一个正整数。子集和问题判定是否存在S的一个子集S1,使得 。

1 子集和问题的指数时间算法 int exactSubsetSum (S,t) { int n=|S|; L[0]={0}; 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,215〉,则用δ对L进行修整后得到L1=〈10,12,15,20,23,215〉。其中被删去的数11由10来代表,21和22由20来代表,24由23来代表。

2 子集和问题的完全多项式 时间近似格式 对有序表L修整算法 子集和问题近似格式 List trim(L,δ) 2 子集和问题的完全多项式 时间近似格式 对有序表L修整算法 子集和问题近似格式 List trim(L,δ) { int m=|L|; L1=〈L[1]〉; int last=L[1]; for (int i=2;i<=m;i++) { if (last<(1-δ)*L[i]) { 将L[i]加入表L1的尾部; last=L[i]; } return L1; int approxSubsetSum(S,t,ε) { n=|S|; L[0]=〈0〉; for (int i=1;i<=n;i++) { L[i]=Merge-Lists(L[i-1], L[i-1]+S[i]); L[i]=Trim(L[i],ε/n); 删去L[i]中超过t的元素; } return max(L[n]);

设:S=<104, 102, 201, 101>,t=308,i=1, 2, ..., n。 示例求解: 设:S=<104, 102, 201, 101>,t=308,i=1, 2, ..., n。 由算法确定的修整参数δ是ε/4=0.05。 初始时,L[0]=<0>。计算L[i]的3阶段结果: L[1]=<0, 104> L[2]=<0, 102, 104, 206> L[2]=<0, 102, 206> L[3]=<0, 102, 201, 206, 303, 407> L[3]=<0, 102, 201, 303, 407> L[3]=<0, 102, 201, 303> L[4]=<0, 101, 102, 201, 203, 302, 303, 404> L[4]=<0, 101, 201, 302, 404> L[4]=<0, 101, 201, 302> 算法最后返回z=302最为近似解答。容易看出该例的最优解为104+102+101=307,误差≤2%。

本章小结 近似算法放弃求最优解,用近似解代替最优解,以换取算法设计上的简化和时间复杂性的降低。 近似算法通常采用两个标准来衡量性能: 算法的时间复杂性 解的近似程度 近似比 相对误差λ 相对误差界ε(n)

作业 35.1-4 35.2-3