├── GraphTheory ├── 1.html ├── 1.md ├── 2.html ├── 2.md ├── 3.html ├── 3.md ├── 4.html ├── 4.md ├── 5.html ├── 5.md ├── bg.html ├── bg.md └── fig │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── README.html ├── README.md ├── algo ├── 1.html ├── 1.md └── fig │ └── mergeSort.png ├── approx ├── approx.html ├── approx.md ├── fig │ └── 1.png ├── mstmm.html ├── mstmm.md ├── smsp.html └── smsp.md ├── doc ├── 2.html ├── 2.md ├── 2sat.html ├── 2sat.md ├── 3.html ├── 3.md ├── 3dm.html ├── 3dm.md ├── 3sat.html ├── 3sat.md ├── 4gcp.html ├── 4gcp.md ├── clique.html ├── clique.md ├── fig │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 3.png │ ├── 4.png │ ├── 5.jpg │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── gcp.html ├── gcp.md ├── hc.html ├── hc.md ├── ivs.html ├── ivs.md ├── knapsack.html ├── knapsack.md ├── mc.html ├── mc.md ├── mds.html ├── mds.md ├── mts.html ├── mts.md ├── par.html ├── par.md ├── partri.html ├── partri.md ├── pgcp.html ├── pgcp.md ├── sat.html ├── sat.md ├── sgi.html ├── sgi.md ├── swi.html ├── swi.md ├── tsp.html ├── tsp.md ├── vc.html ├── vc.md ├── x3c.html └── x3c.md ├── fig ├── group.png └── sharingidea.png ├── gitpush.cmd ├── others ├── gcp.ai ├── hc.ai ├── msmp.ai └── propto.ai └── turing ├── 1.html ├── 1.md ├── 2.html ├── 2.md ├── 3.html ├── 3.md ├── 4.html ├── 4.md ├── 5.html ├── 5.md ├── fig ├── 1.jpg ├── 2.png ├── 3.png └── 4.png ├── prob.html └── prob.md /GraphTheory/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 平面图 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

平面图

28 |

如果能将图 GG 除顶点外的边不相交地画在平面上,则称 GG 是平面图。

29 |

这个画出的没有边相交的图称为 GG 的平面嵌入。没有,也就是不存在平面嵌入的图称作非平面图

30 |

31 | 32 | 33 | -------------------------------------------------------------------------------- /GraphTheory/1.md: -------------------------------------------------------------------------------- 1 | # 平面图 2 | 3 | 如果能将图 $G$ 除顶点外的边不相交地画在平面上,则称 $G$ 是平面图。 4 | 5 | 这个画出的没有边相交的图称为 $G$ 的平面嵌入。没有,也就是不存在平面嵌入的图称作**非平面图**。 6 | 7 | ![](fig/1.png) 8 | -------------------------------------------------------------------------------- /GraphTheory/2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 哈密顿回路问题 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

哈密顿回路问题

28 |

在一个无向图中,寻找一条从给定的起点到给定的终点沿途恰好经过所有其他点一次的路径。如果存在,则该路径被称为哈密顿路径/通路。

29 |

闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle, HC)

30 |

具有哈密顿回路的图称为哈密顿图,具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图

31 |

这个问题和著名的七桥问题的不同之处在于,过桥只需要确定起点,而不用确定终点。哈密顿问题寻找一条从给定的起点到给定的终点沿途恰好经过所有其他城市一次的路径。

32 |

平凡图是哈密顿图。

33 |

问题难度

34 |

寻找哈密顿路径是一个典型的NP-完全问题。后来人们也证明了,找一条哈密顿路的近似比为常数的近似算法也是NP-完全的。

35 |
36 |

哈密尔顿图的图论定义

37 |

G=(V,E)是一个图,若G中一条通路通过且仅通过每一个顶点一次,称这条通路为哈密尔顿通路。若G中一个圈通过且仅通过每一个顶点一次,称这个圈为哈密尔顿圈。若一个图存在哈密尔顿圈,就称为哈密尔顿图。

38 |

哈密尔顿图的必要条件

39 |

若G=(V,E) 是一个哈密尔顿图,则对于V的每一个非空子集S,均有W(G-S) ≤|S|。其中|S|是S中的顶点数,W(G-S)表示图G擦去属于S中的顶点后,剩下子图的连通分枝的个数。

40 |

哈密尔顿图的充分条件

41 |

G=(V,E)G=(V,E)是一个无向简单图,V=n,n3.|V|=n, n≥3. 若对于任意的两个顶点u,vVd(u)+d(v)nv∊V,d(u)+d(v) ≥n,那么, G是哈密尔顿图。此条件由美国图论数学家奥勒在1960年给出。

42 | 43 | 44 | -------------------------------------------------------------------------------- /GraphTheory/2.md: -------------------------------------------------------------------------------- 1 | # 哈密顿回路问题 2 | 在一个无向图中,寻找一条从给定的起点到给定的终点沿途恰好经过所有其他点一次的路径。如果存在,则该路径被称为哈密顿路径/通路。 3 | 4 | **闭合的哈密顿路径**称作**哈密顿回路(Hamiltonian cycle, HC)** 5 | 6 | **具有哈密顿回路的图**称为哈密顿图,*具有哈密顿通路但不具有哈密顿回路的图称为半哈密顿图*。 7 | 8 | 这个问题和著名的七桥问题的不同之处在于,**过桥只需要确定起点,而不用确定终点**。哈密顿问题寻找一条从给定的起点到给定的终点沿途恰好经过所有其他城市一次的路径。 9 | 10 | 平凡图是哈密顿图。 11 | 12 | # 问题难度 13 | 寻找哈密顿路径是一个典型的NP-完全问题。后来人们也证明了,找一条哈密顿路的近似比为常数的近似算法也是NP-完全的。 14 | 15 | 16 | --- 17 | 18 | # 哈密尔顿图的图论定义 19 | G=(V,E)是一个图,若G中一条通路通过且仅通过每一个顶点一次,称这条通路为哈密尔顿通路。若G中一个圈通过且仅通过每一个顶点一次,称这个圈为哈密尔顿圈。若一个图存在哈密尔顿圈,就称为哈密尔顿图。 20 | 21 | 22 | 23 | 24 | ## 哈密尔顿图的必要条件 25 | 若G=(V,E) 是一个哈密尔顿图,则对于V的每一个非空子集S,均有W(G-S) ≤|S|。其中|S|是S中的顶点数,W(G-S)表示图G擦去属于S中的顶点后,剩下子图的连通分枝的个数。 26 | 27 | ## 哈密尔顿图的充分条件 28 | 设 $G=(V,E)$是一个无向简单图,$|V|=n, n≥3.$ 若对于任意的两个顶点u,$v∊V,d(u)+d(v) ≥n$,那么, G是哈密尔顿图。此条件由美国图论数学家奥勒在1960年给出。 29 | 30 | -------------------------------------------------------------------------------- /GraphTheory/3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 独立集(Independent set) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

独立集(Independent set)

28 |

一个独立集(也称为稳定集)是一个图中一些两两不相邻的顶点所形成的集合,如果两个点没有公共边,那么这两个点可以被放到一个独立集中。换句话说,独立集 SS 由图中若干顶点组成,且 SS 中任两个顶点之间没有边。等价地,图中的每条边至多有一个端点属于 SS 。一个独立集的基数是它包含顶点的数目。

29 |

如下图中,所有灰色的点可以构成一个独立集,因为他们互相之间没有任何公共边。

30 |

31 |
32 |

对于三个点组成的完全图而言,每个点自身是一个独立集(且是最大独立集);对四个点构成的四边形图而言,对角的两个点组成一个独立集(且是最大独立集)。

33 |
34 |

最大独立集

35 |

如果往图 GG 的独立集 SS 中添加任一个顶点都会使独立性丧失(亦即造成某两点间有边),那么称 SS极大独立集

36 |

如果 SS 是图中所有独立集之中基数最大的,那么称 SS 是最大独立集,且将该基数称为 GG 的独立数,记为 α(G)α(G) 。一般来讲,图 G 中可能存在多个极大独立集和最大独立集。

37 |
38 |

根据定义,最大独立集一定是极大独立集,但反之未必。

39 |
40 |

问题难度

41 |

给定一张图,寻找其中一个最大独立集的问题被称为最大独立集问题。该问题已知是 NP 困难的最优化问题,且即便试图以常数倍近似也是 NP 困难的。因此,计算机科学家普遍相信不存在解决该问题的高效算法,无论是精确求解还是以常数倍近似求解。

42 | 43 | 44 | -------------------------------------------------------------------------------- /GraphTheory/3.md: -------------------------------------------------------------------------------- 1 | # 独立集(Independent set) 2 | 3 | 4 | 一个独立集(也称为稳定集)是一个图中**一些两两不相邻的顶点**所形成的集合,如果两个点没有公共边,那么这两个点可以被放到一个独立集中。换句话说,独立集 $S$ 由图中若干顶点组成,且 $S$ 中任两个顶点之间没有边。等价地,图中的每条边至多有一个端点属于 $S$ 。一个独立集的基数是它包含顶点的数目。 5 | 6 | 如下图中,所有灰色的点可以构成一个独立集,因为他们互相之间没有任何公共边。 7 | 8 | ![](fig/2.png) 9 | 10 | 11 | > 对于三个点组成的完全图而言,每个点自身是一个独立集(且是最大独立集);对四个点构成的四边形图而言,对角的两个点组成一个独立集(且是最大独立集)。 12 | 13 | ## 最大独立集 14 | 如果往图 $G$ 的独立集 $S$ 中添加任一个顶点都会使独立性丧失(亦即造成某两点间有边),那么称 $S$ 是**极大独立集**。 15 | 16 | 如果 $S$ 是图中所有独立集之中**基数最大**的,那么称 $S$ 是最大独立集,且将该基数称为 $G$ 的独立数,记为 $α(G)$ 。一般来讲,图 G 中可能存在多个极大独立集和最大独立集。 17 | 18 | > 根据定义,最大独立集一定是极大独立集,但反之未必。 19 | 20 | 21 | ## 问题难度 22 | 给定一张图,寻找其中一个最大独立集的问题被称为最大独立集问题。该问题已知是 NP 困难的最优化问题,且即便试图以常数倍近似也是 NP 困难的。因此,计算机科学家普遍相信不存在解决该问题的高效算法,无论是精确求解还是以常数倍近似求解。 23 | 24 | -------------------------------------------------------------------------------- /GraphTheory/4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 对集/匹配(matching) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

对集/匹配(matching)

28 |

指无公共端点的边的集合,也即该集合是边集,且这些边的所有端点在这个边集中只出现过一次,没有重复。

29 |
30 |

12,34{1-2, 3-4} 是对集,但 12,23{1-2, 2-3} 不是对集

31 |
32 |

最小对集

33 |

在赋权图的已有点上,使得权重之和最小的对集。

34 |
35 |

该概念由此衍生出了三对集(3DM)等问题

36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /GraphTheory/4.md: -------------------------------------------------------------------------------- 1 | # 对集/匹配(matching) 2 | 3 | 指无公共端点的**边的集合**,也即该集合是边集,且这些边的所有端点在这个边集中只出现过一次,没有重复。 4 | 5 | > ${1-2, 3-4}$ 是对集,但 ${1-2, 2-3}$ 不是对集 6 | 7 | ## 最小对集 8 | 9 | 在赋权图的已有点上,使得权重之和最小的对集。 10 | 11 | > 该概念由此衍生出了三对集(3DM)等问题 -------------------------------------------------------------------------------- /GraphTheory/5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 补图 6 | 8 | 9 | 10 | 11 | 18 | 21 | 22 | 23 | 24 | 25 | 26 |

补图

27 |

一个图的补图是指和原图具有一样的点的图,但原图中两点之间存在边时候,补图对应点之间没有边;原图不存在边时,补图有边。因此,原图和补图中的边的合集构成了一张完全图。

28 |

29 | 30 | 31 | -------------------------------------------------------------------------------- /GraphTheory/5.md: -------------------------------------------------------------------------------- 1 | # 补图 2 | 3 | 一个图的补图是指和原图具有一样的点的图,但原图中两点之间存在边时候,补图对应点之间没有边;原图不存在边时,补图有边。因此,原图和补图中的边的合集构成了一张完全图。 4 | 5 | ![](fig/3.png) -------------------------------------------------------------------------------- /GraphTheory/bg.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 二分图(Bipartite Graph) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

二分图(Bipartite Graph)

28 |

二分图又称作二部图,是图论中的一种特殊模型。 设 G=(V,E)G=(V,E) 是一个无向图,如果顶点 VV 可分割为两个互不相交的子集 (A,B)(A,B),并且图中的每条边 (i,j)(i,j) 所关联的两个顶点 iijj 分别属于这两个不同的顶点集 (iA,jB)(i \in A,j \in B),则称图 GG 为一个二分图。

29 |

如下图,是一个二分图,因为点可以被分成两个点集,且每个集合内的点之间互不相邻(互相之间没有边连接) 30 |

31 |

在很多情况下,二分图并不像上图一样显而易见,因此需要设计算法来区分一个图是不是二分图。

32 |

一个简单的方法是染色法,即从其中一个顶点开始,将跟它邻接的点染成与其不同的颜色,如果邻接的点有相同颜色的,则说明不是二分图。每次用bfs遍历染色即可。

33 |

Reference

34 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /GraphTheory/bg.md: -------------------------------------------------------------------------------- 1 | # 二分图(Bipartite Graph) 2 | 3 | 二分图又称作二部图,是图论中的一种特殊模型。 设 $G=(V,E)$ 是一个无向图,如果顶点 $V$ 可分割为两个互不相交的子集 $(A,B)$,并且图中的每条边 $(i,j)$ 所关联的两个顶点 $i$ 和 $j$ 分别属于这两个不同的顶点集 $(i \in A,j \in B)$,则称图 $G$ 为一个二分图。 4 | 5 | 如下图,是一个二分图,因为点可以被分成两个点集,且每个集合内的点之间互不相邻(互相之间没有边连接) 6 | ![](fig/4.png) 7 | 8 | 9 | 在很多情况下,二分图并不像上图一样显而易见,因此需要设计算法来区分一个图是不是二分图。 10 | 11 | 一个简单的方法是染色法,即从其中一个顶点开始,将跟它邻接的点染成与其不同的颜色,**如果邻接的点有相同颜色的,则说明不是二分图**。每次用bfs遍历染色即可。 12 | 13 | 14 | 15 | 16 | # Reference 17 | 18 | - https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E5%9B%BE 19 | - https://blog.csdn.net/zhangxian___/article/details/73699241 -------------------------------------------------------------------------------- /GraphTheory/fig/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/GraphTheory/fig/1.png -------------------------------------------------------------------------------- /GraphTheory/fig/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/GraphTheory/fig/2.png -------------------------------------------------------------------------------- /GraphTheory/fig/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/GraphTheory/fig/3.png -------------------------------------------------------------------------------- /GraphTheory/fig/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/GraphTheory/fig/4.png -------------------------------------------------------------------------------- /README.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 高级算法 6 | 8 | 9 | 10 | 11 | 18 | 21 | 22 | 23 | 24 | 25 | 26 |

高级算法

27 |

点此进入:学习链接(下方link因为部署需要无法直接查看)

28 |

图论/离散基础

29 | 37 |

算法分析设计

38 |

该部份比较简单,因此不做详细介绍,仅提供一个目录和部份知识点。

39 | 55 |

图灵机与P/NP/NPC

56 | 67 |

NPC 问题证明(按照归约顺序排序)

68 |
69 |

列表项中带有 未完成 前缀的问题只描述了问题,没有说明具体证明过程;带有 完成 前缀的问题描述了问题和核心解决思路,但省略了具体证明过程的;没有符号的问题同时包含了问题和具体证明过程,其中部份额外附注了核心思路。(下同)

70 |
71 | 74 |
75 | 120 |

NPC 问题证明(按照证明方法排序)

121 | 145 |

NPC 问题证明(按照证明难度排序)

146 |

以下为分级后的题目难度,可能略有出入,建议掌握所有2分及以下的题目,同时了解所有分数题目的实例形式:

147 | 195 |

难度分级按照 0-5 分评级:

196 | 204 |
205 |

该评级策略参照某定标法略做更改而来,具体链接已经找不到了。个人认为这是主观评分的一个非常棒的标准。

206 |
207 |

其他

208 | 217 |

近似算法

218 | 224 |

Reference

225 | 229 |

Contributor

