【Note】The Power of Grids

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_+ rR+,对于一个点 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/rr,y/rr)。即 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/rr,y/rr),其中 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):pP},即将所有 P P P 中的点映射网格上得到的离散点集。


最近点对

C P ( P ) = min ⁡ p , q ∈ P ∥ p − q ∥ CP(P)=\min_{p,q\in P}\|p-q\| CP(P)=minp,qPpq。即,给出点集 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=1nR2,求距离(以 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=ri1 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=2niXi]=1+i=2niE[Xi]=1+i=2niPr[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<ri1],考虑排列中的前 i i i 个点,当 r i < r i − 1 r_i<r_{i-1} ri<ri1 发生时,则 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} ri1=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 xX. 则以 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-近似算法,由于证明部分过于技巧性,暂时略过。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值