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

被折叠的 条评论
为什么被折叠?



