算法设计学习笔记(十)扩展易解性的界限


前言

本文是对于算法设计的学习笔记,如有错误,请不吝赐教。


一、找小的顶点覆盖

顶点覆盖问题:给定图G=(V,E)和整数k,要找一个大小不超过k的顶点覆盖,即找一个顶点的子集S,其大小|S|<=k,并且每条边e至少有一个端点在S中。

1.1 问题

我们考虑顶点覆盖问题中的两个参数——顶点n,k。
我们假设如果k是一个固定的常数,那么是否可以在多项式的时间内求解呢?

1.2 算法设计

我们考虑当一个图有一个较小的顶点覆盖时,那么它不可能有很多边。
我们有以下推论:
在这里插入图片描述证明:假设S是G的一个顶点覆盖,其大小为k’<=k,根据顶点覆盖的定义和度数的含义,那么我们可知G中最多有k’*d 条边
在这里插入图片描述由此我们的算法可以首先检查G的边数是否大于kn,如果大于,则必定不存在这样的顶点集。
在这里插入图片描述具体证明如下:假设G有不超过k的顶点覆盖S,那么S至少包含u,v其中一个,我们假设包含u,那么S-u一定包含所有不以u为顶点的边。因此S-u是一个不大于n-1的顶点覆盖集合。

我们给出算法如下:

