【Note】The Power of Grids

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


最近点对

CP(P)=min⁡p,q∈P∥p−q∥CP(P)=\min_{p,q\in P}\|p-q\|CP(P)=minp,qPpq。即,给出点集 P={(xi,yi)}i=1n⊆R2P=\{(x_i,y_i)\}_{i=1}^n\subseteq \mathbb R^2P={(xi,yi)}i=1nR2,求距离(以 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,iPPP 的前 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=ri1Xi=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=2niXi]=1+i=2niE[Xi]=1+i=2niPr[Xi=1]
考虑计算 Pr⁡[Xi=1]=Pr⁡[ri<ri−1]\Pr[X_i=1]=\Pr[r_i<r_{i-1}]Pr[Xi=1]=Pr[ri<ri1],考虑排列中的前 iii 个点,当 ri<ri−1r_i<r_{i-1}ri<ri1 发生时,则 ri−1=CP(Pi∖{pi})>CP(Pi)=rir_{i-1}=CP(P_i\setminus\{p_i\})>CP(P_i)=r_{i}ri1=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) 为包含 PPPkkk 个点的半径最小的圆,记 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. 记 XXXGGG 的所有交叉点。则有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 XxX. 则以 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-近似算法,由于证明部分过于技巧性,暂时略过。

<think>我们正在处理一个关于在计算方法中用于网格和壳表示的二维数组结构(N, nbas)的问题。 根据引用[1],我们了解到数组可以动态声明,例如:integer a[1:0][]; 这表示一个固定大小的动态数组的数组。 用户提到的结构是(N, nbas),其中N可能表示网格点的数量,nbas可能表示每个网格点上的基函数数量(或壳层数量,在量子化学或计算物理中常见)。 然而,引用[2][3][4][5]似乎与问题无关,因为它们讨论的是医学、神经发育评估、元宇宙安全认证和视力筛查,与计算网格和壳表示无关。 因此,我们主要参考引用[1]来理解数组结构。 在计算科学中,特别是有限元方法、量子化学计算(如基组展开)等领域,我们经常使用二维数组来表示空间离散化或基函数系数。 例如: - 网格:将连续空间离散化为点(或单元)的集合。每个网格点可能有多个属性(如坐标、值等)。 - 壳(shell):在量子化学中,基组通常按壳组织(一个壳包含一组具有相同角量子数的基函数,例如s壳有1个函数,p壳有3个函数等)。 一个二维数组(N, nbas)可以这样解释: - 第一维(大小为N)代表网格点的索引。 - 第二维(大小为nbas)代表每个网格点上存储的数据,可能是每个基函数的值,或者每个壳的某种属性(如电子密度、轨道系数等)。 例如,如果我们计算一个分子轨道在空间网格点上的值,我们可能会有一个数组`orbital_grid`,其中`orbital_grid[i, j]`表示第i个网格点上第j个基函数的值(或者第j个壳的某个值)。 但是,注意nbas可能代表每个网格点上基函数的数量(即基组的大小),那么数组的每个元素可能是该网格点上对应基函数的系数或函数值。 另一种解释:在材料科学或计算流体力学中,网格点可能有多个壳(例如在晶体塑性有限元中,每个积分点有多个滑移系,每个滑移系可以视为一个壳),那么nbas可能表示壳的数量,而数组存储每个壳的状态变量。 因此,具体含义取决于上下文,但数据结构是二维数组,第一维是网格点,第二维是每个网格点上的壳(或基函数)的索引。 我们也可以参考引用[1]中动态数组的声明方式,但用户的问题更关注结构(N, nbas)的含义。 下面我们将详细解释这种结构及其在计算方法中的使用。</think>### 二维数组结构 (N, nbas) 在计算方法中的网格与壳表示 在计算科学中,二维数组结构 `(N, nbas)` 常用于表示**空间离散化网格**和**基函数/壳层数据**的结合,尤其在量子化学、有限元分析等领域。以下是详细解释: #### 1. **结构定义** - **`N`**:表示**网格点数量**,即空间离散化后的坐标点总数。 例如:$N=1000$ 表示将计算域划分为 1000 个网格点。 - **`nbas`**:表示**基函数数量**或**壳层数量**(shell),用于展开波函数或物理量。 例如:在量子化学中,`nbas` 可能对应原子轨道基组的数量(如 STO-3G 基组有 5 个基函数)[^1]。 #### 2. **数据存储方式** - 每个网格点存储 `nbas` 个基函数的系数或属性值: ```python # 示例:存储每个网格点上基函数的系数 grid_data = np.zeros((N, nbas)) # 二维数组 (N, nbas) ``` - **物理意义**: - `grid_data[i, j]` = 第 `i` 个网格点处第 `j` 个基函数的系数(如波函数值 $\psi_j(\mathbf{r}_i)$)。 - 在壳层表示中,`j` 可对应特定原子轨道的壳层(如 s/p/d 壳层)[^3]。 #### 3. **典型应用场景** - **电子密度计算**: 通过基函数展开计算空间电子分布 $\rho(\mathbf{r}) = \sum_{j=1}^{\text{nbas}} c_j \phi_j(\mathbf{r})$,其中 $c_j$ 存储在数组中。 - **有限元分析**: 每个网格点关联一组基函数,用于插值物理量(如温度场 $T(\mathbf{r})$)。 - **神经发育研究中的脑网络分析**: 类似结构可存储脑区功能连接强度(如左额顶叶-左颞叶连接),其中 `N` 为脑区数量,`nbas` 为连接类型维度[^2]。 #### 4. **性能优化技巧** - **内存布局**:优先使用行主序(Row-major)存储以提高缓存利用率。 - **稀疏性处理**: 当基函数局部性强时(如高斯基),使用稀疏矩阵存储(如 `scipy.sparse`): ```python from scipy import sparse sparse_grid = sparse.csr_matrix((N, nbas)) # 压缩稀疏行格式 ``` - **并行计算**: 对网格点分块并行计算基函数系数(如 MPI 或 GPU 加速)。 --- ### 相关问题 1. 如何选择网格大小 `N` 和基函数数量 `nbas` 以平衡计算精度与效率? 2. 在量子化学计算中,哪些基组(如 STO-3G、6-31G*)的 `nbas` 值更适用于大体系模拟? 3. 如何处理二维数组 `(N, nbas)` 在分布式内存系统上的通信瓶颈? [^1]: 动态数组声明语法 `integer a[1:0][]` 支持灵活维度扩展。 [^2]: 功能连接强度与行为评分(如社会互动 Z 评分)存在显著相关性。 [^3]: NBAS 评估关注行为特征与环境互动能力,类似基函数展开量化复杂系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值