算法设计 第十章 PSPACE:EXTENDING TRACTABILITY 扩展解的易解性
1 前言
我们已经看到NPC问题以及PSPACEC问题是非常难解的问题,但是存在一些特殊情况,使得这些难解的问题变得容易求解。比如 这种问题有某种结构,我们利用这种结构信息来降低复杂度。相当于有了部分先验。
2 例子
2.2寻找最小点集覆盖
给定G(V,E)和整数k,找到一个大小不超过k的顶点覆盖集。
假设顶点个数为n,那么有
C
n
k
C_n^k
Cnk个不同子集,验证每个子集是否顶点覆盖需要O(kn)(两个循环 k*n/2)。总时间
O
(
k
n
C
n
k
)
=
O
(
k
n
k
+
1
)
O(knC_n^k)=O(kn^{k+1})
O(knCnk)=O(knk+1)。
定理一:
如果G(V,E)有n个顶点,顶点最大的度不超过d,并且有一个大小不超过k的顶点覆盖,则G最多有kd条边。
推论:
最大的度不可能超过n-1,因此G最多有k(n-1)<kn条边。
所以利用推论的结果,分治法
e={u,v}是G的任意一边。G有一个大小不超过k的顶点覆盖当且仅当
G-{u}或者G-{v}有一个大小不超过k-1的顶点覆盖。
这里的删除是指删除u或v为端点的边以及节点。
分治算法
时间复杂度由
O
(
k
n
k
+
1
)
O(kn^{k+1})
O(knk+1)变为
2
k
c
k
n
2^kckn
2kckn,关于n变为多项式而非指数,当n较大时可以求解。
总结:利用了图的结构知识降低复杂度。
2.3 solving NP-hard problems on trees
求G的最大独立集的势是多少,是npc问题,但是当G是树结构时,问题变得可解。
最大独立集一定包含叶节点。
因此贪婪法:
- e(u,v)是一条边,将叶节点加入S集合,同时删除与u,v关联的边,注意删除边,保留节点。
- 迭代直到没有边,将剩余孤立节点加入S
加权的独立集
每个节点有个权重,找到独立集,极大化权重和。
(u,v)是一条边,v是叶节点,OPT包括u或者包括包括所有与u相连的节点。
因此可以用动态规划
树结构的优点:一个树可以分解为多个子树。天然的适合分支以及动态规划求解,原问题分解为多个子问题。
2.4 圆弧覆盖物问题
波分复用:不同的波长可以用同一段电缆。
不同的颜色代表不同的波长。
k个颜色,m个圆弧,n个节点。
暴力算法需要O(
k
m
k^m
km)次计算。
通过切割
n个阶段每次
k
!
k!
k!次迭代。O(nk!)
最后对比切口处是否有一致的颜色。
2.5 二部图中的点集覆盖
二部图的最小覆盖的势等于最大匹配。
最大匹配=>构建最大流,求出最小覆盖。
证明暂略。