并行与分布式系统中的并行凸包算法:Chan算法并行化
题目描述
在计算几何中,给定二维平面上的n个点,凸包是包含所有点的最小凸多边形。Chan算法是一种最优输出敏感凸包算法,其时间复杂度为O(n log h),其中h是凸包的顶点数。在并行与分布式环境中,需要将Chan算法并行化,以利用多处理器或分布式节点来加速大规模点集的凸包计算。请你设计一个并行化的Chan算法,并详细阐述其设计思路、并行步骤、通信模式以及负载均衡策略。
解题过程讲解
我将Chan算法的并行化分解为五个主要阶段,循序渐进地讲解。
第一阶段:理解串行Chan算法核心思想
串行Chan算法是一种“算法套算法”的分治策略,结合了Graham Scan和Jarvis March(礼品包装)的优点。其核心步骤如下:
- 将点集划分为大小为m的若干组(m是一个参数,通常与h有关)。
- 对每个组用Graham Scan(时间复杂度O(m log m))分别计算凸包。
- 用Jarvis March(礼品包装算法)来合并这些子凸包:从最左下点开始,依次寻找下一个凸包顶点。在每一步中,需要对每个子凸包用二分查找找到相对于当前顶点极角最小的点(即“切点”),然后从这些候选点中选出极角最小的点作为下一个顶点。
- 重复步骤3直到回到起点或找到h个顶点。
串行时间复杂度为O(n log h),其中第一步分组和Graham Scan花费O(n log m),第二步Jarvis March每一步花费O((n/m) log m),共h步,总时间O(n log m + h * (n/m) log m)。通过巧妙选择m = h(h未知,需要通过猜测和迭代来逼近),可达到O(n log h)。
关键点:Jarvis March的每一步都需要在所有子凸包上独立执行“找切点”操作,这天然具有数据并行性。
第二阶段:并行化设计总体框架
并行化Chan算法的目标是:
- 保持输出敏感特性O(n log h)。
- 最小化处理器间通信和同步开销。
- 在并行环境下高效实现“分组Graham Scan”和“并行Jarvis步”。
我们假设有p个处理器(或节点),点集已均匀分布在p个处理器上,每个处理器拥有大约n/p个点。总体并行框架如下:
- 数据划分与子凸包计算:每个处理器对自己拥有的点进行分组,并计算各组子凸包(这一步完全独立,无通信)。
- 全局Jarvis March:多个处理器协作执行Jarvis步,每一步中,各处理器并行地在自己的子凸包上找候选点,然后通过归约操作(Reduce)选出全局下一个顶点。
- 迭代与猜测h:并行实现Chan算法中对h的猜测迭代过程。
第三阶段:详细并行步骤
步骤1:数据划分与局部子凸包计算
- 每个处理器Pi有大约n/p个点。
- Pi将自己的点划分为大小为m的若干组(若最后不足m则成一组)。m的初始值可设为一个小常数(如4或8),在后续迭代中按指数增长(如m=2^t)。
- 对每一组,用Graham Scan计算凸包。Graham Scan本身也可以并行化(例如并行排序),但由于组的大小m较小,这里通常用串行Graham Scan即可。
- Pi得到一组子凸包,记为{CHi1, CHi2, ...}。每个子凸包是一个按极角排序的顶点列表(顺时针或逆时针)。
这一步完全独立,无通信,并行效率高。
步骤2:并行Jarvis March
Jarvis March从当前点current(初始为全局最左下点)开始,重复以下步骤直到回到起点或找到的顶点数等于当前猜测的m:
a) 局部切点计算:每个处理器Pi对拥有的每一个子凸包执行二分查找,找到该子凸包上相对于current极角最小的点(即切点)。由于子凸包的点已按极角排序,二分查找时间为O(log m)。每个Pi得到一组候选点(每个子凸包一个候选点)。
b) 局部极角最小点选择:Pi从自己的候选点中选出相对于current极角最小的点,记为local_best_i。
c) 全局归约:通过All-Reduce(或Reduce后广播)操作,在所有处理器的local_best_i中找出全局极角最小的点,即global_best,作为下一个凸包顶点。归约操作用极角比较作为运算符。
d) 更新current = global_best,若current等于起点或顶点数达到m,则停止;否则继续。
注意:步骤a和b在每个处理器上完全并行;步骤c需要全局通信,是主要开销。每一步Jarvis步的并行时间复杂度为O((n/(pm)) log m) 计算 + O(log p) 通信(如果使用树形归约)。
步骤3:迭代猜测h
串行Chan算法通过不断增大m的猜测值(如m=2^t)来逼近h,每次用上述步骤计算凸包,若计算出的凸包顶点数小于m,则成功;否则增大m继续。
并行版本同样迭代:
- 对每个猜测的m,执行步骤1和2。
- 若计算出的凸包顶点数小于m,算法终止,输出凸包。
- 否则,将m翻倍(或按指数增长),重新开始。由于m呈指数增长,最多迭代O(log h)轮。
第四阶段:通信优化与负载均衡
- 归约操作优化:在Jarvis March的每一步中,全局归约是主要通信。我们可以:
- 使用树形归约或蝶形归约,将通信时间从O(p)降至O(log p)。
- 将归约与计算重叠:当一个处理器完成局部切点计算后,可立即开始异步发送数据,而不必等待所有处理器。
- 负载均衡:
- 在数据划分阶段,应使每个处理器的点数大致相等(简单随机分布或按空间划分)。
- 在Jarvis步中,每个处理器的计算负载取决于其拥有的子凸包数量。由于子凸包大小固定为m,子凸包数量与点数成正比,因此负载大致均衡。
- 子凸包存储优化:每个处理器可预先将子凸包存储在数组或平衡二叉树中,以支持快速的二分查找。
第五阶段:复杂度分析与总结
假设有p个处理器,n个点,凸包大小为h。
- 计算时间:每轮迭代中,步骤1(局部Graham Scan)耗时O((n/p) log m);步骤2的Jarvis步共有min(h, m)步,每一步局部计算O((n/(p*m)) log m),局部计算总量O((n/p) log m)(与步骤1同阶)。故每轮迭代计算时间为O((n/p) log m)。
- 通信时间:Jarvis步每一步有O(log p)的归约通信,共min(h, m)步,故每轮通信时间为O(min(h, m) log p)。当m接近h时,通信时间为O(h log p)。
- 总时间:共O(log h)轮迭代,总计算时间O((n/p) log h * log h)?等等,这里需要仔细分析:由于m指数增长,迭代轮数为O(log h),但每一轮的m不同。实际上,Chan算法的聪明之处在于,虽然迭代多次,但总工作量仍为O(n log h)。在并行版本中,总计算时间约为O((n/p) log h)(假设负载均衡),总通信时间约为O(h log h * log p)。当h远小于n/p时,计算占主导,并行效率高。
总结:并行Chan算法通过将子凸包计算完全分布,并在Jarvis March的每一步中并行地寻找局部切点,再通过全局归约合并,实现了高效并行。关键优化在于减少全局归约的步数(即h的大小)和采用高效的归约通信模式。该算法适合分布式内存系统(如MPI)或共享内存多核系统(通过适当同步),能够处理大规模点集的凸包计算问题,并保持输出敏感性。