You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用于合并邻近GDS多边形的最优算法选型

矩形邻近合并的高效优化方案

核心结论:O(n²)并非最优复杂度

朴素嵌套循环并非该问题的最优解法,通过空间索引或分箱策略,可将时间复杂度降低至**O(n log n)**级别,或是大幅削减O(n²)的常数项,显著提升处理速度。

实用优化方案

1. 网格分箱法(Grid Binning)

这是实现成本最低、性价比最高的优化手段:

  • 核心逻辑:将平面划分为边长为0.1的网格(与邻近阈值一致)。满足曼哈顿距离≤0.1的两个矩形,必然落在同一个网格或相邻的8个网格中。
  • 实现步骤:
    • 遍历所有矩形,计算其覆盖的所有网格坐标(例如,矩形x范围对应floor(xmin/0.1)到floor(xmax/0.1),y范围同理),将矩形加入每个覆盖的网格桶。
    • 对每个矩形,仅需检查自身所在网格及8个相邻网格内的其他矩形,计算曼哈顿距离并判断是否需要合并。
  • 优势:矩形分布均匀时,每个网格内的矩形数量极少,实际复杂度接近O(n),常数项远低于朴素O(n²)。
  • 注意:跨多个网格的矩形必须加入所有覆盖的网格,避免漏检邻近矩形。

2. 空间索引结构(KDTree/四叉树)

针对矩形分布极不均匀的场景(如大量矩形集中在局部区域),可使用更精准的空间索引:

  • KDTree筛选候选:
    1. 计算每个矩形的中心坐标(cx, cy) = ((xmin+xmax)/2, (ymin+ymax)/2)。
    2. 用scipy.spatial.KDTree构建中心坐标的索引树。
    3. 对每个矩形,查询中心距离≤0.1 + max(rect_width/2, rect_height/2)的候选矩形(预留矩形自身尺寸的缓冲,避免漏检边缘邻近的矩形)。
    4. 对候选矩形逐一计算精确的曼哈顿距离,判断是否合并。
  • 四叉树:递归划分平面区域,将矩形插入对应子节点,查询时仅遍历与当前矩形邻近的子节点,适合动态添加/删除矩形的场景。

3. 并查集(Union-Find)配合合并管理

合并矩形后可能产生新的大矩形,需处理其与其他矩形的邻近关系,用并查集可高效管理合并集合:

  • 给每个矩形分配唯一索引,初始化每个索引为独立集合。
  • 当两个矩形满足邻近条件时,将它们的索引合并到同一集合。
  • 遍历所有集合,将每个集合内的所有矩形合并为一个包围盒矩形(或连接矩形)。
  • 优势:避免重复遍历和多次合并,批量处理更高效。

矩形曼哈顿距离计算(Python实现)

针对(xmin, ymin, xmax, ymax)格式的矩形,精确计算曼哈顿距离的代码:

def manhattan_rect_distance(rect_a, rect_b):
    # rect_a: (xmin_a, ymin_a, xmax_a, ymax_a)
    # rect_b: (xmin_b, ymin_b, xmax_b, ymax_b)
    dx = max(0, rect_a[0] - rect_b[2], rect_b[0] - rect_a[2])
    dy = max(0, rect_a[1] - rect_b[3], rect_b[1] - rect_a[3])
    return dx + dy

当返回值≤0.1时,两个矩形满足邻近条件。

GDSTK适配提示

若使用GDSTK库,可结合其内置对象简化操作:

  • 将GDSII中的矩形转换为gdstk.Rectangle对象。
  • 用网格分箱法筛选候选矩形,调用自定义距离函数(若GDSTK内置的distance方法非曼哈顿距离)判断邻近关系。
  • 合并时用gdstk.BoundingBox生成包围两个矩形的大矩形,再转换为Rectangle对象。

内容的提问来源于stack exchange,提问作者somerv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:26:18