1. 引言
输入的数据量太大而无法查看时的处理方法
- 忽略问题
- 开发处理此类数据的算法
我们希望在不查看大部分数据的情况下能够做什么
- 无法回答“for all”或“there exists”等确切问题:
- 是否所有的个体都以至多 6 度的分离度相连?
- 地球上究竟有多少人是左撇子?
- 也许可以回答:
- 是否有一大群人以至多 6 度的分离度相连?
- 图的平均成对距离大约为 6 吗?
- 地球上大约有多少人是左撇子?
- 必须妥协:
- 对于最关注的问题:算法必须给出近似答案
本专栏将重点介绍限制在亚线性时间内运行的算法设计,因此只能查看非常小的一部分数据。亚线性时间算法的研究已广泛应用在各种领域,包括代数、图论、几何、字符串和集合运算、优化和概率论。本专栏将介绍许多已应用于分析此类算法的各种技术。主题包括:估计图的参数和属性(最小顶点覆盖、MST、平均度、最大匹配、连通分量、直径、聚类性、二分性);估计分布的参数和属性(熵,支持大小,独立性,均匀性,独立性,单调性,它是自变量的总和吗?);估计函数的属性(线性和低次多项式测试、单调性、线性阈值函数、相关变量的数量)。
2. 点集的近似直径
假设我们有 m m m 个点,编号从 1 1 1 到 m m m,由 m × m m × m m×m 距离矩阵 D D D 描述,这样每个条目 D i , j D_{i,j} Di,j 是从 i i i 到 j j j 的距离. 我们得到以下属性:
- 对称性: D i , j = D j , i D_{i,j} = D_{j,i} Di,j=Dj,i for all i , j ∈ { 1 , . . . , m } i, j ∈ \{1, . . . , m\} i,j∈{1,...,m}.
- 三角不等式: D i , j ≤ D i , k + D k , j D_{i,j} ≤ D_{i,k} + D_{k,j} Di,j≤Di,k+Dk,j for all i , j , k ∈ { 1 , . . . , m } i, j, k ∈ \{1, . . . , m\} i,j,k∈{1,...,m}.
注意,输入大小
n
=
Θ
(
m
2
)
n = Θ(m^2)
n=Θ(m2),因为我们给定了
m
2
m^2
m2 个距离.
我们将直径定义为矩阵
D
D
D 的最大元素
D
i
,
j
D_{i,j}
Di,j. 我们希望输出
k
,
l
k,l
k,l 使得
D
k
,
l
≥
D
i
,
j
/
2
D_{k,l} ≥ D_{i,j}/2
Dk,l≥Di,j/2,我们称其为二乘近似值.
2.1 算法
在这里,我们提出了一个基本算法。该算法将是我们在本专栏中介绍的唯一确定性算法。
- 任意选择 k ∈ { 1 , . . . , m } k∈ \{1, . . . , m\} k∈{1,...,m}
- 查看矩阵 D D D 的第 k k k 行,选择 l l l 以最大化 D k , l D_{k,l} Dk,l
- 输出 k , l , D k , l k,l,D_{k,l} k,l,Dk,l
运行时间 计算量最大的是第二步,它需要查看 m m m 个条目. 这需要 O ( m ) O(m) O(m) 时间,意味着总运行时间为 O ( m ) = O ( n 1 / 2 ) O(m) = O(n^{1/2}) O(m)=O(n1/2),即输入大小的平方根.
正确性 假设对于某些(可能是其他)节点
i
,
j
i,j
i,j,实际直径是
D
i
,
j
D_{i,j}
Di,j. 然后:
D
i
,
j
≤
D
i
,
k
+
D
k
,
j
(
三角不等式
)
≤
D
k
,
i
+
D
k
,
j
(
对称性
)
≤
2
D
k
,
ℓ
(
最大值
)
\begin{aligned} D_{i,j} & ≤ D_{i,k} + D_{k,j} (三角不等式)\\ & ≤ D_{k,i} + D_{k,j} (对称性)\\ & ≤ 2D_{k,ℓ} (最大值)\\ \end{aligned}
Di,j≤Di,k+Dk,j(三角不等式)≤Dk,i+Dk,j(对称性)≤2Dk,ℓ(最大值)
所以
D
k
,
l
D_{k,l}
Dk,l 至少是直径的一半.
请注意,我们使用的度量空间很重要——我们需要使用三角形不等式和对称性来表明我们的输出确实是一个二乘近似值。稍后我们将看到更多示例,其中我们利用输入的特定属性来获得比朴素方法更好的算法结果。
3. 图中连通分量的数量
假设我们有一个图
G
G
G,其中
∣
V
∣
=
n
|V| = n
∣V∣=n,
∣
E
∣
=
m
|E| = m
∣E∣=m,最大度数
d
d
d,以及另一个参数
ε
ε
ε. 假设
G
G
G 以邻接表给出.
我们希望输出
G
G
G 的连通分量数量
c
c
c 的
ε
n
εn
εn-加性近似值. 换句话说,我们希望输出
y
y
y 使得
∣
y
−
c
∣
≤
ε
n
|y-c|≤εn
∣y−c∣≤εn.
3.1 符号定义
我们将为这个问题定义更多的符号,以给出 G G G 的连通分量数的替代表示. 对于所有 v ∈ V v ∈ V v∈V,将 n v n_v nv 定义为 v v v 所属分量的节点数. 观察到对于所有连通分量 A ⊆ V A ⊆ V A⊆V, ∑ u ∈ A 1 n u = ∑ u ∈ A 1 ∣ A ∣ = 1 \sum\limits_{u∈A}\frac{1}{n_u}=\sum\limits_{u∈A}\frac{1}{|A|}=1 u∈A∑nu1=u∈A∑∣A∣1=1.
这意味着,对所有连通分量 A ⊆ V A ⊆ V A⊆V 求和, ∑ u ∈ V 1 n u = ∑ A ⊆ V ∑ u ∈ A 1 n u = ∑ A ⊆ V 1 = c \sum\limits_{u∈V}\frac{1}{n_u}=\sum\limits_{A⊆V}\sum\limits_{u∈A}\frac{1}{n_u}=\sum\limits_{A⊆V}1=c u∈V∑nu1=A⊆V∑u∈A∑nu1=A⊆V∑1=c. 因此,连通分量的数量 c c c 恰好是 ∑ u ∈ V 1 n u \sum\limits_{u∈V}\frac{1}{n_u} u∈V∑nu1.
乍一看,这似乎没有改进。我们好像需要花更多的时间来计算这个总和,因为
n
u
n_u
nu 很难计算,尤其是对于线性大小的分量.
我们现在将展示如何快速估计
n
u
n_u
nu,然后使用采样界限估计连通分量的数量。直觉上,我们将为
n
u
n_u
nu 的估计设置一个独立于
n
n
n 的“截止值”,这样如果我们发现某个分量的顶点太多,我们将返回该截止值.
3.2 子过程
这里,为了估计
1
n
u
\frac{1}{n_u}
nu1,我们定义
n
u
^
:
=
min
{
n
u
,
2
ε
}
\widehat{n_u}:=\min\{n_u, \frac{2}{ε}\}
nu
:=min{nu,ε2} 和
c
^
:
=
∑
u
∈
V
1
n
u
^
\widehat{c}:=\sum\limits_{u∈V}\frac{1}{\widehat{n_u}}
c
:=u∈V∑nu
1.
首先,我们注意到以下几点:
引理 1 对于所有
u
u
u,
∣
1
n
u
^
−
1
n
u
∣
≤
ε
2
\left|\frac{1}{\widehat{n_u}}-\frac{1}{n_u}\right|≤\frac{ε}{2}
nu
1−nu1
≤2ε. 因此,
∣
c
^
−
c
∣
≤
ε
n
2
|\widehat{c}-c|≤\frac{εn}{2}
∣c
−c∣≤2εn.
证明 请注意,
n
u
n_u
nu 始终为正,因此
1
n
u
>
0
\frac{1}{n_u} > 0
nu1>0. 我们现在分类讨论:
- 若 n u < 2 ε n_u<\frac{2}{ε} nu<ε2,那么 n u ^ = n u \widehat{n_u}=n_u nu =nu,因此 1 n u ^ − 1 n u = 0 \frac{1}{\widehat{n_u}}-\frac{1}{n_u}=0 nu 1−nu1=0.
- 否则,
n
u
^
=
2
ε
\widehat{n_u}=\frac{2}{ε}
nu
=ε2. 我们得到
0 < 1 n u ≤ 1 n u ^ = ε 2 . 0<\frac{1}{n_u}≤\frac{1}{\widehat{n_u}}=\frac{ε}{2}. 0<nu1≤nu 1=2ε.由于两个量都在区间 ( 0 , ε / 2 ] (0, ε/2] (0,ε/2] 内,因此它们的差的绝对值至多为 ε 2 − 0 = ε 2 \frac{ε}{2}-0=\frac{ε}{2} 2ε−0=2ε.
因此,在所有情况下,
∣
1
n
u
^
−
1
n
u
∣
≤
ε
2
|\frac{1}{\widehat{n_u}}-\frac{1}{n_u}|≤\frac{ε}{2}
∣nu
1−nu1∣≤2ε. 对所有
u
u
u 求和并使用三角不等式,我们得到
∣
c
^
−
c
∣
=
∣
∑
u
∈
V
1
n
u
^
−
1
n
u
∣
≤
∑
u
∈
V
∣
1
n
u
^
−
1
n
u
∣
≤
∑
u
∈
V
ε
2
=
ε
n
2
.
|\widehat{c}-c|=\left|\sum\limits_{u∈V}\frac{1}{\widehat{n_u}}-\frac{1}{n_u}\right|≤\sum\limits_{u∈V}\left|\frac{1}{\widehat{n_u}}-\frac{1}{n_u}\right|≤\sum\limits_{u∈V}\frac{ε}{2}=\frac{εn}{2}.
∣c
−c∣=
u∈V∑nu
1−nu1
≤u∈V∑
nu
1−nu1
≤u∈V∑2ε=2εn.
现在,我们注意到计算
1
n
u
^
\frac{1}{\widehat{n_u}}
nu
1 耗时更少。计算
1
n
u
^
\frac{1}{\widehat{n_u}}
nu
1 的算法:
- 从
u
u
u 开始执行 BFS,直到满足以下两个条件之一:
- 我们访问了 2 ε \frac{2}{ε} ε2 个不同的节点(即 n u ≥ 2 ε n_u ≥\frac{2}{ε} nu≥ε2 ),在这种情况下我们输出 2 ε \frac{2}{ε} ε2.
- 我们访问了 u u u 的分量的所有 n u < 2 ε n_u<\frac{2}{ε} nu<ε2 个顶点,在这种情况下我们输出 n u n_u nu.
运行时间 请注意,BFS 每一步花费 O ( d ) O(d) O(d) 时间,因为每个顶点的度数最多为 d d d,并且我们在 BFS 中访问 O ( 1 ε ) O(\frac{1}{ε}) O(ε1) 个顶点. 因此,我们的总运行时间为 O ( d ⋅ 1 ε ) O(d\cdot\frac{1}{ε}) O(d⋅ε1). 请注意,我们在技术上不需要因子 d d d (也就是说,我们可以用 O ( 1 ε ) O(\frac{1}{ε}) O(ε1) 代替),但我们保留它,因为我们稍后需要它(特别是对于其他图表示).
3.3 算法
现在,我们如何估计 ∑ u 1 n u ^ \sum_u\frac{1}{\widehat{n_u}} ∑unu 1?算法如下:
- r ← b / ε 3 r←b/ε^3 r←b/ε3 对于某个常数 b b b
- 从 V V V 中独立随机均匀地选择 r r r 个节点 U = { u 1 , . . . , u r } U = \{u_1, . . . , u_r\} U={u1,...,ur}
- 对于所有 u i ∈ U u_i ∈ U ui∈U,通过上面的算法计算 n u i ^ \widehat{n_{u_i}} nui
- 输出 c ^ = n ⋅ ( 1 r ∑ u i ∈ U 1 n u i ^ ) \widehat{c}=n\cdot\left(\frac{1}{r}\sum\limits_{u_i∈U}\frac{1}{\widehat{n_{u_i}}}\right) c =n⋅(r1ui∈U∑nui 1)
请注意,在最后一步中,我们根据样本估计 1 n u ^ \frac{1}{\widehat{n_u}} nu 1 的平均值,并根据顶点数进行重新归一化.
运行时间 由于我们在第三步中选择了 O ( 1 ε 3 ) O(\frac{1}{ε^3}) O(ε31) 个节点并在每个节点上执行了 O ( d ε ) O(\frac{d}{ε}) O(εd) 次 BFS,并且其他步骤的计算量都不大,因此该算法总体上需要时间 O ( d ε 4 ) O(\frac{d}{ε^4}) O(ε4d).
正确性 回忆一下切尔诺夫界——非常强大但有很多移动部分(类似于 Hoeffding 不等式和二项式系数界限)。直观地说,这意味着,随着值的范围越来越小以及误差范围越来越大,我们得到了指数级更强大的保证。更正式地说,我们有:
定理 2 (切尔诺夫界) 令
δ
∈
[
0
,
1
]
δ ∈ [0, 1]
δ∈[0,1]. 假设我们有
X
1
,
X
2
,
.
.
.
,
X
r
X_1, X_2, . . . , X_r
X1,X2,...,Xr,独立同分布的随机变量,范围
[
0
,
1
]
[0, 1]
[0,1],
E
[
X
i
]
=
p
\mathbb{E}[X_i] = p
E[Xi]=p. 令
S
=
∑
i
=
1
r
X
i
S = \sum_{i=1}^rX_i
S=∑i=1rXi. 然后
P
[
∣
S
r
−
p
∣
≥
δ
p
]
≤
e
x
p
(
−
Ω
(
r
p
δ
2
)
)
.
\mathbb{P}\left[\left|\frac{S}{r}-p\right|≥δp\right]≤ exp(−Ω(rpδ^2)).
P[
rS−p
≥δp]≤exp(−Ω(rpδ2)).
请注意,某些版本将
X
i
X_i
Xi 限制为 0 − 1 随机变量. 这里我们使用更通用的版本。
如果我们在这里应用切尔诺夫界,注意到
p
=
E
[
x
i
]
=
1
n
∑
u
∈
V
1
n
u
^
=
c
^
n
,
p=\mathbb{E}[x_i]=\frac{1}{n}\sum\limits_{u∈V}\frac{1}{\widehat{n_u}}=\frac{\widehat{c}}{n},
p=E[xi]=n1u∈V∑nu
1=nc
,
δ
=
ε
2
δ=\frac{ε}{2}
δ=2ε 以及
S
r
=
c
^
n
\frac{S}{r}=\frac{\widehat{c}}{n}
rS=nc
. 因为对所有
u
∈
V
u∈V
u∈V 有
ε
2
≤
1
n
u
^
≤
1
\frac{ε}{2}≤\frac{1}{\widehat{n_u}}≤1
2ε≤nu
1≤1,
ε
n
2
≤
c
^
≤
n
⇒
ε
2
≤
c
^
n
≤
1
,
\frac{εn}{2}≤ \widehat{c} ≤ n⇒\frac{ε}{2}≤\frac{\widehat{c}}{n}≤1,
2εn≤c
≤n⇒2ε≤nc
≤1,
因此
P
[
∣
c
~
−
c
^
∣
≥
ε
c
^
2
]
=
P
[
∣
c
~
n
−
c
^
n
∣
≥
ε
c
^
2
n
]
=
P
[
∣
c
~
n
−
c
^
n
∣
≥
δ
p
]
≤
exp
(
−
Ω
(
b
ε
3
p
δ
2
)
)
=
exp
(
−
Ω
(
b
ε
3
⋅
c
^
n
⋅
(
ε
2
)
2
)
)
≤
exp
(
−
Ω
(
b
ε
3
⋅
ε
2
⋅
(
ε
2
)
2
)
)
=
exp
(
−
Ω
(
b
/
8
)
)
.
\begin{aligned} \mathbb{P}\left[|\widetilde{c}-\widehat{c}|≥\frac{ε\widehat{c}}{2}\right] & = \mathbb{P}\left[\left|\frac{\widetilde{c}}{n}-\frac{\widehat{c}}{n}\right|≥\frac{ε\widehat{c}}{2n}\right] \\ &= \mathbb{P}\left[\left|\frac{\widetilde{c}}{n}-\frac{\widehat{c}}{n}\right|≥δp\right]\\ &≤ \exp\left(−Ω\left(\frac{b}{ε^3}pδ^2\right)\right)\\ &= \exp\left(−Ω\left(\frac{b}{ε^3}\cdot \frac{\widehat{c}}{n}\cdot \left(\frac{ε}{2}\right)^2\right)\right)\\ &≤\exp\left(−Ω\left(\frac{b}{ε^3}\cdot \frac{ε}{2}\cdot \left(\frac{ε}{2}\right)^2\right)\right)\\ &=\exp\left(−Ω(b/8)\right). \end{aligned}
P[∣c
−c
∣≥2εc
]=P[
nc
−nc
≥2nεc
]=P[
nc
−nc
≥δp]≤exp(−Ω(ε3bpδ2))=exp(−Ω(ε3b⋅nc
⋅(2ε)2))≤exp(−Ω(ε3b⋅2ε⋅(2ε)2))=exp(−Ω(b/8)).
将
b
b
b 设置得足够大将为我们提供一个很好的常数概率(即至少
3
4
\frac{3}{4}
43 ) 使得
∣
c
~
−
c
^
∣
≤
ε
c
^
2
\left|\widetilde{c}-\widehat{c}\right|≤\frac{ε\widehat{c}}{2}
∣c
−c
∣≤2εc
,或者
∣
c
~
−
c
∣
≤
∣
c
~
−
c
^
∣
−
∣
c
^
−
c
∣
≤
ε
c
^
2
+
ε
n
2
≤
ε
n
.
\left|\widetilde{c}-c\right|≤\left|\widetilde{c}-\widehat{c}\right|-\left|\widehat{c}-c\right|≤\frac{ε\widehat{c}}{2}+\frac{εn}{2}≤εn.
∣c
−c∣≤∣c
−c
∣−∣c
−c∣≤2εc
+2εn≤εn.
结合我们所有的工作,这意味着我们的算法将根据需要以良好的常数概率返回
G
G
G 的连通分量数的
ε
n
εn
εn-加性近似。
这就是为什么我们选择 2 ε \frac{2}{ε} ε2 作为我们估计连通分量大小的截止值,并选择 r = b ε 3 r=\frac{b}{ε^3} r=ε3b 作为样本大小的部分原因。这些值不仅有助于使我们的运行时间独立于 n n n,同时仍然保持 ε n εn εn-加性误差,它们还有助于降低 切尔诺夫界中的 r r r 和 p p p,这反过来帮助我们应用切尔诺夫界限时在最后几步中获得一个小的恒定错误概率。
请注意,可以将其转化为具有“高概率”保证的算法(即,错误概率最多为 1 p o l y ( n ) \frac{1}{poly(n)} poly(n)1 ),运行时间略有增加(特别是,运行时间变得依赖于 n n n).
此外,事实证明运行时间可以降低到 O ~ ( d ε 2 ) \widetilde{O}\left(\frac{d}{ε^2}\right) O (ε2d).