美文网首页
[原创] 使用[染色法]快速判断地图上任意两个分区是否相邻

[原创] 使用[染色法]快速判断地图上任意两个分区是否相邻

作者: 老罗话编程 | 来源:发表于2021-12-04 09:07 被阅读0次

使用[染色法]快速判断分区相邻

问题

对于地图上任意形状的两个分区(已使用不同颜色标记),如何快速判断他们是否相邻

建模

对于两个点集A, B,
判断是否存在这样的两个点:

  • 点Pa, Pa属于A
  • 点Pb, Pb属于B
  • Pa到Pb的距离小于阀值k(k>=1, k<=10)

过程

  1. 定义A的染色集Sa = new Set<Int>(),
  2. 遍历A的所有点, 并加入染色集:
const k = 1; // 相邻阀值
var Sa = new Set<Int>()
for(p in A) {
    for(x in (p.x - k)..(p.x + k)) {
      for(y in (p.y - k) .. (p.y+k)) {
        Sa.put (x << 16 | y)  // 这里假设x, y都小于65536
      }
    }
}
  1. 遍历B, 判断是否存在Pb, Pb in Sa:
fn isNeighbour(B, Sa) : bool {
    for(p in B) {
        for(x in (p.x - k)..(p.x + k)) {
          for(y in (p.y - k) .. (p.y+k)) {
            if (Sa.has (x << 16 | y)) {
                // 命中, 相邻
                return true;
            }
          }
      } 
    }

  // 不相邻
  return false;
}

复杂度分析

最坏情况:
两个分区不相邻(任意点距大于k): (2k+1)^2 * (Na + Nb), k为距离阀值, N为点数

最好情况:
两个分区相邻, 且Pb第一个点命中: (2k+1)^2 * min(Na, Nb), k为距离阀值, N为点数

相关文章

网友评论

      本文标题:[原创] 使用[染色法]快速判断地图上任意两个分区是否相邻

      本文链接:https://www.haomeiwen.com/subject/vksvxrtx.html