if(G没有边 then 是一个顶点覆盖
if G的边数n>kv  then 他没有k个顶点的顶点覆盖
else 设e=(u,v)
  递归检查G-u和G-e是否有大小为k-1的顶点覆盖
  if都没有 then G没有k的顶点覆盖
  else 其中一个有,那么
   递归得到的T就是图G的k顶点覆盖
   endif
endif

1.3 算法分析

上述算法进行递归调用:对应参数为k的递归调用有两个儿子,每个儿子是一个参数为k-1的递归调用节点。
由此整个树最多有2^k+1个节点,每一次调用需要花费Okn(最多kn条边)
所以我们可知算法的运行时间为O(2^k*kn)[递归树计算]
也可以用递推公式证明:(可以直接展开证明)
在这里插入图片描述

二、在树上解NP难问题

上述是考虑在k参数较少时的情况,此时上述算法的效率较好。
我们这一节考虑当图的结构较为简单的时候,是否有一个比较好的算法来进行求解。

2.1 在树上的独立集的贪心算法

在这里插入图片描述由此我们得到算法的贪心策略:依次用上述定理去识别并删去可以放入独立集的节点。(可有交换论证证明)
具体而言:我们考虑树中的一条边e(u,v),其中,v是树叶。我们的独立集S将包含v,而后删去u节点和v节点,考虑剩下的分支。
算法如下:

设S是现有的独立集
While T存在边
设 e是其中的一条边,其中的节点v是叶节点
把v加入S中
删去节点u,v以及和它们相关联的边。
endwhile
将剩下的孤立的点加入到S中
return S

该算法对于一版图而言无法保证能够顺利工作,因为无法保证每次迭代,都有叶节点。

2.2 树上的最大权独立集

最大权独立集问题:假设图G是一颗树,现在每一个节点都关联一个正的权值w,那么最大权独立集问题就是在G上找一个独立集,使得权重最大。

我们这里考虑动态规划相关思路:
动态规划需要界定子问题,我们这里的子问题考虑以任意节点r为根的树T构造子问题。
此时我们考虑parentu,这些节点是从r出发的路径中与u相连。
我们考虑从树叶开始沿着树向上逐步进行。
对于没课子树Tu,我们令OPT(u)表示其的最大权独立集,
我们考虑两种情况,一种包含节点u,另一种不包含
对于树叶u有Optout(u)=0
optin(u)=wu
那么有以下递推:
Optin(u)=wu+Optout(v) v为u的子节点
optout(u)=max(optout(v),optin(v)); v为u的子节点
我们定义Mout和Min两个数组分别存储两种不同情况下的值。
算法如下所示:(后序遍历)
(其中递推中为子节点的和);

r为树T的根节点
for 所有节点按照后序的方式遍历
 if u 为树叶 then
  Optout(u)=0;
  Optin(u)=wu;
 else 
 Mout[u]=max(Mout[v],Min[v])
 Min[u]=wu+Mout[v]; 
 endif
 endfor
 return max[MOUT[r],Min[r]);

这个算法在线性时间内找到最优解。

三、图弧集着色

3.1 问题

波分复用(WDM)是采用不同的波长来传输不同的信息在一条光缆上。
我们将这个问题考虑如下:给定k个可用的波长,希望给每一条通信流Pi分配一个波长,使得每一对共享一条边的通信流被分给不同的波长,这也被称为路径着色问题,上述是其的一个实例。

(考虑现实中经常在结构简单的网络中运用WDM,所以对于路径着色问题中的网络结构加以限制是有必要考虑的。其中一个重要的图是环)

我们这里具体考虑给定n个节点的圈构成的图G=(V,E)和这个圈上的一组路径P1,P2.。。Pm。目标是给每一条路径Pi分配给定的k个波长中的一个波长,使得重叠的路径接受不同的波长,称这是一个对路径有效的波长分配。我们把这种情况称为圆弧着色问题。

3.2 算法设计

我们考虑动态规划,在原图中的某两个节点中加入一个新的节点,将其分为两半。(类似于区间划分,区间深度)
例子如下:
在这里插入图片描述
我们可得如下结论:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

确定f'与f’‘是否是一致的
令F0={
    
    f'}
for i=0,1....n-1
for 每一个f属于F
把f的所有扩张加入到Fi+1
endfor
endfor
检查f’‘是否在Fn中

在这里插入图片描述
在这里插入图片描述

3.3 算法分析

上述算法的时间需求如下:
si中有k条路径,Fi中最多有k!个着色
列举f分配给si-si+1中路径的颜色时所有的排列有l1个,其中l时si-si+1的大小
在这里插入图片描述

四、图的树分解(?)

4.1 问题

在前面部分我们看到,对于某些特定结构,如何解决特定的NP难问题。

这里是引用

我们考虑为何NP完全问题在这种结构上时易解的。
事实上,这类图被称作有界树宽图。与树一样,许多NP完全问题在有界树宽图上时易解的。

4.2 树宽的定义

对于这类图,我们希望能够通过删去少量节点以分成不连接的片段的图,这样就可以考虑动态规划。
在这里插入图片描述我们考虑上图,可以发现图b由许多互锁的三角组成,我们给出这些三角形的树形结构,每一个三角形对应树的一个节点。由此我们形式化的对图G进行树分解。

树分解:G=(V,E)的树分解由树T和T的每一个节点t关联的子集vt构成。树T和片段集必须满足以下条件:

1.G的每一个节点至少属于一个片段Vi
2.对G的每一条边e,存在一个片段Vi包含e的两个端点。
3.设t1和t2、t3是T的3个节点,t2在t1到t3的路径上,那么如果G的节点v属于Vt1和Vt3,则它也属于Vt2.

4.3 树分解的性质

在这里插入图片描述
在这里插入图片描述
从实际考虑,其实每个图都有他的树分解,我们要考虑的是要求能够删去很小的节点把整个图分成不连通的子图。于是我们定义树分解的宽度为
width(T,{Vt})=max|Vt|-1
定义G的树宽为他所有分解树中的最小宽度。
在这里插入图片描述为了减少片段数,我们可以考虑收缩,对于边(x,y)使得Vx属于Vy那么可以收缩边(x,y),把片段Vx折叠进片段Vy
在这里插入图片描述

4.4 树分解上的动态规划

对于一个宽度为w的树分解(T,{Vt})的图G,我们把T看做根树,并从树叶向上考虑片段Vt构造独立集。

确定子问题:我们用Tt表示根在t的子树。对于V的子集U,用Wu表示U中所有节点的权之和。
对每一个子树Tt定义一个子问题的集合。对应的Vt的每一个可能的子集U有一个子问题,其中U表示可能最优解与Vt的交集。对于每一个独立集U属于Vt,用ft(U)表示Gt中的独立集S的最大权,其中要满足S与Vt的交集为U。

构造解:当t是树叶时,对每一个独立集U,ftU等于wu。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述具体的算法如下:

给定G的树分解(T,vT),求G的最大权独立集
如果需要的话,修改树分解使得它是非冗余的
确定T的根节点r
for T的每一个节点t按后序
if t是树叶 then
 For Vt的每一个独立集U
 ft(U)=w(U)
 else
  for vt的每一个独立集U
  用递归式子确定ft(U)
  endif
  endfor
  return max{
    
    fr(U}:U属于Vr是独立集)
  

五、构造树分解(?)

5.1 问题

上述中,我们直接给定图G的低宽度树分解的条件。那么对于一张新的图,我们如何找到一个好的树分解呢?
注意,给定一个图G,确定它的树宽是NP难的。但是对于一个较小的树宽,还是有一定的办法的。
我们考虑以下算法:
给定树宽小于w的图G,在时间(fw*mn)内生成图G的一个宽度小于4w的树分解,其中m和n分别是G的边数和节点数,而f是仅依赖于w的函数。

5.2 算法设计与分析

小树宽的障碍:
给定两个大小相同的集合Y,Z属于V,如果有一个严格比它们小的集合使它们完全不连接,即存在集合S属于V,使得|S|<|Y|=|z|并且在G-S中没有从Y-S到Z-S的路径,则称Y和Z时可分离的。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_43869415/article/details/118629159