230 | 234 | 235 | 236 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 高级算法 2 | 3 | 点此进入:[学习链接](https://sailist.github.io/AdAlgo/)(下方link因为部署需要无法直接查看) 4 | 5 | 6 | ## 图论/离散基础 7 | 8 | - [平面图](GraphTheory/1.html) 9 | - [哈密顿图](GraphTheory/2.html) 10 | - [独立集](GraphTheory/3.html) 11 | - [对集/匹配(matching)](GraphTheory/4.html) 12 | - [补图](GraphTheory/5.html) 13 | - [二分图](GraphTheory/bg.html) 14 | 15 | 16 | ## 算法分析设计 17 | 18 | 该部份比较简单,因此不做详细介绍,仅提供一个目录和部份知识点。 19 | 20 | - 复杂度分析 21 | - 分治 22 | - [归并算法](algo/1.html) 23 | - 贪心 24 | - 动规 25 | - 划分问题 26 | - 回溯 27 | - 局搜 28 | 29 | 30 | ## 图灵机与P/NP/NPC 31 | - [图灵机](./turing/1.html) 32 | - [确定型图灵机与非确定性图灵机](./turing/2.html) 33 | - [神谕图灵机](./turing/3.html) 34 | - [问题形式](./turing/prob.html) 35 | - [P/NP/NPC/NPH](./turing/4.html) 36 | - [多项式归约和图灵归约](turing/5.html) 37 | ## NPC 问题证明(按照归约顺序排序) 38 | 39 | > 列表项中带有 `未完成` 前缀的问题只描述了问题,没有说明具体证明过程;带有 `完成` 前缀的问题描述了问题和核心解决思路,但省略了具体证明过程的;没有符号的问题同时包含了问题和具体证明过程,其中部份额外附注了核心思路。(下同) 40 | 41 | - [x] [SAT(布尔可满足性问题,Cook定理)](doc/sat.html) 42 | 43 | --- 44 | 45 | - [ ] [3DM(三对集问题)](doc/3dm.html) 46 | - [X3C](doc/x3c.html) 47 | - [X3C-Y](doc/3.html) 48 | - [最小集合覆盖问题](doc/mc.html) 49 | - [划分三角形问题](doc/partri.html) 50 | 51 | - [3SAT](doc/3sat.html) 52 | - [x] [VC(顶点覆盖问题)](doc/vc.html) 53 | - [独立集问题](doc/ivs.html) 54 | - [团问题](doc/clique.html) 55 | - [子图同构问题](doc/sgi.html) 56 | - [最小迟序排工问题](doc/mds.html) 57 | - [x] [HC(哈密顿回路问题)](doc/hc.html) 58 | - [TSP(货郎问题)](doc/tsp.html) 59 | - [划分问题](doc/par.html) 60 | - [广义划分问题归约](doc/2.html) 61 | - [背包问题](doc/knapsack.html) 62 | - [多任务排工问题](doc/mts.html) 63 | - [区间排工问题](doc/swi.html) 64 | 65 | 66 | ## NPC 问题证明(按照证明方法排序) 67 | 68 | - 限制技术 69 | - [最小集合覆盖问题](doc/mc.html) 70 | - [子图同构问题](doc/sgi.html) 71 | - [背包问题](doc/knapsack.html) 72 | - [多任务排工问题](doc/mts.html) 73 | - 局部替换技术 74 | - [划分三角形问题](doc/partri.html) 75 | - [区间排工问题](doc/swi.html) 76 | - *最小测试集问题 77 | - *总体计算问题 78 | - 分支设计技术 79 | - [最小迟序排工问题](doc/mds.html) 80 | - ......... 81 | 82 | ## NPC 问题证明(按照证明难度排序) 83 | 84 | 以下为分级后的题目难度,可能略有出入,建议掌握所有**2分及以下**的题目,同时了解所有分数题目的实例形式: 85 | 86 | - 0分 87 | - [X3C](doc/x3c.html) 88 | - [最小集合覆盖问题](doc/mc.html) 89 | - [独立集问题](doc/ivs.html) 90 | - [团问题](doc/clique.html) 91 | - [子图同构问题](doc/sgi.html) 92 | - [背包问题](doc/knapsack.html) 93 | - [多任务排工问题](doc/mts.html) 94 | - 1分 95 | - [广义划分问题归约](doc/2.html) 96 | - [区间排工问题](doc/swi.html) 97 | - 2分 98 | - [X3C-Y](doc/3.html) 99 | - [最小迟序排工问题](doc/mds.html) 100 | - [TSP(货郎问题)](doc/tsp.html) 101 | - 3分 102 | - [划分三角形问题](doc/partri.html) 103 | - [x] [VC(顶点覆盖问题)](doc/vc.html) 104 | - [划分问题](doc/par.html) 105 | - [*顶点度不超过4的图的三着色](doc/4gcp.html) 106 | - [ ] [*平面图三着色](doc/pgcp.html) 107 | - [x] [HC(哈密顿回路问题)](doc/hc.html) 108 | - 4分 109 | - [3SAT](doc/3sat.html) 110 | - [x] [SAT(布尔可满足性问题,Cook定理)](doc/sat.html) 111 | - [ ] [3DM(三对集问题)](doc/3dm.html) 112 | - 5分 113 | - ... 114 | 115 | 116 | 难度分级按照 0-5 分评级: 117 | - 0分:**绝对无任何**难度的,一般由等价问题直接归约,只需要理解相关基础概念的问题。 118 | - 1分:**非绝对无**难度的,不能说一点难度没有,但也不能认为有多少难度,仅能依靠非0分的状态在坐标中定位,这种暧昧的状态被定为 1分,一般由有限步易得条件推导得到。 119 | - 2分:有难度的**最低值**,但无法对其强弱进行判定,有难度的最低测度。一般是证明存在一定篇幅,但相对理解可以通过举例较为容易的理解的归约。 120 | - 3分:**很标准**的难,一般是需要大段描述,且中间穿插多个定理,但推演逻辑相对单一线性,且能够通过更简单的描述理解思想的归约。 121 | - 4分:**标准之上**的难,缺少可以可视化的例子,需要引入许多的符号、公式、定理,只能通过硬核的推导来结束证明。 122 | - 5分:**具有侵略性**的难。目前仍然未被证明的难题。这暂时不会出现在本项目中。 123 | 124 | > 该评级策略参照某定标法略做更改而来,具体链接已经找不到了。个人认为这是主观评分的一个非常棒的标准。 125 | 126 | ## 其他 127 | - [ ] [2SAT 问题](doc/2sat.html) 128 | - [图着色问题](doc/gcp.html) 129 | - [顶点度不超过4的图的三着色](doc/4gcp.html) 130 | - [ ] [平面图三着色](doc/pgcp.html) 131 | 132 | ## 近似算法 133 | - [近似算法基础](approx/approx.html) 134 | - [存储最多程序问题](approx/smsp.html) 135 | - [背包问题贪心策略](doc/knapsack.html) 136 | - [MST-MM](approx/mstmm.html) 137 | 138 | 139 | # Reference 140 | - 感谢姜海涛老师的精彩讲解 141 | - [《算法设计与分析》,朱大铭,马绍汉, 高等教育出版社-nuuc](https://pan.baidu.com/s/19Uhhbp88ZCE2RLNj8Q_M-w) 142 | 143 | 144 | # Contributor 145 | 146 | - [Kaiyi](https://github.com/Kaiyiwing) 147 | - [Contributor List](https://github.com/sailist/AdAlgo/graphs/contributors) -------------------------------------------------------------------------------- /algo/1.md: -------------------------------------------------------------------------------- 1 | # 分析归并排序的时间复杂度,并证明 2 | 3 | ## 归并排序(Merge sort) 4 | 归并排序采用了分而治之的思想,过程可概括为以下几步: 5 | - 将给定的待排序的数组一分为二 6 | - 对两部分数组分别使用归并排序使其有序 7 | - 将有序的两部分数组合并 8 | 9 | ```c 10 | MergeSort(arr[],l,r) 11 | if r > l 12 | middle m = (l+r)/2 //Find the middle point to divide the array into two halves 13 | mergeSort(arr,l,m) //Call mergeSort for first half 14 | mergeSort(arr,m+1,r) //Call mergeSort for second half 15 | merge(arr,l,m,r) //Merge the two halves sorted in step 2 and 3 16 | ``` 17 | 18 | 19 | 20 | ## 复杂度证明(展开法) 21 | 22 | 23 | 根据算法的第一步可知 24 | $$ 25 | T(N) =2 T(\frac{N}{2})+ O(N) 26 | $$ 27 | - $T(n)$ 表示对$n$个数进行归并排序 28 | - $2 T( n/2 )$表示将 $n$ 个数分成两部分分别进行归并排序 29 | - $O(n)$ 表示对两个子过程结束之后合并的过程 30 | 31 | $$ 32 | \begin{aligned} 33 | T(N) &=2 T(N / 2)+ O(N) \\ 34 | &=2\left(2 T(N / 4)+O(\frac{N}{2}) \right)+O(N) \\ 35 | &=4 T(N / 4)+ O(N)+2O(\frac{N}{2}) \\ 36 | &=4 T(N / 4)+2 O(N) \\ 37 | &=8 T(N / 8)+3 O(N) \\ 38 | & \vdots \\ 39 | &=2^{k} T\left(N / 2^{k}\right)+k O(N) 40 | \end{aligned} 41 | $$ 42 | 43 | 当 $N=2^{K}$ 时迭代停止,此时 $K=\log_{2}N$ 44 | 45 | 代入,得 46 | $$ 47 | T(N) = NT(1)+\log_2N\cdot{}O(N) = O(N\log{N}) 48 | $$ 49 | 50 | > **PS1:** 这里假设 N 为偶数,如果不是,那么假设 N 介于 $2^i$ 和 $2^{i+1}$ 之间,通过估计 $T(2^{i+1})$ 来确定 $T(N)$ 的**上界** 51 | 52 | > **PS2:** $O(N) = aN=2O(\frac{N}{2})$,因为大O复杂度只看上界,所以其常数项可以被忽略, 来自于把一个待排序序列分解成两个序列的时间,这一操作可以在常数项内完成(设定一个下标的时间)。 53 | 54 | ## 复杂度证明(假设法) 55 | 56 | 假设 $T(N)=O(NlogN)\leq aN\log{N}+b$,$a,b$ 为常数。 57 | 58 | $N=1$ 时,$T(1)=b$,成立 59 | 60 | $N=k+1$ 时,$\frac{N}{2}=\frac{k+1}{2}\leq k$ 在 $N\geq 2$ 时成立 61 | 62 | $$ 63 | T(\frac{N}{2})\leq a(\frac{N}{2})\log{\frac{N}{2}}+b 64 | $$ 65 | 66 | 因此, 67 | 68 | $$ 69 | \begin{aligned} 70 | 71 | T(N)&\leq 2\textcolor{red}{T(\frac{N}{2})} + C_2N \quad//代入\\ 72 | &\leq 2(a(\frac{N}{2}\log{\frac{N}{2}}+b)+C_2N \\ 73 | &=aN\log{N}-aN\log2+C_2N+2b\\ 74 | &=aNlogN-aN+C_2N+2b 75 | \end{aligned} 76 | $$ 77 | 78 | 即 79 | 80 | $$ 81 | T(N) \leq aNlogN-aN+C_2N+2b 82 | $$ 83 | 84 | 又因为假设 $T(N)=O(NlogN)\leq aN\log{N}+b$,使假设成立,则 85 | 86 | $$ 87 | T(N) \leq \textcolor{red}{aNlogN-aN+C_2N+2b \leq aN\log{N}+b} 88 | $$ 89 | 90 | 解红线的式子,得 91 | 92 | $$ 93 | -aN+C_2N+b \leq 0 94 | $$ 95 | 96 | 当 $a=C_1+C_2,\; b=C_1$ 时不等式成立。 97 | 98 | 得证 -------------------------------------------------------------------------------- /algo/fig/mergeSort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/algo/fig/mergeSort.png -------------------------------------------------------------------------------- /approx/approx.md: -------------------------------------------------------------------------------- 1 | # 近似算法基础 2 | 3 | ## 最优解 4 | 5 | 13 | 14 | 经常用 $OPT_{n}(I)$ 表示关于实例 $I \in D_{\pi}$ 的最优解解值 $M_{n}\left(I, S^{*}\right)$。 15 | 16 | 在不引起混淆的情况下,通常将实例 $I$ 的**最优解的解值**记为 $O P T(I)$ 。 假设算法 $A,$ 对于问题 $\pi$ 的任意实例 $I \in D_{\pi}$, 都可找到相应的可行解 $S \in S_{n}(I),$ 其解值为 $M_{n}(I,S)$。 17 | 18 | 令 $A(I)=M_{n}(I, S),$ 若对于所有实例 $I \in D_{\pi},$ 都有 $A(I)=O P T(I)$, 则称算法 $A$ 为解答问题 $\pi$ 的精确算法。 19 | 20 | 否则, 算法 $A$ 所求出解的解值达不到最优解, 即 $A(I) \neq O P T(I)$, 则称算法 $A$ 为解答问题 $\pi$ 的近似算法。 21 | 22 | 23 | 24 | ## 绝对近似算法 25 | 26 | 给定**优化**问题 $\pi,$ 若有算法 $A,$ 存在一个常数 $K \geqslant 0,$ 使得对于所有实例 $I \in D_{\pi},$ 总有 27 | $$ 28 | |A(I)-O P T(I)| \leqslant K 29 | $$ 30 | 则称算法 $A$ 为解答问题 $\pi$ 的**绝对近似算法**;若 $A$ 为**多项式时间算法**,则称 $A$ 为解答问 题 $\pi$ 的**多项式时间绝对近似算法**。 31 | 32 | -------------------------------------------------------------------------------- /approx/fig/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/approx/fig/1.png -------------------------------------------------------------------------------- /approx/mstmm.md: -------------------------------------------------------------------------------- 1 | # *满足三角不等式的货郎问题的最小生成树算法 2 | 3 | --- 4 | **货郎问题的最小生成树(MST)算法** 5 | 1. 对货郎问题实例的赋权完全图,调用最小生成树算法,得到最小生成树。 6 | 2. 复制最小生成树的每条边,即沿生成树每条边来回走两次,形成欧拉(Eulerien)图。 7 | 3. 在这个欧拉图中寻找其欧拉回路。 8 | 4. 利用“抄近路”方法将欧拉回路变成货郎旅游回路。 9 | 10 | --- 11 | ## 近似性能比证明 12 | 13 | 抄近路即在欧拉回路的顶点序列中,删除重复顶点,得到**每个顶点仅出现一次**的序列,即得到了货郎旅游。 14 | 15 | 16 | 令最小生成树为 $T$,其长度表示为 $d(T)$。定义最优货郎回路长度为 $OPT(I)$。将货郎回路任意去掉一条边,可得一条树 $T'$(可以叫做货郎树?),因为 $T$ 的长度是最小的,所以可得 $d(T)<=d(T') OPT 可以看做是 optimal 的简写。 19 | 20 | 令最小生成树得到的欧拉回路为 $E$,其长度为 $d(E)$,因为 $E$ 是由 $T$ 将所有边完全复制一份得到的,所以 $d(E)=2d(T)$ 21 | 22 | 令由抄近路得到的货郎回路(该回路非最优解)的长度为 $MST(I)$,因为该回路为基于欧拉回路删除边得到的,所以 $MST(I) 最小生成树算法生成货郎回路的核心想法是**在原赋权完全图上生成的欧拉回路生成货郎回路**,原图的欧拉回路则是通过最小生成树复制边生成的。而要将最小生成树通过补边的方式生成欧拉回路,实际上并不需要把所有边都复制一次。 38 | > 39 | > 根据欧拉回路的判定方式(所有点的度数为偶数),只需要把最小生成树中,度数为奇数的点之间的边复制一次即可,这样就可以用更少的复制操作,保证欧拉回路的生成。 40 | 41 | --- 42 | **货郎问题的最小生成树-最小对集(MM)算法** 43 | 1. 对赋权完全图 $G=(F, E)$,调用最小生成树算法,求出 $G$ 的最小生成树 $T$。 44 | 2. 对最小生成树 $T$ 中顶点度为奇数的顶点子集 $V^{\prime}=\left\{a_{1}, a_{2}, \cdots, a_{2 k}\right\}$,调用**最小对集算法**,在图 $G$ 中求出奇数度顶点子集 $V'$ 的最小[对集](../GraphTheory/4.html) $M$。 45 | 3. 将最小生成树 $T$ 添加上 $V'$ 中最小对集 $M$ 中的边,形成欧拉图 $G'$。 46 | 4. 在欧拉图 $G'$ 中求欧拉回路。 47 | 5. 采用“抄近路”方法,将 $G'$ 的欧拉回路变成关于 $G$ 的货郎旅游回路。 48 | 49 | --- 50 | ## 近似性能比证明 51 | 52 | 令在最小对集 $M$ 中的点表示为 $V_M$(即上文的 $V'$),其在赋权完全图 $G$ 上构成的子图表示为 $G_M$(当然也是一个赋权完全图),令在 $G_M$ 上的最优货郎回路表示为 $G_{M'}$,其长度表示为 $OPT(I_M)$。 53 | 54 | 因为(最小对集) $|V_M|<=|V|$,由三角不等式可得 $OPT(I_M)<=OPT(I)$(因为走了更少的点,所以肯定走了更少的边,多走一个点肯定会多两条边少一条边,这三条边可以构成一个三角形,而两边之和大于第三边)。 55 | 56 | 57 | 将对集子图上的货郎回路,隔一条选一条,可以构成两个对集 $M_1$ 和 $M_2$ (两个对集的边合起来即为原货郎回路),可得: 58 | 59 | $$d(M1)+d(M2)=OPT(I_M)$$ 60 | 61 | 易得: 62 | 63 | $$min\{d(M1), d(M2)\}<=OPT(I_M)/2$$ 64 | 65 | 因为 $M$ 是最小对集,可得 66 | 67 | $$d(M)<=min\{d(M_1),d(M_2)\}$$ 68 | 69 | 70 | 由上述比较链可得 71 | 72 | $$d(M)<=min\{d(M_1),d(M_2)\}<=OPT(I_M)/2<=OPT(I)/2 $$ 73 | 74 | 令该算法生成货郎回路(非最优解)的长度表示为 $MM(I)$,因为该货郎回路由欧拉回路 $G'$ 抄近路求得,因此 $MM(I)<=d(G')=d(T)+d(M)$ 75 | 76 | > 在上一题中证明了 $d(T)) 当 PAR 存在划分 $A'$ 的时候,可得$S(A')=S(A-A')=B$,此时 $2S(A)+B+S(A') = 2(S(A)+B)$,得证 21 | 22 | (<-) 当 GPAR 存在划分时候, 23 | 因为 24 | $$S(A)+2S(A)+B=3S(A)+B>2S(A)$$ 25 | 26 | 所以GPAR 问题中新增的两个元素 $\{S(A),2S(A)+B\}$ 不可能同时在一个划分子集中,一定分别在两个子集中。 27 | 28 | 此时,必定存在一个从原 $A$ 中挑选出子集 $A'$,,使得下式成立(GPAR的划分条件): 29 | 30 | $$2S(A)+B+S(A')=2(S(A)+S(A-A'))$$ 31 | 32 | 对上式代入 $S(A')=S(A)-S(A-A')$,以此解得 33 | 34 | $$S(A')=S(A-A')=B$$ 35 | 36 | > **ps1:** 构建元素时是否可以构建 $\{S(A)-B,2S(A)-B\}$?答案是不可以,因为此时存在划分的话,这两个元素可能会在一个子集中。 37 | 38 | 39 | > **ps2:** 可以通过该方法证明任意倍数的广义划分问题。 40 | 41 | > 该证明缺少了一步分情况讨论的步骤,具体请参考[issue#12](https://github.com/sailist/AdAlgo/issues/12) 42 | -------------------------------------------------------------------------------- /doc/2sat.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 2SAT 问题 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

2SAT 问题

28 |

2SAT 问题基于 SAT 问题添加了一个额外约束,即要求每一个项集合由两个元素组成 Ci=2|C_i|=2

29 |
30 |

2SAT 问题是 P 类问题,即可以在多项式时间内解答的问题。除了2SAT 问题,其余的所有 N-SAT 问题均为 NPC 类问题

31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /doc/2sat.md: -------------------------------------------------------------------------------- 1 | # 2SAT 问题 2 | 3 | 4 | 2SAT 问题基于 [SAT](sat.html) 问题添加了一个额外约束,即要求每一个项集合由两个元素组成 $|C_i|=2$。 5 | 6 | > 2SAT 问题是 P 类问题,即可以在多项式时间内解答的问题。除了2SAT 问题,其余的所有 N-SAT 问题均为 NPC 类问题 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /doc/3.md: -------------------------------------------------------------------------------- 1 | # X3C-Y 2 | 3 | 4 | --- 5 | **X3C 问题** 6 | 7 | **实例:** 有限集合 $S$,$|S|=3q$,以及S的三元素子集的集合 $C$ 8 | 9 | **询问:** $C$ 中是否包含 $S$ 的严格覆盖。即是否存在子集 $C'\subseteq C$,使得 $S$ 中每个元素都恰好出现在$C'$的一个成员中。 10 | 11 | --- 12 | **X3C-Y 问题**在 X3C 问题之上额外添加了一个约束条件: 13 | 14 | 令 $C = \{c_1,c_,...,c_n\}$,对任意 $i,j,i \neq j, |c_i \cap c_j|<=1$ 15 | 16 | 17 | > 注意由于是集合,因此三元素集合 C 中的任意两个元素的交集的最大大小为 2,不可能是 3(3 说明两个元素完全相等,这在集合中不可能存在) 18 | --- 19 | 20 | ## NPC 证明 21 | 22 | 构造 X3C 实例 $S$,$C$,其中 23 | 24 | $$S=\{a_1,a_2,...,a_{3q}\}, |S| = 3q$$ 25 | 26 | $$C=\{c_1,c_2,...,c_k\}, |C|=k$$ 27 | 28 | 在此基础上构建 X3C-Y 实例 $T$,$D$。 29 | 30 | 新增 $6k$ 个元素, 分别编号为 $b_{1,1},b_{1,2},...,b_{1,6},...,b_{2,1},b_{2,6},...,b_{k,1},b_{k,6}$,则 31 | 32 | $$T = S \cup \{b_{1,1},b_{1,2},...,b_{1,6},...,b_{2,1},b_{2,6},...,b_{k,1},b_{k,6}\}$$ 33 | 34 | 对 D 的构建,将 C 中每一个元素,相应替换为 D 中的 五个元素,替换如下: 35 | 36 | 将 $c_i=\{a_{f(i)}, a_{g(i)}, a_{h(i)}\}$ 替换为 37 | 38 | $$d_{i,1} = \{a_{f(i)}, b_{i,1}, b_{i,4}\}$$ 39 | $$d_{i,2} = \{a_{g(i)}, b_{i,2}, b_{i,5}\}$$ 40 | $$d_{i,3} = \{a_{h(i)}, b_{i,3}, b_{i,6}\}$$ 41 | $$d_{i,4} = \{b_{i,1}, b_{i,2}, b_{i,3}\}$$ 42 | $$d_{i,5} = \{b_{i,4}, b_{i,5}, b_{i,6}\}$$ 43 | 44 | 45 | 显然,上述变换可以在多项式时间内完成 46 | 47 | > **ps:** 注意区分 $b$ 和 $d$,$b$ 是新增的布尔变量元素,$d$ 是新增的项元素, $b$ 每一个项新增 6 个, $d$ 每一个项变换出 5 个 48 | 49 | (->) 若 X3C 中存在 $C'$ 是 $S$ 的严格覆盖,则 X3C-Y 实例中的严格覆盖 $D'$ 可以按照如下方式选择: 50 | 51 | - $C'$ 中每一个 $c_i$ 元素对应选择 $D$ 集合中的三个元素 $d_{i,1},d_{i,2},d_{i,3}$ 。此时 $T$ 中来自原 $S$ 的所有元素均出现一次,且和 $c_i$ 对应的所有的 $b_{i,1}\sim b_{i,6}$ 均出现一次。 52 | 53 | - 对于还未被选中的所有 $b$,也即对 $C-C'$ 中的每一个元素 $c_j$,选择 $D$ 集合的两个元素 $d_{j,4},d_{j,5}$。 54 | 55 | 上述两个步骤选择出的元素构成的子集 $D'$ 可以构成对 T 的严格覆盖。 56 | 57 | (<-) 若 X3C-Y 中存在 $D'$ 是 T 的严格覆盖,对于同一个 j 对应的五个元素 $d_{j,1}\sim d_{j,5}$,可得要么同时选中 $d_{j,1}\sim d_{j,3}$,要么同时选中 $d_{j,4},d_{j,5}$ 两个。 58 | 59 | 此时令严格匹配 D' 中的每三个元素 $d_{j,1}\sim d_{j,3}$ 对应选择原 X3C 问题中的 $c_j$,可得该种方式构成的子集 $C'$,恰好为对 $S$ 的严格覆盖。 60 | 61 | 上述说明比较难以理解,下面通过一个简单的例子来说明对应过程: 62 | ``` 63 | 例如, 64 | X3C 实例项集合为 C = {c1-c5},5个元素,那么相应构建的 X3C-Y 实例的项集合即为 D={d1(1-5),d2(1-5),...,d5(1-5)},共 25 个元素 65 | 66 | 假如可以找到一个 X3C 的严格覆盖 C'={c1,c3,c5},那么X3C-Y 的严格覆盖 D' 就是 {d1(1-3),d3(1-3),d5(1-3), d2(4-5),d4(4-5)},反之同理。 67 | ``` 68 | 69 | 70 | 71 | 72 | > **ps2:** [issue#4](https://github.com/sailist/AdAlgo/issues/4) 鉴于 X3C-Y 是 X3C 的子问题,是否有必要证明其必要性? 及其讨论。 73 | 74 | > **ps3:** [issue#9](https://github.com/sailist/AdAlgo/issues/9) X3C-Y 实例和 X3C 实例对应关系的讨论 -------------------------------------------------------------------------------- /doc/3dm.md: -------------------------------------------------------------------------------- 1 | # 三对集(3DM)问题。 2 | 3 | **实例:** 集合 $M \subseteq W \times X \times Y,$ 其中 $W 、 X 、 Y$ 是互不相交的集合, $\quad$ 且 $|W=| X|=| Y \mid=q$ 。 4 | 5 | > $\times$ 表示笛卡尔积,表示两个集合中元素的所有组合可能,$\{1,2\} \times \{3,4\} = \{\{1,3\},\{1,4\},\{2,3\},\{2,4\}\}$, 在该问题中,$M$ 中的每一个元素是一个三元组,每个三元组的三个分量分别来自 $W,X,Y$ 6 | 7 | 8 | **询问:** $M$ 是否包含有一个完美对集(matching) $M^{\prime} \subseteq M,$ 使得 $|M^{\prime}|=q$ 且 $M^{\prime}$ 中没有任何 两个三元组有相同分量。 若 $M$ '是完美对集,则 $W 、 X 、 Y$ 中的每一个元素必出现在 $M^{\prime}$ 的一个且仅一个三元组中。 9 | 10 | > 对 $W=\{1,2\},X=\{3,4\},Y=\{5,6\}$ 而言,若 $M=\{\{1,3,5\},\{2,4,6\},\{1,3,6\}\}$,那么 $M'$ 存在且 $M'=\{\{1,3,5\},\{2,4,6\}\}$ 是一个完美对集。 11 | > 12 | > 若 $M=\{\{1,2,4\},\{2,4,6\},\{1,3,6\}\}$,那么该集合中就不存在完美对集,使得所有来自 $W,X,Y$ 中的元素仅出现一次。 13 | 14 | 15 | 通过将 3DM 多项式归约到 [3SAT](3sat.html) 问题来证明该问题属于 NPC 16 | 17 | ## NPC 证明 18 | 19 | 暂略 20 | 21 | 22 | -------------------------------------------------------------------------------- /doc/3sat.md: -------------------------------------------------------------------------------- 1 | # 3SAT 问题 2 | 3 | 3SAT 问题基于 [SAT](sat.html) 问题添加了一个额外约束,即要求每一个项集合由三个元素组成 $|C_i|=3$。 4 | 5 | **实例** 6 | 7 | 布尔变量集合 8 | $$U=\left\{u_{1}, u_{2}, \cdots, u_{n}\right\},$$ 9 | 项集合(也就是多个布尔变量或其取反后的布尔变量构成的集合) 10 | $$C=\left\{C_{1}, C_{2}, \cdots, C_{m}\right\},$$ 11 | 其中 12 | $$C_{i}=\left\{u[i, 1], \cdots, u\left[i, k_{i}\right]\right\} 13 | \subseteq U \cup \vec{U}, \quad \bar{U}=\left\{\bar{u}_{1}, \cdots, \bar{u}_{n}\right\},\color{red}{|C_i|=3}$$ 14 | 15 | **询问** 是否存在 $U$ 的真值指派: 16 | $U \rightarrow\{\mathrm{F}, \mathrm{T}\},$ 满足 17 | 18 | $$\bigwedge_{i=1}^{m}\left(\sum_{j=1}^{k_{i}} u[i, j]\right)=\mathrm{T}$$ 19 | 20 | 该问题首先是 NP 问题,接下来,通过将 SAT 问题归约到 3SAT 问题来证明 3SAT 是 NPC。 21 | 22 | 归约的核心思路是对 [SAT](sat.html) 问题实例中的项集合中的项元素进行变换,使得大小不是 3 的项元素通过某种方式转变为 1个或多个大小为 3 的项元素 23 | 24 | ## NPC 证明 25 | 26 | 将不是由 3 个布尔变量组成的项被转换为等价的、由 3 个布尔变量组成的等价项,需要分情况讨论。 27 | 28 | ## K=1 29 | $$ C_1=\{z_1\} $$ 30 | 对这种情况,可以在布尔变量集合中增加两个布尔变量 ${y11, y12}$,把 $C_1$ 变换为 4 个包含三个布尔变量的项(注意四恰好是两个布尔变量的可能性组合数,即构造方法): 31 | 32 | $$ 33 | \begin{array}{c} 34 | 35 | \left\{z_{1}, y_{j}^{(1)}, y_{j}^{(2)}\right\}, \quad\left\{z_{1}, y_{j}^{(1)}, \bar{y}_{j}^{(2)}\right\}, \quad\left\{z_{1}, \bar{y}_{j}^{(1)}, y_{j}^{(2)}\right\}, \quad\left\{z_{1}, \bar{y}_{j}^{(1)}, \bar{y}_{j}^{(2)}\right\} 36 | \end{array} 37 | $$ 38 | 39 | ## k=2 40 | $$C_1=\{z_1,z_2\}$$ 41 | 42 | 新增 1 个布尔变量,拆成两项: 43 | 44 | $$ 45 | \left\{z_{1}, z_{2}, y_{j}^{(1)}\right\},\left\{z_{1}, z_{2}, \bar{y}_{j}^{(1)}\right\} 46 | $$ 47 | 48 | ## k=3 49 | 保持原样 50 | 51 | ## k=4 52 | $$C_1=\{z_1,z_2,z_3,z_4\}$$ 53 | 54 | 增加一个布尔变量,拆成两项(2-2 分到两个项中): 55 | 56 | $$ 57 | \left\{z_{1}, z_{2}, y_{j}^{(1)}\right\},\left\{z_{3}, z_{4}, \bar{y}_{j}^{(1)}\right\} 58 | $$ 59 | 60 | ## k=5 61 | 62 | $$C_1=\{z_1,z_2,...,z_5\}$$ 63 | 64 | 增加两个布尔变量,拆成3项(上述的5个元素分别分 2,2,1 个到这三项中): 65 | 66 | $$ 67 | \left\{z_{1}, z_{2}, y_{j}^{(1)}\right\},\left\{z_{4}, z_{5}, \bar{y}_{j}^{(2)}\right\},\left\{z_{3},y_{j}^{(2)} , \bar{y}_{j}^{(1)}\right\} 68 | $$ 69 | 70 | 71 | ## k>3 72 | 发现 $k>3$ 以上的情况可以进行归纳,即新增 $k-3$ 个布尔变量,从头尾各自拆出两个元素和一个新增布尔变量的一种情况分在一起,然后中间的元素每一个和两个新增布尔变量的一种情况分在一起,即 73 | 74 | $$ 75 | \begin{array}{c} 76 | C^{\prime}[j]=\left\{\left\{z_{1}, z_{2}, y_{j}^{(1)}\right\},\left\{\bar{y}_{j}^{(k-3)}, z_{k-1}, z_{k}\right\}\right\} \\ 77 | \cup\left\{\left\{\bar{y}_{j}^{(i)}, z_{i+2}, y_{j}^{(i+1)}\right\} \mid 1 \leqslant i \leqslant k-4\right\} 78 | \end{array} 79 | $$ 80 | 81 | 82 | 83 | 通过更具体的证明可得,对于上述的所有情况: 84 | 1. 存在真值指派使 SAT 项满足<==>则存在真值指派使 3SAT 所有项满足 85 | 2. 存在真值指派使 3SAT 项满足<==>则存在真值指派使 SAT 所有项满足 86 | 87 | -------------------------------------------------------------------------------- /doc/4gcp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 顶点度不超过4的无向简单图上的图三着色问题 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

顶点度不超过4的无向简单图上的图三着色问题

28 |

难度: 该问题也是 NPC 问题。

29 |

该问题可以通过一般图三着色问题归约到该问题证明。

30 |

NPC 证明

31 |

下面构造一种特殊的图:

32 |

33 |

会发现该图有一些很良好的性质:

34 |
    35 |
  • 所有点度数不超过 4
  • 36 |
  • 能够被三着色但不能被二着色
  • 37 |
  • 对任意三着色方案,最外围的三个点一定是相同的颜色(可以遍历试一下这一结论)
  • 38 |
39 |

这使得该图可以被简单的叠加在一起,且外围所有的点都具有相同的颜色

40 |

41 |

当该图 GG' 重复三次时,就会有 5 个点一定具有相同的颜色,重复 K 次时,就会有 K+2 个点具有相同的颜色。

42 |

那么对于一般图中,顶点度数 deg(e)deg(e) 大于 4 的点 ee。可以将该顶点删除,并将原来和该顶点连接在一起的边和重复了 K=deg(e)2K=deg(e)-2 次的边缘点依次连接。

43 |

(<-) 这样,当新图存在三着色时,将特殊图边缘的颜色对应到原图中的点的颜色即可

44 |

(->) 当原图存在三着色时,构建相应的特殊图,则新图也存在三着色

45 |

可以通过一个例子来简单的理解这种操作:

46 |

因为我们只利用图 GG' 的外围三个点,因此其可以被如下的抽象:

47 |

48 |

当遇到如下的一般图(存在度大于4的点)时

49 |

50 |

中间的度为 6 的点可以用重复了 4 次的图 GG' 代替:

51 |

52 |

从而将原图替换为如下的新图,保证每个点的度数不超过 4:

53 |

54 | 55 | 56 | -------------------------------------------------------------------------------- /doc/4gcp.md: -------------------------------------------------------------------------------- 1 | # 顶点度不超过4的无向简单图上的图三着色问题 2 | 3 | **难度:** 该问题也是 NPC 问题。 4 | 5 | 该问题可以通过一般[图三着色问题](gcp.html)归约到该问题证明。 6 | 7 | 8 | ## NPC 证明 9 | 10 | 下面构造一种特殊的图: 11 | 12 | ![](fig/9.png) 13 | 14 | 会发现该图有一些很良好的性质: 15 | 16 | - 所有点度数不超过 4 17 | - 能够被三着色但不能被二着色 18 | - 对任意三着色方案,最外围的三个点一定是相同的颜色(可以遍历试一下这一结论) 19 | 20 | 这使得该图可以被简单的叠加在一起,且外围所有的点都具有相同的颜色 21 | 22 | ![](fig/10.png) 23 | 24 | 当该图 $G'$ 重复三次时,就会有 5 个点一定具有相同的颜色,重复 K 次时,就会有 K+2 个点具有相同的颜色。 25 | 26 | 那么对于一般图中,顶点度数 $deg(e)$ 大于 4 的点 $e$。可以将该顶点删除,并将原来和该顶点连接在一起的边和重复了 $K=deg(e)-2$ 次的边缘点依次连接。 27 | 28 | 29 | (<-) 这样,当新图存在三着色时,将特殊图边缘的颜色对应到原图中的点的颜色即可 30 | 31 | (->) 当原图存在三着色时,构建相应的特殊图,则新图也存在三着色 32 | 33 | 34 | 可以通过一个例子来简单的理解这种操作: 35 | 36 | 因为我们只利用图 $G'$ 的外围三个点,因此其可以被如下的抽象: 37 | 38 | ![](fig/11.png) 39 | 40 | 当遇到如下的一般图(存在度大于4的点)时 41 | 42 | ![](fig/14.png) 43 | 44 | 中间的度为 6 的点可以用重复了 4 次的图 $G'$ 代替: 45 | 46 | ![](fig/12.png) 47 | 48 | 从而将原图替换为如下的新图,保证每个点的度数不超过 4: 49 | 50 | ![](fig/13.png) -------------------------------------------------------------------------------- /doc/clique.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 团(clique)问题 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

团(clique)问题

28 |

实例: G=(V,E)G=(V, E),一个非负整数J<=VJ<=|V|

29 |

询问: 是否存在 VV 的子集 VVV'\subseteq VVJ|V'|\geq J,使任意u,vVu, v\in V',总有(u,v)E(u,v)\in E。 也即在图 GG 中找一个点数大于 JJ 的完全图(当然,也是子图)。

30 |

该问题的证明可以通过独立集问题归约证明。

31 |

NPC 证明

32 |

定理:原图中有一个大小为 JJ 的独立集,当且仅当原图的补图中存在一个大小为 JJ 的完全图。

33 |

分析:因为独立集要求集合中任意两点之间没有边,因此对应到补图中时,任意两点之间就都有边,即完全图。

34 |

因此独立集问题可以等价于其补图的团问题。

35 | 36 | 37 | -------------------------------------------------------------------------------- /doc/clique.md: -------------------------------------------------------------------------------- 1 | # 团(clique)问题 2 | 3 | 4 | **实例:** $G=(V, E)$,一个非负整数$J<=|V|$ 5 | 6 | **询问:** 是否存在 $V$ 的子集 $V'\subseteq V$,$|V'|\geq J$,使任意$u, v\in V'$,总有$(u,v)\in E$。 也即在图 $G$ 中找一个点数大于 $J$ 的完全图(当然,也是子图)。 7 | 8 | 该问题的证明可以通过[独立集问题](ivs.html)归约证明。 9 | 10 | # NPC 证明 11 | 12 | 定理:原图中有一个大小为 $J$ 的独立集,当且仅当原图的[补图](./../GraphTheory/5.html)中存在一个大小为 $J$ 的完全图。 13 | 14 | 分析:因为独立集要求集合中任意两点之间没有边,因此对应到补图中时,任意两点之间就都有边,即完全图。 15 | 16 | 17 | 因此独立集问题可以等价于其补图的团问题。 -------------------------------------------------------------------------------- /doc/fig/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/1.png -------------------------------------------------------------------------------- /doc/fig/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/10.png -------------------------------------------------------------------------------- /doc/fig/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/11.png -------------------------------------------------------------------------------- /doc/fig/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/12.png -------------------------------------------------------------------------------- /doc/fig/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/13.png -------------------------------------------------------------------------------- /doc/fig/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/14.png -------------------------------------------------------------------------------- /doc/fig/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/15.png -------------------------------------------------------------------------------- /doc/fig/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/16.png -------------------------------------------------------------------------------- /doc/fig/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/17.png -------------------------------------------------------------------------------- /doc/fig/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/18.png -------------------------------------------------------------------------------- /doc/fig/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/19.png -------------------------------------------------------------------------------- /doc/fig/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/2.png -------------------------------------------------------------------------------- /doc/fig/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/20.png -------------------------------------------------------------------------------- /doc/fig/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/21.png -------------------------------------------------------------------------------- /doc/fig/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/22.png -------------------------------------------------------------------------------- /doc/fig/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/23.png -------------------------------------------------------------------------------- /doc/fig/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/24.png -------------------------------------------------------------------------------- /doc/fig/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/3.png -------------------------------------------------------------------------------- /doc/fig/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/4.png -------------------------------------------------------------------------------- /doc/fig/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/5.jpg -------------------------------------------------------------------------------- /doc/fig/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/6.png -------------------------------------------------------------------------------- /doc/fig/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/7.png -------------------------------------------------------------------------------- /doc/fig/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/8.png -------------------------------------------------------------------------------- /doc/fig/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/doc/fig/9.png -------------------------------------------------------------------------------- /doc/gcp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 图着色问题(Graph Coloring Problem) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

图着色问题(Graph Coloring Problem)

28 |

图着色问题(英语:Graph Coloring Problem,简称GCP),又称着色问题,是最著名的NP-完全问题之一。

29 |

给定一个无向图 G=(V,E)G=(V,E),其中 VV 为顶点集合,EE 为边集合,图着色问题即为将 VV 分为 KK 个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的 KK 值。

30 |

和图着色相关的有四个概念:

31 |
    32 |
  • 色数(chromatic number),也被称为顶点色数(vertex chromatic number),指将一张图上的每个顶点染色,使得相邻的两个点颜色不同,最小需要的颜色数。最小染色数用 χ(G)\chi(G) 表示
  • 33 |
  • 最大团 的顶点数被称为 GG 的团数,表示为 ω(G)\omega(G)
  • 34 |
35 |

不难证明,色数大于等于团数(染一个最大团就需要 ω(G)\omega(G) 种不同的颜色),即:

36 |

χ(G)ω(G)\chi(G) \geq \omega(G) 37 |

38 |

以及

39 |
    40 |
  • 团覆盖数,覆盖图的所有顶点所需要的完全子图的最小个数,用 κ(G)\kappa(\mathrm{G}) 表示。
  • 41 |
  • 最大独立集,它的顶点数被称为 GG 的独立数,记为 α(G)\alpha (G)
  • 42 |
43 |

也可以证明,团覆盖数大于等于独立数(最大独立集的每个点至少需要一个团来覆盖),即

44 |

κ(G)α(G)\kappa(G) \geq \alpha(G) 45 |

46 |

问题难度

47 |
    48 |
  • 一般图的二着色问题多项式可解,k(k>=3)着色是 NPC
  • 49 |
  • 平面图的三着色是 NPC,四着色未知但可解(暴力搜索),无着色是多项式可解的。
  • 50 |
51 | 52 | 53 | -------------------------------------------------------------------------------- /doc/gcp.md: -------------------------------------------------------------------------------- 1 | # 图着色问题(Graph Coloring Problem) 2 | 3 | 4 | 图着色问题(英语:Graph Coloring Problem,简称GCP),又称着色问题,是最著名的NP-完全问题之一。 5 | 6 | 给定一个无向图 $G=(V,E)$,其中 $V$ 为顶点集合,$E$ 为边集合,图着色问题即为将 $V$ 分为 $K$ 个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的 $K$ 值。 7 | 8 | 和图着色相关的有四个概念: 9 | 10 | - **色数(chromatic number)**,也被称为顶点色数(vertex chromatic number),指将一张图上的每个顶点染色,使得相邻的两个点颜色不同,最小需要的颜色数。最小染色数用 $\chi(G)$ 表示 11 | - [最大团](clique.html) 的顶点数被称为 $G$ 的团数,表示为 $\omega(G)$ 12 | 13 | 14 | 不难证明,色数大于等于团数(染一个最大团就需要 $\omega(G)$ 种不同的颜色),即: 15 | 16 | $$ 17 | \chi(G) \geq \omega(G) 18 | $$ 19 | 20 | 以及 21 | - 团覆盖数,覆盖图的所有顶点所需要的完全子图的最小个数,用 $\kappa(\mathrm{G})$ 表示。 22 | - [最大独立集](./../GraphTheory/3.html),它的顶点数被称为 $G$ 的独立数,记为 $\alpha (G)$ 23 | 24 | 也可以证明,团覆盖数大于等于独立数(最大独立集的每个点至少需要一个团来覆盖),即 25 | 26 | $$\kappa(G) \geq \alpha(G)$$ 27 | 28 | 29 | ## 问题难度 30 | 31 | - 一般图的二着色问题多项式可解,k(k>=3)着色是 NPC 32 | - 平面图的三着色是 NPC,四着色未知但可解(暴力搜索),无着色是多项式可解的。 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /doc/hc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 哈密顿回路(Hamiltonian Cycle, HC) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

哈密顿回路(Hamiltonian Cycle, HC)

28 |

哈密顿回路 问题的形式化定义如下:

29 |

实例: 无向简单图 G=(V,E)G=(V,E),其中 V={v1,v2,...,vn}V=\{v_1,v_2,...,v_n\}

30 |

询问: 图 G 中是否存在一条哈密顿回路。

31 |

该问题的证明思路是通过顶点覆盖问题归约证明。

32 |

核心思路

33 |

直接想太难了,从已知来推未知更容易理解一些。

34 |

下图为一个顶点覆盖图,红色的点是顶点覆盖集。 35 |

36 |

按照下面的步骤先把路径走一遍,先不用管合理性。

37 |

38 |

步骤是这样的,先走黑色的箭头,然后顺着黄色的箭头转到下一个序号的黑色箭头,遍历完定点覆盖点集的第一个点的所有边,然后顺着蓝色的箭头“瞬移”到第二个点。

39 |

40 |

按照相同的步骤,顺着黑色-黄色的顺序遍历完全部的和第二个点相连的边,然后顺着蓝色的箭头“瞬移”到第三个点。

41 |

42 |

同上,顺着黑黄的顺序遍历与第三个点相连的边。

43 |

观察上面的过程,可以发现几点。

44 |
    45 |
  • 这一过程中,黄色的箭头和蓝色的箭头,他们的边在图上是没有的,是被想象构建出来的。
  • 46 |
  • 点可能被重复覆盖了多次,但所有的实际的黑色的边,只走了一次或两次。
  • 47 |
48 |

那下面就可以通过特殊的构造,将想象出的黄线和蓝线“合法化”。

49 |

首先,将所有的边换成下面这种图,叫做检测覆盖子图(也叫梯子图):

50 |

51 |

会发现该类图存在一些特殊的和遍历相关性质。如果要穿过子图所有的点将该图走一遍,且只能从序号为1的点开始从序号为6的点结束的话,那么走一遍的话只有两种走法,即下图 (a),(b);走两遍的话只有一种走法,即下图(c)(分别走两边)。 52 |

53 |

之后,将于每个点相关联的边对应的检测子图上,按顺序穿起来(相邻的两个子图的起点和终点之间加一条边,最后一个子图的终点和第一个子图的起点之间加一条边),如下图:

54 |

55 |

随后,再在 K 个顶点之间,加一条边。

56 |

这样就完成了上面想象中的那种走法。一一对比,可以发现:

57 |
    58 |
  • 如果遍历时相邻的点不在覆盖集合中,那么只需要走一次,相应的检测覆盖子图按照(a)/(b)的走法来到相邻的下一个检测覆盖子图,直到完成后回到起点。
  • 59 |
  • 如果遍历时相邻的点也在覆盖集合中,那么这条边肯定需要,且最多遍历两次,那么相应的检测覆盖子图按照(c)的走法来到相邻的下一个检测覆盖子图上,直到完成后回到起点。
  • 60 |
61 |

由此,如果存在顶点覆盖,则可以在检测覆盖子图和在其上附加的边中找一条哈密顿回路,反之同理。

62 |
63 |

直觉告诉我似乎漏了什么情况,但核心意图是这样子的,仅供理解。如果有问题或者确实没问题,欢迎 issue / pr 告知

64 |
65 |

NPC 证明

66 |

暂略

67 | 68 | 69 | -------------------------------------------------------------------------------- /doc/hc.md: -------------------------------------------------------------------------------- 1 | # 哈密顿回路(Hamiltonian Cycle, HC) 2 | [哈密顿回路](./../GraphTheory/2.html) 问题的形式化定义如下: 3 | 4 | **实例:** 无向简单图 $G=(V,E)$,其中 $V=\{v_1,v_2,...,v_n\}$。 5 | 6 | **询问:** 图 G 中是否存在一条哈密顿回路。 7 | 8 | 该问题的证明思路是通过[顶点覆盖问题](./vc.html)归约证明。 9 | 10 | ## 核心思路 11 | 12 | 直接想太难了,从已知来推未知更容易理解一些。 13 | 14 | 下图为一个顶点覆盖图,红色的点是顶点覆盖集。 15 | ![](fig/21.png) 16 | 17 | 按照下面的步骤先把路径走一遍,先不用管合理性。 18 | 19 | ![](fig/22.png) 20 | 21 | 步骤是这样的,先走黑色的箭头,然后顺着黄色的箭头转到下一个序号的黑色箭头,**遍历完**定点覆盖点集的第一个点的所有边,然后顺着蓝色的箭头“瞬移”到第二个点。 22 | 23 | ![](fig/23.png) 24 | 25 | 按照相同的步骤,顺着黑色-黄色的顺序遍历完全部的和第二个点相连的边,然后顺着蓝色的箭头“瞬移”到第三个点。 26 | 27 | ![](fig/24.png) 28 | 29 | 同上,顺着黑黄的顺序遍历与第三个点相连的边。 30 | 31 | 观察上面的过程,可以发现几点。 32 | 33 | - 这一过程中,黄色的箭头和蓝色的箭头,他们的边在图上是没有的,是被想象构建出来的。 34 | - 点可能被重复覆盖了多次,但所有的实际的黑色的边,只走了一次或两次。 35 | 36 | 37 | 那下面就可以通过特殊的构造,将想象出的黄线和蓝线“合法化”。 38 | 39 | 首先,将所有的边换成下面这种图,叫做检测覆盖子图(也叫梯子图): 40 | 41 | 42 | ![](fig/2.png) 43 | 44 | 会发现该类图存在一些特殊的和遍历相关性质。如果要**穿过子图所有的点将该图走一遍**,且只能**从序号为1的点开始**,**从序号为6的点结束**的话,那么走一遍的话只有两种走法,即下图 (a),(b);走两遍的话只有一种走法,即下图(c)(分别走两边)。 45 | ![](fig/3.png) 46 | 47 | 之后,将于每个点相关联的边对应的检测子图上,按顺序穿起来(相邻的两个子图的起点和终点之间加一条边,最后一个子图的终点和第一个子图的起点之间加一条边),如下图: 48 | 49 | ![](fig/4.png) 50 | 51 | 随后,再在 K 个顶点之间,加一条边。 52 | 53 | 这样就完成了上面想象中的那种走法。一一对比,可以发现: 54 | 55 | - 如果遍历时相邻的点不在覆盖集合中,那么只需要走一次,相应的检测覆盖子图按照(a)/(b)的走法来到相邻的下一个检测覆盖子图,直到完成后回到起点。 56 | - 如果遍历时相邻的点也在覆盖集合中,那么这条边肯定需要,且最多遍历两次,那么相应的检测覆盖子图按照(c)的走法来到相邻的下一个检测覆盖子图上,直到完成后回到起点。 57 | 58 | 由此,如果存在顶点覆盖,则可以在检测覆盖子图和在其上附加的边中找一条哈密顿回路,反之同理。 59 | 60 | > 直觉告诉我似乎漏了什么情况,但核心意图是这样子的,仅供理解。如果有问题或者确实没问题,欢迎 issue / pr 告知 61 | 62 | ## NPC 证明 63 | 64 | 暂略 -------------------------------------------------------------------------------- /doc/ivs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 独立集问题(Idpendent Vertice Set,IVS) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

独立集问题(Idpendent Vertice Set,IVS)

28 |

独立集问题可以形式化表示为:

29 |

实例:G=(V,E)G=(V,E),正整数KK

30 |

询问: 是否存在 VV 的子集VV',满足任意两点 u,vVu,v\in V'(u,v)∉E(u,v)\not\in EV>=K|V'|>=K

31 |

该问题可以通过由 顶点覆盖问题 归约证明

32 |

NPC 证明

33 |

如果一个图 G=(V,E)G=(V,E) 存在一个顶点覆盖 V<=L|V'|<=L,那么就存在一个独立集 V>=VL|V''|>=|V|-L

34 |

因为按照顶点覆盖的定义,其覆盖集 V|V'| 中的所有点,都有一条边与其相连,那么将 |V'| 从图 G 中删去时,图中就不再存在任何边,那么剩下的点自然就成为了独立集(也即任意两点之间不存在边)。

35 |
36 |

也可以得出, 顶点覆盖集+独立集=全部点集

37 |
38 |

构造独立集问题实例,只需要在顶点覆盖问题实例的基础上,令 V>=VL|V'|>=|V|-L 即可。

39 | 40 | 41 | -------------------------------------------------------------------------------- /doc/ivs.md: -------------------------------------------------------------------------------- 1 | # 独立集问题(Idpendent Vertice Set,IVS) 2 | 3 | [独立集](./../GraphTheory/3.html)问题可以形式化表示为: 4 | 5 | **实例:** 图 $G=(V,E)$,正整数$K$, 6 | 7 | **询问:** 是否存在 $V$ 的子集$V'$,满足任意两点 $u,v\in V'$,$(u,v)\not\in E$,$|V'|>=K$。 8 | 9 | 10 | 该问题可以通过由 [顶点覆盖问题](./vc.html) 归约证明 11 | 12 | 13 | ## NPC 证明 14 | 15 | 如果一个图 $G=(V,E)$ 存在一个顶点覆盖 $|V'|<=L$,那么就存在一个独立集 $|V''|>=|V|-L$ 。 16 | 17 | 因为按照顶点覆盖的定义,其覆盖集 $|V'|$ 中的所有点,都有一条边与其相连,那么将 |V'| 从图 G 中删去时,图中就不再存在任何边,那么剩下的点自然就成为了独立集(也即任意两点之间不存在边)。 18 | 19 | > 也可以得出, 顶点覆盖集+独立集=全部点集 20 | 21 | 构造独立集问题实例,只需要在顶点覆盖问题实例的基础上,令 $|V'|>=|V|-L$ 即可。 22 | 23 | -------------------------------------------------------------------------------- /doc/knapsack.md: -------------------------------------------------------------------------------- 1 | # 背包问题 2 | 3 | 背包问题有些类似很多年以前的购物的综艺节目:如何装满购物车使得物品总价值最大,注意到物品除了价值以外,还有体积属性。 4 | 5 | 背包(判定)问题询问是否能从一堆物体中找一个子集,使得物品的总体积小于某值,总价值大于某值。 6 | 7 | --- 8 | **实例:** 有限集合 $U,$ 每个元素 $u \in U,$ 都有相立的长度(体积) $S(u) \in Z^{+}$ 和价值 $V(u) \in Z^{+},$ 并且有常数 $B \in Z^{+}$ 和 $K \in Z^{+}$ 。 9 | 10 | **询问:** 是否存在子集 $U^{\prime} \subseteq U,$ 满足 $\sum_{u \in U} S(u) \leqslant B, \quad \sum_{u \in U} V(u) \geqslant K_{\circ}$ 11 | 12 | --- 13 | 14 | 该问题可以通过[划分问题](par.html)多项式归约证明为 NPC 15 | 16 | ## NPC 证明 17 | 18 | 对背包问题的实例施加限制:对任意 $u \in U,$ 取 $S(u)=V(u)$ 且 $\sum_{u \in U} S(u)$ 为偶数, 19 | 取 $B=K=\frac{1}{2} \sum_{u \in U} S(u)$ 。 20 | 21 | 如此限制的实例为划分问题实例。 22 | 23 | > 这里的逻辑有必要重新叙述一遍:对背包问题的实例施加限制后转变为了划分实例,表示的意思是,所有的划分实例都可以看成是背包问题施加了限制后的实例,也即划分实例可以被转换为背包问题实例的一个子集。 24 | 25 | 26 | ## 近似算法性能比 27 | 28 | 29 | 30 | --- 31 | 1. 将 $n$ 个元素排序得到 $L=\left\{\left(P_{1}, W_{1}\right),\left(P_{2}, W_{2}\right), \cdots,\left(P_{n}, W_{n}\right)\right\},$ 满足: 32 | $$ 33 | \frac{P_{1}}{W_{1}} \geqslant \frac{P_{2}}{W_{2}} \geqslant \cdots \geqslant \frac{P_{n}}{W_{n}} 34 | $$ 35 | 2. 采用贪心算法 $GA,$ 在主次表 $L$ 中,自标号为 1 的元素到标号为 $n$ 的 元素,逐个试装入背包,若标号 $i$ 的元素能装入背包,则取 $x_{i}=1,$ 否 则取 $x_{i}=0$ 。直到不能装入为止,得到一个可行解,其解值为 $G A(I)$ 。 36 | 3. 取 $A(I)=\max \left\{G A(I), \max _{1 \leqslant i \leqslant n} P_{i}\right\}$ 所对应的元素装入背包,得实例 $I$ 的可行解。 37 | 38 | --- 39 | 40 | 背包问题有多项式时间近似算法 $A,$ 其绝对性能比 $R_{A}<2$ 。 41 | 42 | **证明:** 43 | 44 | 因为背包问题重量上限为 B,令最优解为 $OPT(I)$,则设正整数 $r$,满足 $\sum_{i=1}^{r} W_{i} \leqslant B, \sum_{i=1}^{r+1} W_{i}>B$。 45 | 46 | 易得 47 | 48 | $$ 49 | O P T(I)<\sum_{i=1}^{r+1} P_{i} \leqslant \sum_{i=1}^{r} P_{i}+\max _{1 \leqslant i \leqslant n} P_{i} \leqslant 2 A(I) 50 | $$ 51 | 52 | 其中因为 $A(I)=\max \left\{G A(I), \max _{1 \leqslant i \leqslant n} P_{i}\right\}$,所以 53 | 54 | $$\sum_{i=1}^{r} P_{i}+\max _{1 \leqslant i \leqslant n} P_{i} \leqslant 2 A(I)$$ 55 | 56 | 所以 57 | 58 | $$ 59 | R_{A}(I)=\frac{O P T(I)}{A(I)}<2 60 | $$ 61 | 62 | $$R_{A}=\inf \{R_{A}(I) \mid I 为背包问题任意实例 \}<2$$ 63 | 64 | 65 | 66 | 67 | ## 背包问题无多项式时间绝对近似算法的证明 68 | 69 | 暂略 70 | -------------------------------------------------------------------------------- /doc/mc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 最小集合覆盖问题(Minimum set Cover) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

最小集合覆盖问题(Minimum set Cover)

28 |

这又是一个覆盖问题,不同的是,该问题只要求覆盖,不要求严格覆盖。

29 |

实例: 集合 S={s1,,sn},S=\left\{s_{1}, \ldots, s_{n}\right\}, SS 的子集的集合 C={c1,c2,,cm},ciSC=\left\{c_{1}, c_{2}, \ldots, c_{m}\right\},c_i\subset S

30 |

询问: 是否存在 CC 的子集 CC',使 Ck,kZ+\left|C^{\prime}\right| \leq k, k \in Z^{+},且

31 |

[ciCci]=S[ \bigcup_{c_{i} \in C^{\prime}} c_i]=S 32 |

33 |

NPC 证明

34 |

对 MC 问题添加以下约束,令:

35 |
    36 |
  • 对任意 ciC,ci=3c_i\in C, |c_i|=3
  • 37 |
  • S=3q|S|=3q
  • 38 |
  • K=qK=q (该约束使得覆盖必须为严格覆盖)
  • 39 |
40 |

经过上述限制后,该问题变成 X3C 问题了。

41 | 42 | 43 | -------------------------------------------------------------------------------- /doc/mc.md: -------------------------------------------------------------------------------- 1 | # 最小集合覆盖问题(Minimum set Cover) 2 | 3 | 这又是一个覆盖问题,不同的是,该问题只要求覆盖,不要求严格覆盖。 4 | 5 | **实例:** 集合 $S=\left\{s_{1}, \ldots, s_{n}\right\},$ $S$ 的子集的集合 $C=\left\{c_{1}, c_{2}, \ldots, c_{m}\right\},c_i\subset S$ 6 | 7 | **询问:** 是否存在 $C$ 的子集 $C'$,使 $\left|C^{\prime}\right| \leq k, k \in Z^{+}$,且 8 | 9 | $$ 10 | [ \bigcup_{c_{i} \in C^{\prime}} c_i]=S 11 | $$ 12 | 13 | 14 | ## NPC 证明 15 | 16 | 对 MC 问题添加以下约束,令: 17 | 18 | - 对任意 $c_i\in C, |c_i|=3$ 19 | - 令 $|S|=3q$ 20 | - $K=q$ (该约束使得覆盖必须为严格覆盖) 21 | 22 | 经过上述限制后,该问题变成 [X3C](x3c.html) 问题了。 23 | 24 | -------------------------------------------------------------------------------- /doc/mds.md: -------------------------------------------------------------------------------- 1 | # 最小迟序排工问题(Minimum tardiness sequencing) 2 | 3 | 作为排工问题,该问题和[区间排工问题](/doc/swi.html)相似但又不同。不同之处有: 4 | - 没有了最早开始时间,只有最后加工期限 5 | - 任务的完成需要按一定顺序进行 6 | - 不要求全部完成,只要求未能按期完成任务的数目不超过 K 个 7 | 8 | 9 | 该问题的形式化定义如下: 10 | 11 | 12 | **实例:** 任务集合 $T,$ 每个任务 $t \in T,$ 都有加工长度 $L(t)=1,$ 加工最后期限 $d(t) \in Z^{+}$。 在集合 $T$ 上有半序关系 $\lessdot$ 以及非负整数 $K \leqslant T\rceil_{\circ}$ 13 | 14 | **询问:** 是否存在 $T$ 的排工表 $\sigma: T \rightarrow\{0,1, \cdots,|T|-1\},$ 使得当 $t \neq t$ '有 $\sigma(t) \neq \sigma\left(t^{\prime}\right),$ 当 $t \lessdot t^{\prime}$ 15 | 时, 有 $\sigma(t)<\sigma\left(t^{\prime}\right), \quad$ 且| $\{t \mid t \in T, \sigma(t)+1>d(t)\} \mid \leqslant K$。 16 | 17 | 该问题询问中条件 $|\{t \mid t \in T, \sigma(t)+1>d(t)\} \mid \leqslant K$ 表示在排工表 $\sigma$ 中,未能按期完成任务的 数目不超过 $K_{\circ}$ 18 | 19 | 该问题可以通过将图的 [团问题](clique.html) 归约到该问题证明。 20 | 21 | 22 | 23 | 24 | ## NPC 证明 25 | 26 | 27 | 如果一个图内有一个 $N$ 个点的团(也即完全图),那么相应的,就会有$\frac{N(N-1)}{2}$ 条边。 28 | 29 | 现在逐步将团问题实例 $G=\{V,E\}, J \in Z^{+}$ 转换为最小迟序排工问题。 30 | 31 | 首先,将团问题实例中的图 $G=\{V,E\}$ 中的边和点都视为加工长度为 1 的任务,此时任务总数就是 $|V|+|E|$。 32 | 33 | 随后添加半序约束:当两点 $u,v$ 之间存在边 $e$ 时,这两个点任务的优先级要比边任务 $e$ 要大。形式化表述为: 34 | 35 | $$ 36 | u \lessdot e, v \lessdot e, \text { 当且仅当 } e=(u, v), u, v \in V, e \in E 37 | $$ 38 | 39 | 此时,令排工问题中 **最多不需要按期完成任务的数目** $K =|E|-\frac{J(J-1)}{2}$,那么 **最少需要完成的任务数** 也可以根据总数计算得到,为 $|E|+|V|-K = |V|+\frac{J(J-1)}{2}$ 个任务 40 | 41 | 注意到 $|V|$ 刚好是原图点的数量,而剩下的 $\frac{J(J-1)}{2}$ 则刚好是原图中完全子图(若能找到)的边的数量。 42 | 43 | 此时,定义所有边任务 e 和所有点任务 v 的最后期限分别为: 44 | 45 | $$ 46 | d(e)=\frac{J(J+1)}{2},e\in E 47 | $$ 48 | 49 | $$ 50 | d(v)=|V|+|E|, v\in V 51 | $$ 52 | 53 | 因为 $J=\frac{J(J+1)}{2}-\frac{J(J-1)}{2}$,且点任务的优先级比其连接的边任务高,所以在边任务的期限 $\frac{J(J+1)}{2}$ 结束之前,最多只能完成 $\frac{J(J-1)}{2}$ 个边任务,且必须附带完成 $J$ 个点任务。 54 | 55 | 56 | (<-) 此时,设在期限 $J(J+1)/2$ 之前完成的边任务为 $E'$,点任务为 $V'$,那么 $(V',E')$ 根据其数量和优先级,显然一定构成了一个完全图。 57 | 58 | (->) 如果团问题的任意实例 $G=(V,E)$ 含有 $J$ 个顶点的团,则最小迟序排工问题相应实例的排工安排即为团对应的点任务和边任务。 59 | 60 | > **ps1:** 是否存在任务安排,使得点任务完成了个 $|V|-1$,而边任务完成了 $\frac{J(J-1)}{2}+1$ 个? 答案是否,因为完成 $\frac{J(J-1)}{2}+1$ 个边任务需要至少 $J+1$ 个点,而边任务的最后期限是 $d(e)=\frac{J(J+1)}{2}$,边任务的完成数量不可能超过 $\frac{J(J-1)}{2}$ 个。 61 | 62 | 63 | -------------------------------------------------------------------------------- /doc/mts.md: -------------------------------------------------------------------------------- 1 | # 多任务排工(multi-task scheduling)问题 2 | 3 | 4 | --- 5 | **实例:** 有限任务的集合 $A,$ 每个任务 $a \in A,$ 都有相应的加工时间长度 $L(a) \in Z^{+}$。 加工任务机器数为 $m \in Z^{+},$ 加工的最后期限 $D \in Z^{+}$ 。 6 | 7 | **询问:** 是否存在 $A$ 的划分 $A=A_{1} \cup A_{2} \cup \cdots \cup A_{m}, A_{i} \cap A_{j}=\varnothing, \quad 1 \leqslant i, j \leqslant m, \quad i \neq j,$ 使得 8 | $$ 9 | \max \left\{\sum_{a \in A_{i}} L(a) \mid 1 \leqslant i \leqslant m\right\} \leqslant D 10 | $$ 11 | 12 | --- 13 | 该任务可以通过[划分问题](par.html)多项式归约证明。 14 | 15 | ## NPC 证明 16 | 17 | 对多任务排工问题的实例施加限制为,置 $m=2, \quad \sum_{a \in A} L(a)$ 为偶数, 且满足 18 | 19 | $$D=\frac{1}{2} \sum_{a \in A} L(a)$$ 20 | 21 | 这样限制后的实例成为划分问题的实例。 -------------------------------------------------------------------------------- /doc/par.md: -------------------------------------------------------------------------------- 1 | # 划分问题 2 | 3 | 划分问题表述为: 4 | 5 | **实例:** 有限集合 $A$ ,对应于每个 $a \in A$,有正整数价值 $S(a) \in Z^{+}$。 6 | 7 | **询问:** 是否存在子集 $A^{\prime} \subseteq A$,使得 8 | 9 | $$\sum_{a \in A^{\prime}} S(a)=\sum_{a \in A-A^{\prime}} S(a)$$ 10 | 11 | 12 | > 划分问题可以看成的将一堆价值不等的物体分成两堆价值相等的,每一堆的价值是总价值的一半 13 | 14 | ## 核心思路 15 | 16 | 要将 3DM 问题多项式变换 PAR 问题的核心思想如下: 17 | 18 | 1. 将 $W,X,Y$ 中的每一个元素依次按顺序定义为一个只有一位为 1,其余位皆为 0 ,且不可能通过**有限次进位**互相得到的二进制值(目的是为了让其他元素没有办法通过累加得到其他元素的值,也即让这些元素**唯一**)。 19 | 2. 将 $M$ 中的每一个元素 $m_i$ 都作为 PAR 问题中集合 $A$ 的元素 $a_i$,此时元素 $a_i$ 的价值 $S(a_i)$ 可以通过将 $m_i$ 中的三个元素分配的二进制值加起来得到。 20 | 21 | 22 | 3. 当完美对集 $M'$ 存在时,将 $M'$ 中的所有元素相加,就可以以此得到一个唯一的由 $M'$ 确定的二进制串,其值确定,表示为 $B$。此时将 $M$ 中的所有元素相加,也可以以此得到一个二进制串,值为 $S(M)$,即 23 | 24 | $$ 25 | S(M) = \sum_{i=1}^{K} S\left(a_{i}\right) 26 | $$ 27 | 28 | 4. 此时,在 $A$ 中额外构建两个辅助元素 $b_1$ 和 $b_2$(也即 A 集合的总大小为 $|M| + 2$) 29 | 30 | $$S\left(b_{1}\right)=2 \sum_{i=1}^{K} S\left(a_{i}\right)-B, \quad S\left(b_{2}\right)=\sum_{i=1}^{K} S\left(a_{i}\right)+B$$ 31 | 32 | - 其总价值易得为 4 倍的 $S(M)$,即 33 | 34 | $$ 35 | 4 \sum_{i=1}^{K} S\left(a_{i}\right) 36 | $$ 37 | 38 | - 因此,如果存在完美划分,那么 $b_1$ 和 $b_2$ 肯定在不同的划分中,且每个划分的总价值均为 2 倍的 $S(M)$ 39 | 40 | 5. 最后,通过方法不等式和推导可以证明,仅完美对集 $M'$ 存在时候, 可以找出一个 $B$ 和 $b_1$ 一起, $M-M'$ 和 $b_2$ 一起。 41 | 42 | 43 | ## NPC 证明 44 | 45 | 首先构建一个 $3 DM$ 问题实例, 即 46 | 47 | **实例:** 集合 $M \subseteq W \times X \times Y,$ 其中 $W 、 X 、 Y$ 是互不相交的集合, $\quad$ 且 $|W|=|X|=|Y|=q$ 。 其中, $W=\left\{w 1, w 2_{,} \ldots, wq\right\}, X=\{x 1, \ldots, xq\}, Y=\{y 1, \ldots, yq\},$ 且 $M=\{m 1, \ldots, mk\}$ 48 | 49 | --- 50 | 51 | 定义 $p$ 52 | $$ 53 | p=\left\lceil\log _{2}(K+1)\right\rceil 54 | $$ 55 | 56 | > 据此可得 $K \leq 2^{p}-1$ 57 | 58 | 随后, 为 $W_{1} X, Y$ 中的每个元素分配一个二进制值。将 $W, X, Y$ 中元索按顺序重新排列 为 $w_{1}, w_{2}, \ldots, w_{q}, x_{q+1}, x_{q+2}, \ldots, x_{2 q}, y_{2 q+1}, \ldots, y_{3 q},$ 定义函数 $V(\cdot)$ 表示每一元素的值, 则 59 | $V(w 1) \ldots V(y 3 q)$ 依次为 $2^{p(3 q-1)}, 2^{p(3 q-2)}, \ldots, 2^{p(2 q)}, \ldots, 2^{p}, 2^{0},$ 共 $3 q$ 个元素。 60 | 61 | 62 | 63 | 其值可以看做是下图每一元素的最右边的第一个格子。 64 | 65 | ![](./fig/5.jpg) 66 | 67 | --- 68 | 69 | 据此, 定义 PAR 的实例 $A=\{a_1, a_2, \ldots, a_k, b_1,b_2\}$, 定义 $S(a_i)$ 的值为相应 $m_i$ 中的三个分 70 | 量对应的二进制值之和。即令 $m_{i}=\left\{w_{f(i)}, x_{g(i)}, y_{h(i)}\right\}, f, g, h$ 分别表示 $mi$ 元素中三个分量在其对应集合中的下标, 则 71 | 72 | $$S(ai)=V(w)+V(x)+V(h)$$ 73 | 74 | 此时, 因为 $|M|=K \leq 2^{p}-1$, 而 $\frac{V\left(w_{i}\right)}{V\left(w_{i+1}\right)}=\frac{2^{p(3 q-i)}}{2^{p(3 q-i+1)}}=\frac{1}{2^{p}}$,因此 $KV(wi) 95 | 96 | --- 97 | 98 | 现在定义 $A$ 中剩余的两个元素 $b_1,b_2$ 的值分别为: 99 | 100 | $$ 101 | S\left(b_{1}\right)=2 \sum_{i=1}^{K} S\left(a_{i}\right)-B, \quad S\left(b_{2}\right)=\sum_{i=1}^{K} S\left(a_{i}\right)+B 102 | $$ 103 | 104 | 105 | 此时,得 A 中所有元素长度之和为 106 | 107 | $$ 108 | S(A)=\sum_{i=1}^{K} S\left(a_{i}\right)+S\left(b_{1}\right)+S\left(b_{2}\right)=4 \sum_{i=1}^{K} S\left(a_{i}\right) 109 | $$ 110 | 111 | 112 | 若实例 $A$ 存在完美划分 $A'$ 则 113 | 114 | $$ 115 | S(A')=2 \sum_{i=1}^{K} S\left(a_{i}\right) 116 | $$ 117 | 118 | > 所以,若存在完美划分 $A'$,则 b1 和 b2 两个元素不可能同时在 $A'$ 中。因为 $S(b_1)+S(b_2) =3 \sum_{i=1}^{K} S\left(a_{i}\right)$ 119 | 120 | --- 121 | 122 | **多项式时间证明:** 在极限情况下, $\quad w_{1}=2^{p(3 q-1)},$ 且 $M$ 中所有元素均存在 $w_1,$ 此时 123 | 124 | $$K 2^{p(3 q-1)}<2^{q} 2^{p(3 q-1)}=2^{3 p q},$$ 125 | 126 | 因此 $S(M)<2^{3 p q+1}, \quad S(b_2)<2S(M), S(b_1)<2 ~S(M)$, 127 | 128 | 而 $2 S(M)<2^{3 p q+2}$,因此这两个数,以及其他的数均可用不多于 $3 pq+1$ 位的二进制数表示,这说明这项变换是多项式时间的。 129 | 130 | --- 131 | 132 | (->) 若在 3DM 问题的这个实例中, $M^{\prime} \subseteq M$ 是 $M$ 的完美匹配,则在 $PAR$ 问题相应实例中, 设 $A^{\prime}=\left\{a_{i} \mid m_{i} \in M^{\prime}\right\} \cup\left\{b_{1}\right\}$,则 133 | 134 | $$S\left(A^{\prime}\right)=\sum_{m_{i} \in M^{\prime}} S\left(a_{i}\right)+S\left(b_{1}\right)=B+2 \sum_{i=1}^{K} S\left(a_{i}\right)-B=2 \sum_{i=1}^{K} S\left(a_{i}\right)$$ 135 | 136 | 于是我们证明了 $3DM \propto PAR, \quad$ 即 $PAR \in NPC 。$ 137 | 138 | 139 | (<-) 假设集合 $A$ 中存在子集 $A^{\prime},$ 使 140 | $$ 141 | \sum_{a \in A^{\prime}} S(a)=\sum_{a \in A-A^{\prime}} S(a)=2 \sum_{i=1}^{K} S\left(a_{i}\right) 142 | $$ 143 | 成立。那么在子集 $A$ 或 $A-A$ '中必有一个含有元索 $b_{1}$ 但不含有元素 $b_{2}$。 不妨假设 $A'$ 中含有元素 $b_{1}$ 而不含有元素 $b_{2},$ 那么 $A^{\prime} \cap\left\{a_{i} \mid 1 \leqslant i \leqslant K\right\}$ 中元索长度之和应该等于 $B,$ 根据 144 | 上面讨论, $A^{\prime} \cap\left\{a_{i} \mid 1 \leqslant i \leqslant K\right\}$ 中的元素所对应的 $M$ 中的子集 $M^{\prime}$ 是一个完美对集。 145 | 146 | -------------------------------------------------------------------------------- /doc/partri.md: -------------------------------------------------------------------------------- 1 | # 划分三角形问题 2 | 3 | 问能否将一个图完美的全部拆成一个个三角形,每个三角形的点互不重合。 4 | 5 | --- 6 | **实例:** 图 $G=(V, E),|V|=3q, \quad q$ 为正整数。 7 | 8 | **询问:** 是否存在 $V$ 的一个划分,将 $V$ 分成互不相交的 $q$ 个子集 $V=V_{1} \cup V_{2} \cup \cdots \cup V_{q}$ , 9 | 使 $\left|V_{i}\right|=3$, 且 $V_{i}$ 中的**三个顶点形成三角形**。 10 | 11 | 即设 12 | 13 | $$V_{i}=\left\{v_{i[1]}, v_{i[2]}, v_{i[3]}\right\}$$ 14 | 15 | 则 16 | $$\left(v_{i[1]}, v_{i[2]}\right),\left(v_{i[2]}, v_{i[3]}\right) ,\left(v_{i[3]}, v_{i[1]}\right) \in E_{\circ}$$ 17 | 18 | --- 19 | 20 | 21 | 该问题可以通过[X3C问题](x3c.html)归约证明。 22 | 23 | ## NPC 证明 24 | 25 | 令 X3C 问题实例为布尔变量集合 $S,|S|=3q$ 和项集合 $C,c_i=\{x_i,y_i,z_i\},|C|=n$,以此构建划分三角形实例。 26 | 27 | 将**项集合** $C$ 中的每一个元素替换为如下的子图(命名为三角子图) 28 | 29 | ![](fig/20.png) 30 | 31 | 观察发现**该图最多能划分出四个三角形**(顶上一个,底下三个,注意划分出的三角形的点不能重复)。 32 | 33 | 而当**去除任意** $x,y,z$ 中的一个或多个点后(和点相邻的边也被同时去除了),该图最多只能划分出三个三角形。 34 | 35 | 因此,所有的项可以按照这种替换方式,被完全替换成一个图结构。令每一个项 $c_i$ 替换成的子图表示为 $G_i=\{V_i,E_i\}$,则划分三角形实例的图结构表示为 $G=\{V,E\}$,其中: 36 | 37 | $$E=\bigcup_{i=1}^{n} E_{i},\left(x_{i}, y_{i}, z_{i}\right)=C_{i} \in C, |E_i|=18$$ 38 | 39 | 易得$|E|=18n$ 40 | 41 | $$V=\bigcup_{i=1}^{n} V_{i}$$ 42 | 43 | 注意每个子图的会额外在 X3C 布尔变量集合之外多定义 9 个点,即 44 | 45 | $$V_i=\{x_i,y_i,z_i\}\cup\{a_{i[j]}|1\leq j\leq 9\}$$ 46 | 47 | 同样易得点个数 $|V|=|S|+9n=3q+9n$ 48 | 49 | 此时对于划分三角形实例,要求划分出的三角形个数 $q'=q+3n$(点个数的 1/3) 50 | 51 | (->) X3C 实例存在一个严格覆盖 $C'$,则对位于严格覆盖$C'$中的项,等价选择三角子图划分出四个三角形的情况;对于不在严格覆盖中的项,等价选择三角子图划分出三个三角形的情况。$|C|=n$,因此一共是 n 个三角子图,$|C'|=q$ 因此有 $q$ 个三角子图划分出 4 个三角形,$n-q$ 个三角子图划分出了 3 个三角形,一共是 $4q+3(n-q)=q+3n$ 个三角形。 52 | 53 | (<-) 假设图$G$可以划分出 $q+3n$ 个三角形。因为图 $G$ 中存在 $n$ 个**三角子图**(由项数决定),那么首先,肯定存在 $q$ 个三角子图划分出了 4 个三角形,其余的 $n-q$ 个三角子图划分出了 3 个三角形。 54 | 55 | 因为如果划分出4个三角形的三角子图数量不为 $q$(假设是 $q_1$ 个,那么最终的划分三角形个数即为 $4q_1+3(n-q_1)=q_1+3n \not= q+3n$ 。 56 | 57 | 那么对于这 $q$ 个三角子图$G_i$,对应选中 X3C 实例中的 $C_i=\{x_i,y_i,z_i\}$,因为划分方式唯一,且划分三角形点没有重复,因此对应到 X3C 中就可以构成对 $C$ 的严格覆盖。 58 | 59 | 得证。 60 | 61 | -------------------------------------------------------------------------------- /doc/pgcp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 平面图三着色 6 | 8 | 9 | 10 | 11 | 18 | 21 | 22 | 23 | 24 | 25 | 26 |

平面图三着色

27 |

平面图的三着色问题也是 NPC 问题,这也可以通过一般图三着色问题归约到该问题证明。

28 | 29 | 30 | -------------------------------------------------------------------------------- /doc/pgcp.md: -------------------------------------------------------------------------------- 1 | # 平面图三着色 2 | 3 | [平面图](../GraphTheory/1.html)的三着色问题也是 NPC 问题,这也可以通过一般[图三着色问题](gcp.html)归约到该问题证明。 4 | -------------------------------------------------------------------------------- /doc/sat.md: -------------------------------------------------------------------------------- 1 | # 布尔可满足性问题(Boolean satisfiability problem, SAT) 2 | 3 | SAT 问题属于决定性问题,也是第一个被证明属于NP完全的问题,1970年 Cook 证明 SAT 问题是NP-完全问题。即Cook定理。Cook说明若SAT多项式时间可解,则所有NP问题多项式时间可解。 4 | 5 | Cook定理证明 SAT 问题属于 NPC 问题的核心步骤: 6 | 1. 证明 SAT 问题属于 NP 问题,这明显成立(给定一个真值指派,按顺序求解即可) 7 | 2. 证明其他所有属于 NP 类的判定问题都可以通过某多项式变换变换为 SAT 问题 8 | 9 | 10 | 11 | 12 | ## SAT 问题 13 | 14 | 15 | **实例** 16 | 17 | 布尔变量集合 18 | $$U=\left\{u_{1}, u_{2}, \cdots, u_{n}\right\},$$ 19 | 项集合(也就是多个布尔变量或其取反后的布尔变量构成的集合) 20 | $$C=\left\{C_{1}, C_{2}, \cdots, C_{m}\right\},$$ 21 | 其中 22 | $$C_{i}=\left\{u[i, 1], \cdots, u\left[i, k_{i}\right]\right\} 23 | \subseteq U \cup \vec{U}, \quad \bar{U}=\left\{\bar{u}_{1}, \cdots, \bar{u}_{n}\right\}$$ 24 | 25 | **询问** 是否存在 $U$ 的真值指派: 26 | $U \rightarrow\{\mathrm{F}, \mathrm{T}\},$ 满足 27 | 28 | $$\bigwedge_{i=1}^{m}\left(\sum_{j=1}^{k_{i}} u[i, j]\right)=\mathrm{T}$$ 29 | 30 | 31 | ## 证明方法简述 32 | 33 | 这里需要回顾一下 [NTM](../turing/2.html), 之前在[介绍 NP 问题](../turing/4.html)时说过,NTM 实际上就是假想出来用来在多项式时间内求 NP 问题的机器。在解一个非判定问题时候,将所有问题的解的可能穷举出来,最后再对其逐一进行多项式判定,从而可以在多项式时间内解答 NP 问题。 34 | 35 | 而库克定理将 NTM 执行 NP 问题的验证过程进行了抽象。 36 | 37 | 将 NTM 中的**每个状态都用一个布尔变量表示**,随后**将验证程序执行过程中应该受到的约束条件表达为合取范式**。布尔变量+合取范式,这就构成了一个 SAT 问题,也即任意的 NP 问题都被多项式变换为了 SAT 问题。而这完全符合了 [NPC](../turing/4.html) 问题的定义: 38 | 39 | > 如果有一个终极的 NP 问题,其他所有的 NP 问题都可以归约到这个问题上,那么当这一个终极 NP 问题解决时,所有的 NP 问题就都解决了。 40 | > 41 | >如果这个终极的问题存在,那么这个终极问题就被称为是 NPC,能归约到该问题上的其他问题被称为NPC类问题。 42 | 43 | 44 | 具体的证明过程限于时间,暂且不表。 45 | 46 | -------------------------------------------------------------------------------- /doc/sgi.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 子图同构问题(subgraph isomorphism) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

子图同构问题(subgraph isomorphism)

28 |

实例: 两个无向简单图 G=(VE)G=(V,E)H=(V2E2)H=(V_2,E_2)

29 |

询问:GG 中是否含有与 HH 同构的子图。

30 |

NPC 证明

31 |

将子图同构问题实例中的图 H=(V2E2)H=(V_2,E_2) 限制为完全图后,该问题就成为图的团(CL)问题。

32 | 33 | 34 | -------------------------------------------------------------------------------- /doc/sgi.md: -------------------------------------------------------------------------------- 1 | # 子图同构问题(subgraph isomorphism) 2 | 3 | **实例:** 两个无向简单图 $G=(V,E)$,$H=(V_2,E_2)$。 4 | 5 | **询问:** 图 $G$ 中是否含有与 $H$ 同构的子图。 6 | 7 | ## NPC 证明 8 | 9 | 将子图同构问题实例中的图 $H=(V_2,E_2)$ 限制为完全图后,该问题就成为图的团(CL)问题。 10 | 11 | -------------------------------------------------------------------------------- /doc/swi.md: -------------------------------------------------------------------------------- 1 | # 区间排工(sequencing within intervals)问题 2 | 3 | 区间排工问题说的是,现在有多个任务 $t$ ,每一个任务存在最早起始时间 $r(t)$ 和最晚截止时间$d(t)$,每一个任务都需要消耗一定量的时间$L(t)$,那么有没有可能把所有的任务都按时完成? 4 | 5 | 该问题的形式化表示如下: 6 | 7 | **实例:** 有限任务集合 $T,$ 对每个任务 $t \in T$ 有最早加工起始时间 $r(t),$ 加工最后期限 $d(t)$ 以及加工长度 $L(t),$ 其中 $r(t), d(t), L(t) \in Z^{+}, \quad r(t) \geqslant 0$ 8 | 9 | **询问:** 是否存在对 $T$ 的可行排工表。即是否存在映射 $\sigma: T \rightarrow Z^{+},$ 使每个任务 $t \in T,$ 有 $\sigma(t) \geqslant r(t), \quad \sigma(t)+L(t) \leqslant d(t)$。 并且对于任意两个任务 $t, t^{\prime}, \quad$ 总有 $\sigma\left(t^{\prime}\right)+L\left(t^{\prime}\right) \leqslant \sigma(t)$ 或 10 | $\sigma(t)+L(t) \leqslant \sigma\left(t^{\prime}\right)$ 11 | 12 | 13 | 该问题求解的条件是:任务 $t$ 在时间区间 $[\sigma(t), \sigma(t)+L(t)]$ 内被加工; 加工开始时刻 $\sigma(t)$ 应在 $r(t)$ 之后,即 $\sigma(t) \geqslant r(t),$ 且需在 $d(t)$ 时刻之前完成, 即 $\sigma(t)+L(t) \leqslant d(t) ;$ 在加工任 务 $t$ 期间,不能再接受其他任何加工任务, 即 $\sigma\left(t^{\prime}\right)+L\left(t^{\prime}\right) \leqslant \sigma(t)$ 或 $\sigma(t)+L(t) \leqslant \sigma\left(t^{\prime}\right)$ 。 14 | 15 | 16 | 17 | 该问题的求解可以通过将 [划分问题](par.html) 归约到该问题证明。 18 | 19 | ## NPC 证明 20 | 21 | 根据划分问题实例 $A=\{a_1,a_2,...,a_n\}$,令$B=\sum_{a\in A}S(a)$,以此构建区间排工问题实例。 22 | 23 | 将每一个划分问题实例中的元素都转换为区间排工问题中的一个任务,且最早开始时间 $r(t)$ 均为0,最晚结束时间 $d(t)$ 均为 $B+1$,任务长度$L(t)=S(a)$ 24 | 25 | 之后,再额外构建一个新元素 $\bar{t}$,要求 $r(\bar{t})=\left\lceil\frac{B}{2}\right\rceil, d(\bar{t})=\left\lceil\frac{B+1}{2}\right\rceil$ 及 $L(\bar{t})=1$ 26 | 27 | 该变换**显然可在多项式时间**内完成。 28 | 29 | 首先排除 B 为奇数(此时不可能存在划分问题的解)的情况,此时最后一个任务 $r(\bar{t})=d(\bar{t})=\left\lceil\frac{B+1}{2}\right\rceil$,因此没有办法安排任务,也即排工问题也不存在解,成立。 30 | 31 | 当 B 为偶数时,$r(\bar{t})=\frac{B}{2}, d(\bar{t})=\left\lceil\frac{B+1}{2}\right\rceil=r(\bar{t})+1$,可以发现最后一个任务将排工时间必须安排在时间轴的正中间,从而将排工时间轴$[0,B+1]$等价的分为两半,如下图所示: 32 | 33 | ![](fig/8.png) 34 | 35 | 因此可简单做如下证明: 36 | 37 | 当划分问题有解 $A'$,当且仅当对应排工问题实例可以将任务分为两组,分别安排在区间 $[0,\frac{B}{2}]$ 和 $[\frac{B}{2}+1,B+1]$ 中。 38 | 39 | 得证。 -------------------------------------------------------------------------------- /doc/tsp.md: -------------------------------------------------------------------------------- 1 | # 货郎旅游问题(TravelingSalesmanProblem,TSP) 2 | 3 | 旅行商问题又叫货郎(优化)问题,是一个经典的组合优化问题。 4 | 5 | TSP 可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以**使总的行程最短**。 6 | 7 | 从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的[哈密顿回路](../GraphTheory/2.html)。 8 | 9 | 该问题是一个 [NP困难问题](../turing/4.html),可以通过由[货郎判定问题](#货郎判定问题) [图灵归约](../turing/5.html) 证明。 10 | 11 | ## NP-hard 证明 12 | 13 | 设存在 TSP 优化问题求解算法 $A$, 设计 TSP 判定问题的算法如下: 14 | 15 | 对于给定 TSP 判定问题的实例 $G,d,K$,调用 $A(G, d),$ 求得城市排列: 16 | $C_{\pi_{1}}^{*} C_{\pi_{2}}^{*} \ldots C_{\pi_{m}}^{*}$ 17 | 18 | 若路径长度小于等于 K,即 $\sum_{i=1}^{m} d\left(C_{\pi,}^{*}, c_{\pi_{\mu+}}^{*}\right) \leq K,$ 则回答 Yes,否则回答 $\mathrm{No}$ 。 19 | 20 | 若算法 $A$ 的时间复杂性是 $O(1)$,则上述算法能够在多项式时间解答。 所以TSP优化问题是NP-hard问题。 21 | 22 | 23 | 24 | # 货郎延伸问题 25 | 26 | 已知一部分货郎旅游路径,求完整的货郎旅游路径,使得总行程小于 $K$,其形式化表述为: 27 | 28 | --- 29 | **实例:** 城市集合 $C=\left\{c_{1}, c_{2}, \cdots, c_{m}\right\},$ 任意两城市间距离 $d\left(c_{i}, c_{j}\right) \in Z^{+},$ 界值 $B \in Z^{+},$ 以 30 | 及 $C$ 中 $k$ 个城市的部分旅游 31 | $$\Theta=\left\langle c_{\pi(1)}, c_{\pi(2)}, \cdots, c_{\pi(k)}\right\rangle, 1 \leqslant k \leqslant m_{0}$$ 32 | 33 | **询问:** 能否将 $\Theta$ 延伸为一个全长不超过 $B$ 的全程旅游回路 $\left\langle c_{\pi(1)}, c_{\pi(2)}, \cdots, c_{\pi(k)}\right.$ $\left.c_{\pi(k+1)}, \cdots, c_{\pi(m)}, c_{\pi(1)}\right\rangle$ ? 34 | 35 | 36 | 现在证明**货郎优化问题**可以图灵归约到该问题,以及**货郎判定问题**可以图灵归约到该问题。 37 | 38 | ## NP-hard 证明(货郎优化问题图灵归约) 39 | 40 | 设存在一个货郎延伸问题求解算法 $S(C, d, \Theta, B)$,注意到该问题是一个判定算法(输出 YES/NO)。而优化问题是寻找回路的最短路径长度。 41 | 42 | 因此该问题的解决方法为确认回路路径的区间,随后通过二分法依次判断区间内的数值即可。 43 | 44 | 城市间每条边的长度最短为 1,最大长度可以通过遍历取得,表示为 $d_{max}$,设城市个数为 m,因为货郎问题是一个回路,回路有 m 个点就有 m 条边,因此其上下限即为 $[m, m*d_{max}]$。 45 | 46 | 最后是二分法每次在该区间内取一个长度调用货郎延伸问题算法 $S(C, d, \Theta, B)$ 判定,直至最终求解完成的过程,不再叙述。 47 | 48 | > 二分法的复杂度是 $O(logB)$,在多项式时间内。 49 | 50 | ## NP-hard 证明(货郎判定问题图灵归约) 51 | 52 | 53 | 货郎判定问题实际上可以看做是 $|\Theta|=1$ 情况下的货郎延伸问题实例,因此 [货郎判定问题](#货郎判定问题) 可以**多项式归约**到货郎延伸问题。 54 | 55 | 56 | # 货郎判定问题 57 | 58 | 货郎优化问题可以转变描述,变为一个**判定问题**:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。是否存在一个行进路线,使得其行程小于 $K$ ? 59 | 60 | 该问题是一个 NPC 类问题,可以通过 [哈密顿回路问题](./hc.html) 归约证明。 61 | 62 | 该问题同时也可以通过[货郎优化问题](#货郎旅游问题travelingsalesmanproblemtsp) 图灵归约证明 NP-hard。 63 | 64 | 证明方法为先证明**货郎优化问题可以图灵归约到货郎延伸问题**,再证明**货郎延伸问题可以图灵归约到货郎判定问题**,从而可以根据**归约的传递性**证明货郎优化问题可以图灵归约到货郎判定问题。 65 | 66 | ## NPC 证明 67 | 68 | 以哈密顿回路问题实例 $G=(V,E)$ 构造判定问题实例,令所有边权值为1,$K=|V|$,之后易得。 69 | 70 | > 货郎判定问题的实质就是在一个**带权**完全无向图中,找一个权值最小的哈密顿回路。 71 | 72 | ## NP-hard 证明 73 | 74 | 78 | 79 | 暂略,参考 P146 页证明。 -------------------------------------------------------------------------------- /doc/vc.md: -------------------------------------------------------------------------------- 1 | # 图的顶点覆盖问题(VC) 2 | 3 | 顶点覆盖是在一个图中找一些点集,这些点集能够**覆盖**所有的边。 4 | 5 | > 最小顶点覆盖则要求点的数量是最小的。 6 | 7 | 如下图,图中的两个图红色的点分别构成了这两个图的一个(最小)顶点覆盖, 8 | 9 | ![](./fig/1.png) 10 | 11 | 顶点覆盖问题要求在一张图上找出不多于 K 个点的点集形成该图的一个顶点覆盖。其形式化定义为: 12 | 13 | **实例:** 无向简单图 $G=(V, E),$ 一个非负整数 $K \leqslant \mid V_{\circ}$ 14 | 15 | **询问:** 图 $G$ 是否存在顶点覆盖 $V^{\prime} \subseteq V$ 且 $\mid V' \leqslant K_{\circ}$ 所谓顶点覆盖 $V^{\prime}$ 是指 $G$ 中任意边 $(u, v) \in E$ 至少有一个顶点属于 $V^{\prime}, \quad$ 即 $\{u, v\} \cap V^{\prime} \neq \varnothing_{\circ}$ 16 | 17 | 该问题通过将 [3SAT](3sat.html) 归约到 VC 来完成。 18 | 19 | ## 核心思路 20 | 21 | 以 3SAT 实例 $U=\left\{u_{1}, u_{2}, u_{3}, u_{4}\right\}$ 及 $C=\left\{\left\{u_{1}, \bar{u}_{3}, \bar{u}_{4}\right\},\left\{\bar{u}_{1}, u_{2}, \bar{u}_{4}\right\}\right\}$ 为例,构建出的顶点覆盖实例如下所示: 22 | 23 | ![](./fig/6.png) 24 | 25 | 该实例由三部分组成:每一个布尔变量的正反项生成两个顶点和一条边(表示为一条直线(命名为线集),每一个项生成三个顶点和三条边(表示为一个三角形)(命名为三角形集)。最后,每个线图和每个三角形图之间通过项的组成再次连接直线(命名为边集)。注意每个三角形的每个点各自和边集中的一条边对应。 26 | 27 | (->)当 3SAT 实例存在真值指派时,遍历一遍 $U$ 中每个布尔变量 $u_i$的真值指派,如果 $u_i=T$,那么在顶点覆盖中就选择 $u_i$,否则就选择 $\bar{u_i}$,这种方式保证了所有的线集都被覆盖。此时,每个三角形对应的**边集中的三条边**中**至少**有一条边也被覆盖(被线集中的一个点覆盖,这对应着**每个三角形对应的项**的析取值均为 $T$)。之后如果要完成顶点覆盖,还需要从三角形中选择点来覆盖**剩余的边集**和**三角形集**。 28 | 29 | 对边集的覆盖,只需要在每个三角形中选择**最多两个点**(最少不用选,此时三角形对应的边集中的三条边都已经被相应线集中的点覆盖),即可覆盖全部还未选中的边集。 30 | 31 | 最后遍历每个三角形,对之前在每个三角形中选择少于两点的情况,任意选取点,补全两点的情况(三角形只需要两点即可选中),即可覆盖全部三角形集。 32 | 33 | (<-) 当实例存在顶点覆盖集 $V'$ 时,可得 $V'$ 一定会包含每个线图的一个顶点,以及每个三角形的两个顶点(反证法,如果每个线图都没有顶点的话,那么没有其他的点可以用于覆盖两点之间的线,三角形同理)。 34 | 35 | 因此还剩下最后边集的覆盖。由于每一个三角形上的两个顶点都能覆盖**边集**上的两条边,因此还需要来自于顶部线图中的点覆盖第三条边,这样就形成了一个对应关系:**每一个三角形实际上对应的是3SAT中的一个项,选择一个点来覆盖第三条边实际上就是让相应的布尔变量指派为真**。因此,让顶点覆盖中来自于线图的点对应的布尔变量的指派为真,即可得到解决 3SAT 问题的真值指派。 -------------------------------------------------------------------------------- /doc/x3c.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | X3C 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

X3C

28 |

该问题的全称为 eXact Cover (by 3-sets) problem

29 |

3DM 问题存在一个更一般的形式,即不要求三元素集合 MM 中的元素来自三个互不重复的集合,而是都在同一个集合中。

30 |

实例: 集合 SSS=3q|S|=3q,以及 SS 的三元素子集的集合 CC

31 |

询问: CC 是否包含有一个严格覆盖 CC,C^{\prime} \subseteq C, 使得 C=q|C^{\prime}|=q,且 CC^{\prime} 中没有任何两个三元组有相同分量。即 CC' 中的所有元素恰好只在 SS 中出现了一次。

32 |

NPC 证明

33 |

该问题的证明非常容易,因为 3DM 问题中的每个实例,都可以看成是 X3C 问题的实例。

34 |

对 3DM 实例 W,X,Y,MW×X×YW,X,Y,M \subseteq W \times X \times Y,构造 X3C 实例为 S=WXY,C=MS=W\cup X\cup Y, C=M

35 |

3DM 实例 M 中存在完美对集,当且仅当 X3C 实例 C 中存在 S 的严格覆盖。问题得证。

36 |
37 |

PS: issue#7 如果 X3C 存在严格覆盖,只需要把严格覆盖的所有元素的第一个分量放到 W,第二个分量放到 X,第三个分量放到 Y 即可

38 |
39 | 40 | 41 | -------------------------------------------------------------------------------- /doc/x3c.md: -------------------------------------------------------------------------------- 1 | # X3C 2 | 该问题的全称为 eXact Cover (by 3-sets) problem 3 | 4 | [3DM](3dm.html) 问题存在一个更一般的形式,即不要求三元素集合 $M$ 中的元素来自三个互不重复的集合,而是都在同一个集合中。 5 | 6 | 7 | 8 | **实例:** 集合 $S$,$|S|=3q$,以及 $S$ 的三元素子集的集合 $C$ 9 | 10 | 11 | **询问:** $C$ 是否包含有一个严格覆盖 $C^{\prime} \subseteq C,$ 使得 $|C^{\prime}|=q$,且 $C^{\prime}$ 中没有任何两个三元组有相同分量。即 $C'$ 中的所有元素恰好只在 $S$ 中出现了一次。 12 | 13 | 14 | 15 | ## NPC 证明 16 | 该问题的证明非常容易,因为 [3DM](3dm.html) 问题中的每个实例,都可以看成是 X3C 问题的实例。 17 | 18 | 对 3DM 实例 $W,X,Y,M \subseteq W \times X \times Y$,构造 X3C 实例为 $S=W\cup X\cup Y, C=M$。 19 | 20 | 3DM 实例 M 中存在完美对集,当且仅当 X3C 实例 C 中存在 S 的严格覆盖。问题得证。 21 | 22 | 23 | > PS: [issue#7](https://github.com/sailist/AdAlgo/issues/7) 如果 X3C 存在严格覆盖,只需要把严格覆盖的所有元素的第一个分量放到 W,第二个分量放到 X,第三个分量放到 Y 即可 24 | 25 | -------------------------------------------------------------------------------- /fig/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/fig/group.png -------------------------------------------------------------------------------- /fig/sharingidea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/fig/sharingidea.png -------------------------------------------------------------------------------- /gitpush.cmd: -------------------------------------------------------------------------------- 1 | set /p commitmsg=input commitmsg: 2 | git add * 3 | git commit -m %commitmsg% 4 | git push -------------------------------------------------------------------------------- /others/gcp.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/others/gcp.ai -------------------------------------------------------------------------------- /others/hc.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/others/hc.ai -------------------------------------------------------------------------------- /others/msmp.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/others/msmp.ai -------------------------------------------------------------------------------- /others/propto.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/others/propto.ai -------------------------------------------------------------------------------- /turing/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 图灵机 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

图灵机

28 |

直观地看,图灵机是由一条两端可无限延长的带子、一个读写头以及一组控制读写头工作的命令组成,如下图:

29 |

30 |

读写头可以沿带子方向左右移动,并可以在每个方格上进行读写。其中带子上所有可能的字符构成输入集合,机器能够写到带子上的所有可能的字符构成输出集合;此外,机器自身还有一系列状态(最简单的,如启动、关闭两个状态);最后,机器通过输入来控制向左还是向右移动一格(或是不动),以及通过输入来控制机器的输出(更改带子上的内容)和下一个时刻所处的状态。

31 |

换句话表示,图灵机可以被看成是一个函数:根据输入和函数的定义来得到输出。

32 |

其中,输入是当前纸带的内容和机器的状态;输出是机器的下一个状态、下一个位置(向左、向右、不移动)和纸带方格的输出。机器内部存在一个状态转移函数来定义这一从输入到输出的映射。

33 |

这里的函数是普通函数的概念,请不要将其概念神话:函数的实质是一个多对一的映射。只不过在这里,输入是二维的值,输出是三维的纸,且和平常的数字脱离了。

34 |

停机

35 |

考虑图灵机在什么情况下停机。一般编写程序,其退出的原因有两个:执行成功、产生错误。这同样适用于图灵机。当图灵机启动时,通过输入不断的更改自己的下一个状态,永不停歇,直到状态切换到了停机状态。

36 |

一般而言,分别为“执行成功”、“产生错误”两个概念定义停机的状态集,一般分别称其为接受状态集拒绝状态集,他们都是一个图灵机的状态集合的子集,当处于这两个集合之外的状态时,图灵机不会停止运行。

37 |

我们可以构造出一组输入集、输出集、状态转移函数来求解特定的问题,当定义求解一类问题的图灵机时,定义问题的实例为 II ,那么 II 就可以以纸带的形式放到图灵机上,随后根据图灵机的一系列状态转移、输出,最终停机。

38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /turing/1.md: -------------------------------------------------------------------------------- 1 | # 图灵机 2 | 3 | 直观地看,图灵机是由一条两端可无限延长的带子、一个读写头以及一组控制读写头工作的命令组成,如下图: 4 | 5 | ![](./fig/1.jpg) 6 | 7 | 8 | 读写头可以沿带子方向左右移动,并可以在每个方格上进行读写。其中带子上所有可能的字符构成输入集合,机器能够写到带子上的所有可能的字符构成输出集合;此外,机器自身还有一系列状态(最简单的,如启动、关闭两个状态);最后,机器通过输入来控制向左还是向右移动一格(或是不动),以及通过输入来控制机器的输出(更改带子上的内容)和下一个时刻所处的状态。 9 | 10 | 11 | 换句话表示,图灵机可以被看成是一个函数:根据输入和函数的定义来得到输出。 12 | 13 | 其中,输入是当前纸带的内容和机器的状态;输出是机器的下一个状态、下一个位置(向左、向右、不移动)和纸带方格的输出。机器内部存在一个状态转移函数来定义这一从输入到输出的映射。 14 | 15 | 这里的函数是普通函数的概念,请不要将其概念神话:函数的实质是一个多对一的映射。只不过在这里,输入是二维的值,输出是三维的纸,且和平常的数字脱离了。 16 | 17 | 18 | ## 停机 19 | 20 | 考虑图灵机在什么情况下停机。一般编写程序,其退出的原因有两个:执行成功、产生错误。这同样适用于图灵机。当图灵机启动时,通过输入不断的更改自己的下一个状态,永不停歇,直到状态切换到了停机状态。 21 | 22 | 一般而言,分别为“执行成功”、“产生错误”两个概念定义停机的状态集,一般分别称其为**接受状态集**和**拒绝状态集**,他们都是一个图灵机的状态集合的子集,当处于这两个集合之外的状态时,图灵机不会停止运行。 23 | 24 | 25 | 我们可以构造出一组输入集、输出集、状态转移函数来求解特定的问题,当定义求解一类问题的图灵机时,定义问题的实例为 $I$ ,那么 $I$ 就可以以纸带的形式放到图灵机上,随后根据图灵机的一系列状态转移、输出,最终停机。 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /turing/2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 确定性图灵机(Deterministic Turing machine, DTM) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

确定性图灵机(Deterministic Turing machine, DTM)

28 |

确定性图灵机指每一步都惟一确定的图灵机。

29 |

MM 为一个图灵机,则只要给 MM 一个输入,MM 便会以一种唯一确定的方式进行运行。

30 |

这实际上就是正常的图灵机,也即如之前图灵机定义的,内部是一个映射函数,一个输入只对应一个输出。确定型图灵机概念的提出是为了引出非确定性图灵机(NTM)

31 |

非确定性图灵机(Non-deterministic Turing machine, NTM)

32 |

非确定性图灵机可以被想象为在同一时刻能够独立、并行地完成多种运算,一个输入可能会存在多个输出(表现在转移函数的多值性),这显然不现实,因为函数不可能出现一对多或者多对多的映射

33 |

为了实现(或者假想出)这种可能,可以通过允许不受限制的并行运算来形象的解释这种不确定性算法。每当要作某种选择(一对多的映射)时,算法就好像给自己复制了若干副本,每个副本选择一个可能性,于是,许多副本同时被执行。第一个获得成功的副本将引起对其它副本计算的结束(当然,如果一个副本结束时候没有成功,则只有该副本被终止)。

34 |

DTM 是为了引出对 NPC 类问题。

35 | 36 | 37 | -------------------------------------------------------------------------------- /turing/2.md: -------------------------------------------------------------------------------- 1 | # 确定性图灵机(Deterministic Turing machine, DTM) 2 | 3 | 确定性图灵机指每一步都惟一确定的图灵机。 4 | 5 | 设 $M$ 为一个图灵机,则只要给 $M$ 一个输入,$M$ 便会以一种唯一确定的方式进行运行。 6 | 7 | 这实际上就是正常的图灵机,也即如之前[图灵机](./1.html)定义的,内部是一个映射**函数**,一个输入只对应一个输出。确定型图灵机概念的提出是为了引出非确定性图灵机(NTM) 8 | 9 | 10 | # 非确定性图灵机(Non-deterministic Turing machine, NTM) 11 | 12 | 非确定性图灵机可以被想象为在同一时刻能够独立、并行地完成多种运算,一个输入可能会存在多个输出(表现在转移函数的多值性),这显然不现实,**因为函数不可能出现一对多或者多对多的映射**。 13 | 14 | 为了实现(或者假想出)这种可能,可以通过**允许不受限制的并行运算**来形象的解释这种不确定性算法。每当要作某种选择(一对多的映射)时,算法就好像给自己复制了若干副本,每个副本选择一个可能性,于是,许多副本同时被执行。第一个获得成功的副本将引起对其它副本计算的结束(当然,如果一个副本结束时候没有成功,则只有该副本被终止)。 15 | 16 | DTM 是为了引出对 NPC 类问题。 -------------------------------------------------------------------------------- /turing/3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 神谕图灵机(Oracle Turing Machine) 6 | 8 | 9 | 10 | 11 | 18 | 21 | 22 | 23 | 24 | 25 | 26 |

神谕图灵机(Oracle Turing Machine)

27 |

神谕图灵机的提出是为了引出图灵归约和 NP-hard ,可以在货郎问题一节理解图灵归约和神谕图灵机。

28 |

OTM 和 DTM 很相似,但比 DTM 多了一个神谕状态,和神谕纸带。

29 |

这多出来的神谕状态可以被看做是一个黑盒子函数,用于帮助我们求解某些难以求解的问题。

30 |

比如,已知货郎判定问题是 NP-hard,那么货郎优化问题的难度应该如何表示?

31 |

假设存在一个在多项式时间内解货郎优化问题的算法 A,随后用该算法求出最短路径 L,如果 L大于判定问题,就输出 NO,否则输出 YES。通过这种方法,我们用货郎优化问题解决了货郎判定问题

32 |

在上面的例子中,算法 A 就是神谕,以假设货郎优化问题的算法为多项时间为基础,设计算法并证明货郎判定问题是多项式时间的过程,被称为图灵归约。上述的过程读作将货郎判定问题图灵归约到货郎优化问题

33 |

此时,根据图灵归约的定义,货郎判定问题是 NP-hard,因此货郎优化问题也是 NP-hard。

34 |
35 |

可以看出,如果货郎优化问题可以在多项式时间内解答,那么货郎判定问题一定可以在多项式时间内解答;但是如果货郎判定问题可以在多项式时间内解答,根据上述算法,货郎优化问题不一定可以在多项式时间内解答。(可以根据上述图灵归约认定货郎优化问题比货郎判定问题难)

36 |

不过实际上,也可以将货郎优化问题图灵归约到货郎判定问题。这种情况下就可以认为货郎优化问题是 NP等价的。

37 |
38 | 39 | 40 | -------------------------------------------------------------------------------- /turing/3.md: -------------------------------------------------------------------------------- 1 | # 神谕图灵机(Oracle Turing Machine) 2 | 3 | 神谕图灵机的提出是为了引出图灵归约和 NP-hard ,可以在[货郎问题](./../doc/tsp.html)一节理解图灵归约和神谕图灵机。 4 | 5 | OTM 和 [DTM](./2.html) 很相似,但比 DTM 多了一个神谕状态,和神谕纸带。 6 | 7 | 这多出来的神谕状态可以被看做是一个黑盒子函数,用于帮助我们求解某些难以求解的问题。 8 | 9 | 比如,已知[货郎判定问题](../doc/tsp.html)是 NP-hard,那么货郎优化问题的难度应该如何表示? 10 | 11 | **假设存在一个在多项式时间内解货郎优化问题的算法** A,随后用该算法求出最短路径 L,如果 L大于判定问题,就输出 NO,否则输出 YES。通过这种方法,我们用**货郎优化问题解决了货郎判定问题** 12 | 13 | 在上面的例子中,算法 A 就是**神谕**,以假设货郎优化问题的算法为多项时间为基础,**设计算法并证明货郎判定问题是多项式时间的过程**,被称为**图灵归约**。上述的过程读作将**货郎判定问题图灵归约到货郎优化问题**。 14 | 15 | 此时,根据[图灵归约](./5.html)的定义,货郎判定问题是 NP-hard,因此货郎优化问题也是 NP-hard。 16 | 17 | > 可以看出,如果货郎优化问题可以在多项式时间内解答,那么货郎判定问题一定可以在多项式时间内解答;但是如果货郎判定问题可以在多项式时间内解答,**根据上述算法**,货郎优化问题不一定可以在多项式时间内解答。(可以根据上述图灵归约认定货郎优化问题比货郎判定问题难) 18 | > 19 | > 不过实际上,也可以将货郎优化问题图灵归约到货郎判定问题。这种情况下就可以认为货郎优化问题是 NP等价的。 20 | -------------------------------------------------------------------------------- /turing/4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | P(polynominal, 多项式) 6 | 8 | 9 | 10 | 11 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 |

P(polynominal, 多项式)

28 |

即在多项式时间内可解的问题

29 |

NP(Nondeterministic polynominal, 非确定性多项式)

30 |

存在一部分问题,没有办法在多项式时间内解决,但能在多项式时间内验证某一答案是否正确

31 |

如果有一台非确定型图灵机,那么一个 NP 问题就可以在穷举所有答案后在多项式时间内被解答出来(理想情况下,所有答案在同一时间被穷举,然后在剩下的多项式时间内被同时验证)。

32 |

NPC(Nondeterminism Polynomial complete, NP完全)

33 |

随后就有一个很著名的问题,即 NP类问题等于 P类问题吗?是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢?

34 |

一旦解决这一问题,那么所有的 NP 问题都可以通过计算机来解决。

35 |

解决这一问题的一个办法,就是归约法。如果问题B的算法可以用来解决A(不要求 A 的算法能解 B) ,我们就说问题A可以归约成问题B。比如二元一次方程和一元一次方程的求解方法。显然二元一次方程的解法可以用来求解一元一次方程(令二次项系数为0)。

36 |

因为归约是具有传递性的,即如果 A 可以归约到 B,B 可以归约到 C,A 就可以归约到C。

37 |

那么如果有一个终极的 NP 问题,其他所有的 NP 问题都可以归约到这个问题上,那么当这一个终极 NP 问题解决时,所有的 NP 问题就都解决了。

38 |

如果这个终极的问题存在,那么这个终极问题就被称为是 NPC,能归约到该问题上的其他问题被称为NPC类问题。

39 |

现在,只剩下一个问题了,就是是否存在 NPC 类问题?

40 |

1970年 Cook 证明了第一个 NPC 问题。

41 |

强 NPC 类问题

42 |

存在一些 NPC 问题,当问题中的某个数值参数固定或存在上限时,该问题可以被一个多项式时间算法验证,这类问题在 NPC 问题中相对更加简单,解决的多项式时间算法叫伪(pseudo)多项式时间算法

43 |

而在 NPC 类问题中,除去上面描述的存在伪多项式时间算法的 NPC 类问题后,剩下问题就属于强 NPC 类问题。强 NPC 类问题一定不存在伪多项式时间算法。

44 |
45 |

一个例子是划分问题的动态规划算法,可以参考书中 P124 了解。

46 |
47 |

NP 难问题

48 |

NP困难(NP-hard)难在不一定在多项式时间内被验证正确性,即使NP完全问题有多项式时间的解(P=NP),NP困难问题依然可能没有多项式时间的解。因此NP困难问题 “至少与NP完全问题一样难” 。

49 |
50 |

因此, NPC 问题也可以看做是 NP-hard,其属于 NP-hard 的子集。

51 |
52 |

PNPP\not=NP 时,NP问题和 NP-hard 的交集就是 NPC 问题;当 P=NPP=NP 时,P=NP=NPCP=NP=NPC,如下图所示:

53 |

54 |

NP-hard 问题由图灵归约得到,有三种途径:

55 |
    56 |
  • 一个问题能由任意一个NP问题图灵归约到该问题,则该问题是NP-Hard。
  • 57 |
  • 一个问题能由某个NPC问题图灵归约到该问题,则该问题为NP-hard。
  • 58 |
  • π1\pi_{1} 是NP-hard问题, π1\pi_{1} 可以图灵归约到 π2\pi_{2}(即 π1tπ2\pi_{1}\propto_t \pi_{2}), 则 π2\pi_{2} 也是NP-hard问题。
  • 59 |
60 |

Reference

61 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /turing/4.md: -------------------------------------------------------------------------------- 1 | # P(polynominal, 多项式) 2 | 3 | 即在多项式时间内可解的问题 4 | 5 | # NP(Nondeterministic polynominal, 非确定性多项式) 6 | 7 | 存在一部分问题,没有办法在多项式时间内解决,但能在**多项式时间内验证某一答案是否正确**。 8 | 9 | 如果有一台[非确定型图灵机](./2.html),那么一个 NP 问题就可以在穷举所有答案后在多项式时间内被解答出来(理想情况下,所有答案在同一时间被穷举,然后在剩下的多项式时间内被同时验证)。 10 | 11 | 12 | # NPC(Nondeterminism Polynomial complete, NP完全) 13 | 随后就有一个很著名的问题,即 NP类问题等于 P类问题吗?是否所有能在多项式时间内验证得出正确解的问题,都是具有多项式时间算法的问题呢? 14 | 15 | 一旦解决这一问题,那么所有的 NP 问题都可以通过计算机来解决。 16 | 17 | 解决这一问题的一个办法,就是[归约法](./5.html)。如果问题B的算法可以用来解决A(不要求 A 的算法能解 B) ,我们就说问题A可以归约成问题B。比如二元一次方程和一元一次方程的求解方法。显然二元一次方程的解法可以用来求解一元一次方程(令二次项系数为0)。 18 | 19 | 因为归约是具有传递性的,即如果 A 可以归约到 B,B 可以归约到 C,A 就可以归约到C。 20 | 21 | 那么如果有一个终极的 NP 问题,其他所有的 NP 问题都可以归约到这个问题上,那么当这一个终极 NP 问题解决时,所有的 NP 问题就都解决了。 22 | 23 | 如果这个终极的问题存在,那么这个终极问题就被称为是 NPC,能归约到该问题上的其他问题被称为NPC类问题。 24 | 25 | 现在,只剩下一个问题了,就是是否存在 NPC 类问题? 26 | 27 | 1970年 [Cook](../doc/sat.html) 证明了第一个 NPC 问题。 28 | 29 | 30 | ## 强 NPC 类问题 31 | 存在一些 NPC 问题,当问题中的**某个数值参数固定或存在上限时**,该问题可以被一个**多项式时间算法**验证,这类问题在 NPC 问题中相对更加简单,解决的多项式时间算法叫**伪(pseudo)多项式时间算法**。 32 | 33 | 而在 NPC 类问题中,除去上面描述的存在伪多项式时间算法的 NPC 类问题后,剩下问题就属于强 NPC 类问题。强 NPC 类问题一定不存在伪多项式时间算法。 34 | 35 | > 一个例子是[划分问题](../doc/par.html)的动态规划算法,可以参考书中 P124 了解。 36 | 37 | # NP 难问题 38 | NP困难(NP-hard)难在**不一定**在多项式时间内**被验证正确性**,即使NP完全问题有多项式时间的解(P=NP),NP困难问题依然可能没有多项式时间的解。因此NP困难问题 “**至少与NP完全问题一样难**” 。 39 | 40 | > 因此, NPC 问题也可以看做是 NP-hard,其属于 NP-hard 的子集。 41 | 42 | 当 $P\not=NP$ 时,NP问题和 NP-hard 的交集就是 NPC 问题;当 $P=NP$ 时,$P=NP=NPC$,如下图所示: 43 | 44 | ![](fig/2.png) 45 | 46 | NP-hard 问题由[图灵归约](./5.html)得到,有三种途径: 47 | 48 | - 一个问题能由任意一个NP问题图灵归约到该问题,则该问题是NP-Hard。 49 | - 一个问题能由某个NPC问题图灵归约到该问题,则该问题为NP-hard。 50 | - 若 $\pi_{1}$ 是NP-hard问题, $\pi_{1}$ 可以图灵归约到 $\pi_{2}$(即 $\pi_{1}\propto_t \pi_{2}$), 则 $\pi_{2}$ 也是NP-hard问题。 51 | 52 | 53 | 54 | # Reference 55 | - https://zhuanlan.zhihu.com/p/73953567 56 | - https://zh.wikipedia.org/wiki/NP%E5%9B%B0%E9%9A%BE -------------------------------------------------------------------------------- /turing/5.md: -------------------------------------------------------------------------------- 1 | 2 | # 多项式归约 3 | 4 | 多项式归约也叫多项式变换,通常用在对 NPC 问题的证明中,在 [NPC](./4.html) 一节中简单的提到过。 5 | 6 | 设想两个问题 A 和 B,A 是 NPC 类问题,B 至少是 NP 问题。 7 | 8 | 如果所有 A 问题的实例 $I_A$ ,都可以在**多项式时间内变换**成一个 B 问题的实例 $I_B$,且能够证明当 $I_A$ 有解时**当且仅当** $I_B$ 有解,那么就说明 **B 问题所有实例中,至少存在一个实例子集和问题 A 在多项式时间内等价**(不完全正确,但也可以理解为,B 问题的难度大于等于 A 问题,当 B 问题有解,那么 A 问题肯定有解)。那么 B 问题自然也是 NPC 类问题。不过,如果 **A 问题是 NP 类问题**而不是 NPC,那么只能说明 **B 是(可能)更难的 NP 问题**,而不能证明 B 是 NPC。 9 | 10 | 11 | 上述的过程即为多项式归约(变换),其形式化表述为: 12 | 13 | 在 $\mathrm{NP}$ 类判定问题 $\pi_{1}=\left\langle\Sigma_{1}, L_{1}, \Phi_{1}\right\rangle$ 和 $\pi_{2}=\left\langle\Sigma_{2}, L_{2}, \Phi_{2}\right\rangle$ 之问,若存在变换 $f: \Sigma_{1}^{*} \rightarrow$ 14 | $\Sigma_{2}^{*}, f\left(L_{1}\right) \subseteq L_{2}, \quad$ 使 $\forall I \in L_{1},$ 恒有 $\Phi_{1}(I)=\Phi_{2}(f(I)),$ 并且可用某个 $\mathrm{DTM}$ 程序在 $|I|=n$ 的多项 15 | 式时间内计算出 $f(I),$ 则称判定问题 $\pi_{1}$ 可多项式归约为 $\pi_{2}, f$ 为 $\pi_{1}$ 到 $\pi_{2}$ 的多项式归约, 记为 $\pi_{1} \propto \pi_{2}$。 16 | 17 | 另外一种表述为: 18 | 19 | 设 $\pi_{1}=\left\langle\Sigma_{1}, L_{1}, \Phi_{1}\right\rangle$ 和 $\pi_{2}=\left\langle\Sigma_{2}, L_{2}, \Phi_{2}\right\rangle$ 是两个 $\mathrm{NP}$ 类判定问题, 如果映射 $f: L_{1} \rightarrow L_{2}$ 20 | 满足下述条件: (1) 对任意 $I \in L_{1}, f(I)$ 能用 $|I|$ 的多项式时间确定算法实现 $;(2)$ 若 $I \in Y\left(\pi_{1}\right)$ 当 21 | 且仅当 $f(I) \in Y\left(\pi_{2}\right),$ 那么称映射 $f$ 是从 $\pi_{1}$ 到 $\pi_{2}$ 的多项式归约或多项式变换, 记为 $\pi_{1} \propto \pi_{2}$。 22 | 23 | --- 24 | 25 | 归约的关系可以大致由以下的集合关系表示(其中 $B'\subseteq B$): 26 | 27 | ![](fig/3.png) 28 | 29 | 30 | > 当然,也存在一部分问题,可以相互归约,这说明两个问题谁也不比谁难,如[货郎问题](../doc/tsp.html)中的货郎判定问题和货郎优化问题。 31 | > 32 | > ![](fig/4.png) 33 | 34 | ## 归约通俗步骤 35 | 36 | 将问题 A 多项式归约到问题 B,分以下几步: 37 | - 简单阐述问题 B 是 NP 的。 38 | - 构造将 A 的任意实例变换到 B 问题实例的方法。 39 | - 充分必要条件的证明 40 | - (->) 说明如果问题 A 有解,那么相应的变换后的问题 B 的实例也有解。 41 | - (<-) 说明如果变换后的问题 B 的实例有解,那么变换前对应的问题 A 的实例也有解 42 | 43 | # 图灵归约 44 | 45 | 图灵归约用于证明一个问题是 [NP-hard](./prob.html),从而说明某些[搜索问题](./prob.html)的计算复杂性。 46 | 47 | 其定义基于神谕图灵机,建议参考[神谕图灵机](./3.html)一节的例子理解图灵归约。 48 | 49 | 理解后,再结合下图 50 | 51 | ![](fig/2.png) 52 | 53 | 不难理解以下对图灵归约的声明: 54 | 55 | - 一个问题能由任意一个NP问题图灵归约到该问题,则该问题是NP-Hard。 56 | - 一个问题能由某个NPC问题图灵归约到该问题,则该问题为NP-hard。 57 | - 若 $\pi_{1}$ 是NP-hard问题, $\pi_{1}$ 可以图灵归约到 $\pi_{2},$ 则 $\pi_{2}$ 也是NP-hard问题。 58 | 59 | ## 证明方法 60 | 61 | 将问题 A 图灵归约到问题 B,分以下几步: 62 | 63 | - 假设存在一个复杂度为 $O(1)$ 的求解问题 B 的算法 $M$ 64 | - 利用算法 $M$ 设计一个多项式时间算法解决问题 A。 65 | 66 | > 说明问题 B 是 NP 的步骤可以省略,因为 NP-hard 不要求问题是 NP 的。 67 | 68 | # 难易度的直观理解 69 | 70 | 多项式归约实际上也是图灵归约,只不过要求更严。可以直观的将 $\propto$ 符号理解为小于号(开口向右)。 71 | 72 | 如果问题 $\pi_1 \propto \pi_2$,因为$\pi_1$的所有实例都可以多项式变换为$\pi_2$,那么如果 $\pi_2$ 多项式可解,$\pi_1$一定多项式可解。 73 | 74 | 但如果$\pi_1$有了多项式可解的算法,那么只能够解$\pi_2$问题的所有实例的一个子集,不能够保证所有实例均多项式可解。 75 | 76 | 从这一点出发,归约符号右侧的问题,求解难度至少要大于左侧的。 77 | -------------------------------------------------------------------------------- /turing/fig/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/turing/fig/1.jpg -------------------------------------------------------------------------------- /turing/fig/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/turing/fig/2.png -------------------------------------------------------------------------------- /turing/fig/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/turing/fig/3.png -------------------------------------------------------------------------------- /turing/fig/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sailist/AdAlgo/fd168a3a095017a0a8334096e1f3a5cb25b2c721/turing/fig/4.png -------------------------------------------------------------------------------- /turing/prob.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 问题 6 | 8 | 9 | 10 | 11 | 18 | 21 | 22 | 23 | 24 | 25 | 26 |

问题

27 |

一般而言,问题存在两种形式,即判定问题和搜索问题

28 |

判定问题

29 |

任何判定问题一般会询问“是否”,如划分问题,或者团问题

30 |

搜索问题

31 |

搜索问题也可以叫做优化问题,一般是求解出一个最优值(最大或者最小),经典的如 旅行商问题

32 | 33 | 34 | -------------------------------------------------------------------------------- /turing/prob.md: -------------------------------------------------------------------------------- 1 | # 问题 2 | 一般而言,问题存在两种形式,即判定问题和搜索问题 3 | 4 | ## 判定问题 5 | 任何判定问题一般会询问“是否”,如[划分问题](../doc/par.html),或者[团问题](../doc/clique.html)。 6 | 7 | ## 搜索问题 8 | 9 | 搜索问题也可以叫做优化问题,一般是求解出一个最优值(最大或者最小),经典的如 [旅行商问题](../doc/tsp.html) 10 | 11 | --------------------------------------------------------------------------------