算法设计与分析复习笔记之归约整理
归约是指问题A的任何实例能用问题B的方法来解决(判断),并且A的解为“是”,当且仅当B的解也是“是”。因此,证明归约是双向的,目前遇到的大多归约问题(A ≤p B)都可以按以下步骤进行:
- 构造图G,存在问题A的解集;
- 在图G基础上,构造图G'(常添加边或点),使得问题A的解集能反应在G'中问题B的解集(注意两个问题解集的规模k一定要有确定的联系);
- Claim:“图G中存在问题A的解集S,当且仅当图G'中存在问题B的解集S' ”;
- 双向证明,注意不要弄反方向。
也有不用构造新图的,比如点覆盖到独立集的规约,这种方法叫直接规约。但大多有些难度的归约一般都需要构造。除了前面笔记写的一部分归约证明,下面整理了老师说的需要重点掌握的归约。
Subset-Sum ≤p Partition
Partition:集合能划分成和相等的两部分。
构造子集和问题的实例,如集合,子集和为W,需构造集合S',使得集合S存在一个子集之和为W,当且仅当集合S'存在一个partition()
思路:构造集合,其中,
=>
S存在一个子集,有
那么集合S'中,有
所以集合S'存在一个划分和
<=
集合S'能被划分为两个和相等的集合,可知和不在一个划分子集里
那么,存在一个集合A,设其元素之和为Y,有
解出,即...
Subset-Sum ≤p Knapsack
Knapsack:给定物品的集合X,每个物品有重量和价值,背包最多承重,目标价值。问是否存在物品的一个子集S,使得, ?
第一步构造Knapsack的实例,第二步证明集合X存在一个子集之和为W,当且仅当构造的Knapsack具有可行方案。
对一个子集和问题的实例,构造Knapsack实例,满足
,
,
证明略(别的不会,略学得很像样)。
Subset-Sum ≤p Schedule
Schedule:一个工作序列,每个工作具有到达时间,处理时间,最迟完成时间,问如何安排这些工作,使得完成所有工作所需时间最短(在到达时间之后开始处理、最迟完成时间之前结束处理)?
思路:对于给定的集合和W,构造一个工作安排实例,证明若存在子集之和为W,当且仅当存在可行的工作安排。
集合,构造n个工作(从1开始编号),有, , ,就是对到达时间和最迟完成时间没有要求;再创建0号工作,, , .
这个证明就比较显而易见,但这个构造也太奇怪了,就是通过设置工作的到达时间和最迟完成时间来固定安排它们的位置。为什么可以构造这样的特例来证明呢?因为X≤pY,Y本身就是一个比X难的问题,那么我们就可以把Y的更多的约束条件舍去,让它变成和X比较相像或者复杂度相当的NPC问题。
Partition ≤p Load-Balance
Partition ≤p Load-Balance集合,构造Load-Balance实例,且每个工作的处理时间,,有.
证明略。