近似算法
判决问题和优化问题:同一问题的两种表述方式
1. 最小顶点覆盖的近似算法
即一直找两个端点都没有被标记的边,直到不存在这样的边为止。
上述算法显然是多项式时间算法,且该近似算法得到的顶点覆盖点数不超过最小顶点覆盖点数的两倍。
核心思想:首先证明其是一个顶点覆盖,其次证明其大小的确不超过最小顶点覆盖的两倍
证明:
- 令 X X X为近似算法得到的顶点覆盖, H H H为 X X X覆盖的边的集合, Y Y Y为最小顶点覆盖。
- H H H中的每条边最多向 X X X贡献两个顶点,因此 X X X大小最多是 H H H大小的两倍,即 ∣ X ∣ ≤ 2 ∣ H ∣ |X|\leq 2|H| ∣X∣≤2∣H∣;由于 Y Y Y是顶点覆盖,因此 H H H中的每一个边都和 Y Y Y中的一些顶点相连。因此 Y Y Y的大小是大于等于 H H H的,即 ∣ H ∣ ≤ ∣ Y ∣ |H|\leq |Y| ∣H∣≤∣Y∣;所以 ∣ X ∣ ≤ 2 ∣ Y ∣ |X|\leq 2|Y| ∣X∣≤2∣Y∣。即,得到顶点覆盖的大小不超过最小顶点覆盖大小的两倍。
2. 最大割的近似算法
最小割的现实应用可能更广一些
即尝试将现有集合划分为两个顶点集合,然后测试这样划分是否能增加割的大小。
对于最大割问题的,2最优的多项式近似算法。
证明:
- 可以给出更强的结论,近似算法得到的割的大小至少是图 G G G中边数的一半。
- 对于任意图 G G G,割边的数量不低于非割边的数量 。如果低于,则说明上述近似算法未执行完,可以找到一个节点,将其从原本的集合划分到另一个集合可以增加割边的数量。
- 由于割边和非割边构成了图 G G G的所有边,近似算法得到的割边数量又不低于非割边的数量 。因此近似算法得到的最大割的大小至少是图 G G G所有边的一半,又最大割的数量是小于等于图 G G G所有边的数量的,所以近似算法得到的最大割的大小至少是真实最大割数量的一半。
3. 最大独立集问题
独立集是团的反一面(反团),独立集中任意两个顶点之间不存在边。
概率算法
使用随机过程结果的算法。核心思想是保证每次随机得到都是最优的解决方案。由于老老实实计算最优解计算成本和时间成本过高,而近似算法又会产生偏差,因此提出概率算法。
1. BPP(Bounded-error, Probabilistic, Polynomial time)
BPP: 概率图灵机在多项式时间,概率误差在
1
2
\frac{1}{2}
21内可以判定的语言集合。
概率图灵机
M
M
M是一种特殊的非确定图灵机。每一次非确定步骤被叫做掷硬币步骤,只有两种合法的状态。
概率图灵机
M
M
M接受输入
w
w
w的概率(可以看作布尔公式的赋值,使最后的输出为真):所有接受分支
b
b
b的概率之和
概率图灵机由于是随机过程的算法,因此会存在判定错误的情况。我们允许小概率错误的出现,并作出如下定义:
由于判定一次最大的错误概率不允许超过
1
2
\frac{1}{2}
21,因此按照输入长度,可以得到对于长度为
n
n
n的输入的最大错误概率
ϵ
=
2
−
n
\epsilon = 2^{-n}
ϵ=2−n
考虑概率算法是否在时间和空间上高效: 看在最坏分支上的时间/空间复杂度,来判定该概率算法是否高效。
2. 素数判定( P R I M E S ∈ B P P PRIMES\in BPP PRIMES∈BPP)
- 遍历所有小于该数的数,如果遍历的数能够作为除数(找因子的过程),则不是素数。该算法是指数时间的,因为数字的大小在其长度上是指数的。
- 利用多项式时间概率算法来进行素数测试。这个方法不基于找因子的思想,因为暂时没找到多项式时间的概率算法来寻找一个数的因子。
模 p p p等价: X X X和 Y Y Y相差 p p p的倍数
费马小定理:
也就是说素数对于
Z
p
+
Z^+_p
Zp+中所有元素都能通过费马测试,但是不是对于
Z
p
+
Z^+_p
Zp+中所有元素都能通过费马测试的数就是素数。
应用:
伪素数: 能通过所有比自己小的素数的费马测试。除了卡米切尔数之外,伪素数和素数是等价的。
非伪素数的性质: 如果一个数不是伪素数,则它至少有一半以上的费马测试它通不过。因此,可以随机选取测试数,通不过其中任意一个测试则为合数。
有一个多项式时间概率算法,能够在除开卡米切尔数的情况下,将合数和质数分离开。
判定伪素数的算法
判定素数的算法
两个定理说明判定素数的算法是正确的,由于除2以外的偶数都不是素数,因此只考虑奇数的情况
不会将正确的判断成错误的
极小概率将错误的判断成正确的
上述算法只会存在单方面错误,也就是判决错误的时候,输入一定是一个合数。单方面错误是概率图灵机的一个特性。
3. RP
C
O
M
P
O
S
I
T
E
S
∈
R
P
COMPOSITES\in RP
COMPOSITES∈RP
RP:如果输入属于该语言,则接受该输入的概率至少为
1
2
\frac{1}{2}
21;如果输入不属于该语言,则被拒绝的概率为1。
概率放大技术
借助概率放大技术:我们可以保持概率图灵机在多项式时间内运行下,错误概率控制在指数小。相当于用长时间来换低错误。
4. Read-once Branching Programs
一个分支程序是一个计算模型,查询输入变量,根据查询结果确定如何执行。一个分支程序可以用有向有环图表示,如下:
由于测试两个分支程序是否等价属于
c
o
N
P
C
coNPC
coNPC问题,目前不知道解决该问题的多项式时间算法。如果我们加入一些限制变为只读一次分支程序,就存在概率多项式时间算法即属于
B
P
P
BPP
BPP。
只读一次分支程序(read-once branching program):从任意起始节点到输出节点的路径上每个变量节点至多被访问一次。(
E
Q
R
O
B
P
∈
B
P
P
EQ_{ROBP} \in BPP
EQROBP∈BPP)
概率算法会使用到随机数,但是我们的随机数产生器实际上是伪随机的。在某些算法中能够表现良好,在一些算法中又表现不好。要证明该伪随机产生器对于该算法是有效的很难。
交互式证明系统
1. 交互式证明系统
交互式证明系统: 就是通过证明者和验证者之间的交互完成计算,直观上说就是设计一个协议完成语言L的交互式计算,使得那么当x∈L时证明者可以给出使验证者(PPT)相信的证明,当x∉L时任何证明者(甚至计算能力超过图灵机)都不能使验证者相信。能被交互式证明系统解决的问题类记为IP。
对于
S
A
T
SAT
SAT问题,证明者可以给出满意的赋值让验证者相信它是可满足的;但是证明者如何说服一个范式是不可满足的呢(SAT问题的补问题不知道是否在
N
P
NP
NP中)?这时需要加入两个额外的特征形成交互式证明系统:
- 他们允许双向交互
- 验证者可以是概率多项式时间图灵机
2. 图同构(
I
S
O
ISO
ISO)问题
尽管图同构问题属于
N
P
NP
NP,但是现在不能确定它属于
P
P
P还是属于
N
P
C
NPC
NPC,属于小部分的还未进行分类的问题。
图的非同构问题甚至不能确定它是否在
N
P
NP
NP中,证明者如何让验证者相信两个图是非同构的。
验证者如果发现证明者一直都能答对,那么两个图是非同构的。如果两个图是同构的,那么证明者只能以百分之50的概率猜测实际是来自哪一个图。验证者可以基于证明者(计算力无穷的一方)的回答,来判断这两个图是否是同构的。
3. 交互式系统模型:
验证者(V):
证明者(
P
P
P):
对同一个输入,随机验证
k
k
k次之后,每次都答对,则会相信该命题是正确的。
NP问题和BPP可以看作交互式证明系统的一个子部分,对应单方面证明和验证者的概率接受过程。图的非同构问题目前无法证明在
N
P
NP
NP或者
B
P
P
BPP
BPP中。
4. Q I P = I P = P S P A C E QIP=IP=PSPACE QIP=IP=PSPACE