【问题标题】:Generating a distance-grid around given points围绕给定点生成距离网格
【发布时间】:2014-05-31 04:02:51
【问题描述】:

我正在处理欧几里得空间中的一组 (a) 点 P(为了简单起见,我们假设平面),(b) 一个边界矩形[a,b] x [c,d] 包含 P 中的所有点,以及 (c) 一个正整数向量 (m,n),编码沿每个维度的细分。基本问题是

如何有效地构建到 P 的距离为 m x n 的网格?

特别是,我想在矩形 [a,b] x [c,d] 的明显 m x n 网格分解中生成到 P 的距离函数的三次近似:将 X 方向切成 m 块和 Y 方向分成 n 块,并且对于由分区产生的每个小矩形 R,计算如下定义的到 P 的 正整数距离 d(R)。

考虑一个加权图 G,它的顶点集 V 对应于我们网格中的小矩形,在邻居之间(甚至是对角线邻居)的边的权重为 $1$。如果相应的矩形包含 P 的一个点,则调用一个顶点“红色”。我要计算的是 V 上的函数 d,它采用正整数值,它将 G 中的最短距离与红色顶点相关联。因此,如果一个小矩形实际上包含来自 P 的一个点,那么它的关联顶点将被分配为“0”。如果它不包含 P 的点,但与包含的矩形相邻(甚至是对角线),则它得到“1”,依此类推...

考虑每个点到每个小矩形的距离并跟踪最小值的幼稚方法会产生 |P|mn 的成本,这对于大型网格来说似乎是令人望而却步的。所以这是我考虑的第二种方法:将每个 d(R) 设置为某个大的 MAX 到网格中不包含来自 P 的点的每个 R。然后,为每个包含 a 的 R 设置 d(R) = 0 P 的点并将其所有具有严格较大 d 值的邻居放入队列中。然后,迭代这个直到队列为空:

  1. 从队列中弹出一个网格矩形 R,
  2. 如果 d(R) > 1 + d(R') 其中 R' 是处理入队 R 的邻居,则设置 d(R) = 1 + d(R') 并将 R' 的所有邻居与 d 入队-值超过 1+d(R)。

对于如何比“第二种方法”更有效地解决此问题的任何想法,我将不胜感激。

【问题讨论】:

  • 似乎“到一组点的距离”是指“到一组点的最短距离”,对吗? (请注意,这不一定遵循 metric,这是“距离”的常用数学概念,因为它可能违反三角不等式。)
  • 是的,我的意思是到任何点的最短距离......即使这样,我的意思是根据立方体数量计算的距离,而不是固有的欧几里得距离。感谢您指出这一点!
  • 不要成为一个书呆子,但是尽管您已经更新了您的问题,但您实际上仍然没有定义您使用的距离度量!图论中“到一组点的距离”有不止一个可能的定义。

标签: algorithm computational-geometry


【解决方案1】:

您说的是二值图像中的拓扑距离。矩形可以被视为像素,包含 P 点的矩形定义距离 0。距离 1 用于紧邻的像素(通过边缘或角,8 连接),距离 2 用于紧邻后者的像素,依此类推开。

使用队列计算距离图是个好主意。通过推送 level0 像素的所有 8 个邻居来初始化队列。然后弹出它们,分配级别 1,并推送未分配的 8 个邻居......(就像你描述的那样)。

这是一个线性过程(每个像素都被处理了恒定的次数),因此它是最优的,因为每个像素的级别都需要计算。你不能做得更好。

我猜你也可以通过两次扫描线过程来填充距离图。

1) 处理从左上到右下,依次考虑每个像素的 4 个顶部和左侧 8 个邻居。 (取邻居中最小的级别并加1)。

2) 然后处理从右下角到左上角,考虑 4 个底部和右侧 8 个邻居。

【讨论】:

  • 谢谢!我假设在第二段的最后一行中您分配的是距离+1而不是距离-1?否则该方案似乎给出否定答案,因为我们从 0 开始......
  • 是的,这是一个错字。我应该写 1 级,其中破折号不代表减法。我正在解决这个问题。
【解决方案2】:

您当前的算法适用于低维度。一般来说,对于 k 维,根据您当前允许对角线的方案,每个网格单元将有 3^k-1 个邻居,因为对于任何给定的网格位置,要生成相邻位置,您可以选择任何方式来分配位移每个坐标分别为 -1、0 或 1,但不允许由 k 个 0 组成的位移矢量。

我们称细胞总数为 p(例如 p = mn,k=2)。每个网格单元必须至少从队列中拉出一次,即使我们应用技巧来寻找避免将所有邻居推入队列的方法,在我看来,所有 3^k-1 的它的邻居此时仍然必须检查,所以我认为没有办法避免 O(3^k*p) 的运行时间。

然而,这也为这个算法的 O(3^k*p) 提供了一个上限 空间 边界来保持队列。这可能并不严格,但我仍然可以通过以下构造获得 k 维的 O(1.5^k*p) 空间使用的界,我将首先针对 2D 情况进行描述:考虑一个由任意数量的 2x2 块构建的问题实例,其中每个块中的单元 (0, 0) 不包含点,而周围的 3 个单元每个包含一个或多个点。 (更高维度的模拟在每个维度中都有一个宽度为 2 的重复块,每个块中 (0, 0, ..., 0) 处的单元格不包含任何点,而另一个 2^k-1 具有一个或更多。)每个块内 (0, 0, ..., 0) 处的单元格具有 3^k-1 个距离值为 0 的邻居的完整队伍,因此它将被推入队列 3^k-1 次在第一个副本被拉出队列之前。我们唯一的缓解因素是输入中每 2^k 个单元格中只有 1 个具有此属性,因此总共 (3^k-1)/2^k = O(1.5^k) 个单元格将被推送到平均每个单元格排队,或总体 O(1.5^k*p)。 (当然,其他构造可能会产生更高的上限......)

尽管如此,可以通过维护一个 m*n 标志数组来摆脱这个 1.5^k 因素,以指示特定单元格是否已被推入队列。这是有效的,因为总距离不会随着从队列中读取单元格而减少(这是广度优先搜索,当搜索图中的所有边都具有单位权重时,这是最佳优先搜索),所以 第一次一个单元格被拉出队列的时间是它的最小值。 这意味着没有必要一开始就推送该单元格的剩余副本,您可以通过检查在这样做之前为该单元格设置相应的标志,然后设置它。您将需要 O(p) 额外的标志空间,但这并不比您已经用来保存输入的空间多,并且每个标志实际上可以是一个位,这会降低(上界)整体空间复杂度降至 O(p)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多