Reference: Geometric Approximation Algorithms, Sariel Har-Peled.
回来写点看书的note,主要是简单整理一下看过的内容。看的第一本书是导师推荐的 Geometric Approximation Algorithms,里面介绍了一些几何问题的经典的techniques.
网格化(Grid)利用网格坐标点离散的性质,可以设计一些运行时间为 p o l y ( m ) \mathrm{poly}(m) poly(m)( m m m 为网格尺寸,一般不大于输入规模,如点数)的算法(多用于随机算法、近似算法)。主要讨论了两个例子:最近点对,以及最小闭包球。
一些记号
首先给出一些会用到的记号。
固定 r ∈ R + r\in \mathbb R_+ r∈R+,对于一个点 p = ( x , y ) ∈ R 2 p=(x,y)\in \mathbb R^2 p=(x,y)∈R2,定义 G r ( p ) = ( ⌊ x / r ⌋ r , ⌊ y / r ⌋ r ) G_r(p)=(\lfloor x/r \rfloor r,\lfloor y/r \rfloor r) Gr(p)=(⌊x/r⌋r,⌊y/r⌋r)。即 G r G_r Gr 是一个网格,每个格子的宽度为 r r r, G r ( p ) G_r(p) Gr(p) 将点 p p p 映射到一个交叉点处,从而变成离散的数据。定义一个网格群(grid cluster) 为连续的 3 × 3 3\times 3 3×3 的区域。对于每个格子 C \mathcal C C,它有一个唯一的编号 i d C = i d ( p ) = ( ⌊ x / r ⌋ r , ⌊ y / r ⌋ r ) id_\mathcal C=id(p)=(\lfloor x/r \rfloor r,\lfloor y/r \rfloor r) idC=id(p)=(⌊x/r⌋r,⌊y/r⌋r),其中 p = ( x , y ) p=(x,y) p=(x,y)是 C \mathcal C C 中的任意一点。对于一个点集 P P P,定义 G r ( P ) = { G r ( p ) : p ∈ P } G_r(P)=\{G_r(p):p\in P\} Gr(P)={Gr(p):p∈P},即将所有 P P P 中的点映射网格上得到的离散点集。
最近点对
求 C P ( P ) = min p , q ∈ P ∥ p − q ∥ CP(P)=\min_{p,q\in P}\|p-q\| CP(P)=minp,q∈P∥p−q∥。即,给出点集 P = { ( x i , y i ) } i = 1 n ⊆ R 2 P=\{(x_i,y_i)\}_{i=1}^n\subseteq \mathbb R^2 P={(xi,yi)}i=1n⊆R2,求距离(以 L 2 \mathcal{L}_2 L2 距离为例)最近的两个点。
首先我们有
引理1.2.2: 给定一个 n n n 个点的点集 P P P,以及 r > 0 r>0 r>0, 可以在线性时间内判断 C P ( P ) < r CP(P)<r CP(P)<r 是否成立。
proof: 首先 G r ( P ) G_r(P) Gr(P) 可以在线性时间内计算得到,并且至多 n n n 个格子内有点。只需证明:如果一个格子内有超过 9 9 9 个点,则这个格子中必然存在一对点,它们的距离小于 r r r。考虑一个格子包含超过 9 9 9 个点,把这个格子均匀分成 3 × 3 3\times 3 3×3 个小格子,则必有一个小格子中有至少两个点,由于这个小格子的对角线长度为 r 2 + r 2 / 3 < r \sqrt{r^2+r^2}/3<r r2+r2/3<r,因此必然存在一对点距离小于 r r r。 ■ \blacksquare ■
根据 引理1.2.2,可以得出一个暴力做法,首先按照某种顺序排列 P P P 中的点。假如我们已经计算出前 i i i 个点的最近点距离,设为 r i r_i ri,以及 G r i ( P 1 , i ) G_{r_i}(P_{1,i}) Gri(P1,i)( P 1 , i P_{1,i} P1,i 为 P P P 的前 i i i 个点)。则此时 G r i G_{r_i} Gri 中每个格子中的点的数量不超过 9 9 9 个,因此把第 i + 1 i+1 i+1 个点 p i + 1 p_{i+1} pi+1 加入网格,并且计算其与以 G r i ( p i + 1 ) G_{r_i}(p_{i+1}) Gri(pi+1) 为中心的 3 × 3 3\times 3 3×3 个格子中的点的距离,若最小的距离不小于 r i r_i ri,则 r i + 1 = r i r_{i+1}=r_i ri+1=ri,否则 r i + 1 r_{i+1} ri+1 为这个最小距离。如果发现 r i ≠ r i + 1 r_i\neq r_{i+1} ri=ri+1,则暴力重构 G r i + 1 ( P 1 , i + 1 ) G_{r_{i+1}}(P_{1,i+1}) Gri+1(P1,i+1).
每次暴力重构需要 O ( n ) O(n) O(n) 时间,假设重构了 k k k 次,则总时间复杂度为 O ( n k ) O(nk) O(nk). 实际上,如果我们在开头对 P P P 进行随机排列,则可以得到一个更好的结果
定理 1.2.3: 给定一个 n n n 个点的点集 P P P,可以在 期望O(n) 的时间内计算最近点对距离。
proof: 只需要对
P
P
P 进行随机排列,再运行 引理1.2.2 的算法即可。下分析时间复杂度:只需要分析构造网格需要的时间总和(设为
T
(
n
)
T(n)
T(n))即可。令
X
i
X_i
Xi 为一个
0
/
1
0/1
0/1 随机变量,若
r
i
≠
r
i
−
1
r_i\neq r_{i-1}
ri=ri−1 则
X
i
=
1
X_i=1
Xi=1,否则
X
i
=
0
X_i=0
Xi=0. 则
E
[
T
(
n
)
]
=
E
[
1
+
∑
i
=
2
n
i
X
i
]
=
1
+
∑
i
=
2
n
i
E
[
X
i
]
=
1
+
∑
i
=
2
n
i
Pr
[
X
i
=
1
]
E[T(n)]=E\left[1+\sum_{i=2}^niX_i\right]=1+\sum_{i=2}^niE[X_i]=1+\sum_{i=2}^ni\Pr[X_i=1]
E[T(n)]=E[1+i=2∑niXi]=1+i=2∑niE[Xi]=1+i=2∑niPr[Xi=1]
考虑计算
Pr
[
X
i
=
1
]
=
Pr
[
r
i
<
r
i
−
1
]
\Pr[X_i=1]=\Pr[r_i<r_{i-1}]
Pr[Xi=1]=Pr[ri<ri−1],考虑排列中的前
i
i
i 个点,当
r
i
<
r
i
−
1
r_i<r_{i-1}
ri<ri−1 发生时,则
r
i
−
1
=
C
P
(
P
i
∖
{
p
i
}
)
>
C
P
(
P
i
)
=
r
i
r_{i-1}=CP(P_i\setminus\{p_i\})>CP(P_i)=r_{i}
ri−1=CP(Pi∖{pi})>CP(Pi)=ri,我们称满足
C
P
(
P
i
∖
{
p
}
)
>
C
P
(
P
i
)
CP(P_i\setminus\{p\})>CP(P_i)
CP(Pi∖{p})>CP(Pi) 的点
p
p
p 为关键点,则
p
i
p_i
pi 是关键点,且显然有至多两个点是关键点。因此
Pr
[
X
i
=
1
]
=
Pr
[
p
i
\Pr[X_i=1]=\Pr[p_i
Pr[Xi=1]=Pr[pi 是关键点
]
≤
2
/
i
]\le {2/i}
]≤2/i,从而
E
[
T
(
n
)
]
=
O
(
n
)
E[T(n)]=O(n)
E[T(n)]=O(n).
■
\blacksquare
■
k k k-最小闭包圆( k k k-Enclosing Minimum Disk)的 2-近似算法
首先给出问题定义。
对于一个圆 D D D,其半径记为 r a d i u s ( D ) \mathrm{radius}(D) radius(D). 定义 D o p t ( P , k ) D_{opt}(P,k) Dopt(P,k) 为包含 P P P 中 k k k 个点的半径最小的圆,记 r o p t ( P , k ) r_{opt}(P,k) ropt(P,k) 为其半径。则要求出 r o p t ( P , k ) r_{opt}(P,k) ropt(P,k)。
利用网格,我们可以得到以下结果
引理1.3.1:给定 n n n 个点的点集 P P P,可以在 O ( n ( n / k ) 2 ) O(n(n/k)^2) O(n(n/k)2) 的时间内得到一个圆 D D D,使得 r a d i u s ( D ) ≤ 2 r o p t ( P , k ) \mathrm{radius}(D)\le 2r_{opt}(P,k) radius(D)≤2ropt(P,k).
proof: 在平面上求出 m = O ( n / k ) m=O(n/k) m=O(n/k) 条水平直线,使得两两直线之间至多有 k / 4 k/4 k/4 个点。这可以利用分治在 O ( n log ( n / k ) ) O(n\log (n/k)) O(nlog(n/k)) 时间内计算出来。同样也可以求出 m m m 条竖直直线满足这样的要求。从而通过这些直线,我们得到了一个格子尺寸不一致(non-uniform)的网格 G G G. 记 X X X 为 G G G 的所有交叉点。则有 D o p t ( P , k ) D_{opt}(P,k) Dopt(P,k) 必然包含 X X X 中的一个点。这个结论反证一下就可以得到。因此只要枚举 X X X 中的每一个点,计算以它为圆点的 k k k-最小闭包圆 即可,这一步可以通过计算出所有点到这个点的距离后利用 kth-element 在 O ( n ) O(n) O(n) 时间内得到。因此总的时间复杂度为 O ( n ( n / k ) 2 ) O(n(n/k)^2) O(n(n/k)2)。下证这是一个2-近似解。设 D o p t ( P , k ) D_{opt}(P,k) Dopt(P,k) 的圆心为 p p p,它包含点 x ∈ X x\in X x∈X. 则以 x x x 为圆心, 2 r o p t ( P , k ) 2r_{opt}(P,k) 2ropt(P,k) 为半径的点必然包含圆 D o p t ( P , k ) D_{opt}(P,k) Dopt(P,k),因此至少包含 k k k 个点,从而利用以上算法的出的 D D D 的半径必然小于 2 r o p t 2r_{opt} 2ropt. ■ \blacksquare ■
显然,如果 k = Ω ( n ) k=\Omega(n) k=Ω(n),则我们有了一个线性时间的2-近似算法。这一章的最后还给出了一个期望线性时间的2-近似算法,由于证明部分过于技巧性,暂时略过。