最小曼哈顿距离

时间:2014-04-01 13:03:35

标签: algorithm math mathematical-optimization

输入:

  • 一组积分
  • 坐标为非负integer类型。
  • 整数k

输出

点P(x,y)(在给定集合中或不在其中)与曼哈顿距离最近的点是最大值max(x, y) <= k

我的(天真)解决方案:

For every (x, y) in the grid which contain given set
    BFS to find closest  point to (x, y)
    ...
return maximum;

但我觉得它对于一个大网格运行速度很慢,请帮我设计一个更好的算法(或代码/伪代码)来解决这个问题。

我是否应该循环遍历网格中的每个(x, y),只需循环每个中间值x, y

P.S:对不起我的英文

编辑:

示例:

给定P1(x1,y1), P2(x2,y2), P3(x3,y3)。查找P(x,y) min {dist(P,P1),dist(P,P2),     dist(P,P3)}是最大的

3 个答案:

答案 0 :(得分:3)

是的,你可以做得更好。我不确定我的解决方案是否是最佳的,但它比你的更好。

而不是为网格中的每个点单独执行BFS。一次从所有输入点执行“累积”BFS。

从二维数组dist [k] [k]开始,单元格初始化为+ inf,如果此单元格的输入中有一个点,则为零,然后从输入的每个点P开始尝试进入每个可能的方向。你从起点开始越远,你在数组dist中放入的整数越大。如果某个特定单元格中存在dist值,但您可以使用较小的步长(较小的整数)来覆盖它。

最后,当不能再进行移动时,扫描数组dist以找到具有最大值的单元格。这是你的观点。

我认为这在实践中会很有效。

对于k = 3,假设1 <= x,y <= k,P1 =(1,1),P2 =(1,3),P3 =(2,2)

dist在开头是平等的

0,+ inf,+ inf,

+ inf,0,+ inf,

0,+ inf,+ inf,

下一步将是:

0,1,+ inf,

1,0,1,

0,1,+ inf,

在下一步中将是:

0,1,2,

1,0,1,

0,1,2,

所以输出是P =(3,1)或(3,3)

答案 1 :(得分:1)

首先尝试

我们可以通过投影到线y = x和y = -x将2D问题转化为一维问题。如果点是(x1,y1)和(x2,y2)那么曼哈顿距离是abs(x1-x2)+ abs(y1-y2)。将坐标更改为u-v系统,基数为U =(1,1),V =(1,-1)。该基础中的两点的坐标是u1 =(x1-y1)/ sqrt(2),v1 =(x1 + y1),u2 =(x1-y1),v2 =(x1 + y1)。 manhatten距离是abs(u1-u2),abs(v1-v2)中最大的距离。

这有多大帮助。我们可以使用每个点的1D u值。按u值排序,循环通过点并找出点之间的最大差异。做同样的v值。

计算O(n)的u,v coords,快速排序为O(n log n),循环排序列表为O(n)。

唉效果不好。如果我们有点(-10,0),(10,0),(0,-10),(0,10),则失败。让我们尝试一下

Voronoi图

使用曼哈顿距离构建Voronoi diagram 。这可以使用https://en.wikipedia.org/wiki/Fortune%27s_algorithm以O(n log n)计算 图中的顶点是距离其最近顶点最大距离的点。在维基百科页面上有算法的psudo代码。您可能需要根据曼哈顿距离进行调整。

答案 2 :(得分:1)

如果K不够大并且你需要找到一个带整数坐标的点,你应该这样做,如另一个答案所示 - 使用BFS计算网格上所有点的最小距离,一次性从所有给定点开始。

更快的解决方案,对于大K,并且可能是唯一可以找到具有浮点坐标的点,如下所示。它具有O(n log n log k)

的复杂性

使用diichomy搜索最终距离。您必须检查方形[0,k] X [0,k]内是否有任何点,它至少与给定集合中的所有点保持距离。假设,你可以检查任何距离足够快。很明显,如果对于某个距离R存在这样的点,则对于所有较小距离r,总是存在一些点。 R.例如,同样的观点也会如此。因此,您可以使用二进制搜索过程搜索最大距离。

现在,如何快速检查是否存在(并且还找到)距离所有给定点至少r个单位的点。您应该在所有给定点周围绘制“半径为r的曼哈顿球”。这些是距离给定点最多r个单位的一组点。它们倾斜45度方形,对角线等于2r。现在将图片旋转45度,所有正方形将与轴平行。现在,您可以使用扫描线算法检查此类方块外是否存在任何点。您必须对方块的所有垂直边缘进行排序,然后从左到右逐个处理它们。左边框将向扫描线添加线段标记,左边框将删除它。你必须检查线上是否有任何非标记点。您可以使用分段树实现它。然后,你必须检查初始方形[0,k] X [0,k]内的线上是否有任何非标记点。

因此,再次,整体解决方案将是r的二进制搜索。在它内部你必须检查是否有任何点距离所有给定点至少r个单位。通过构建“半径r的manhattans球体”然后用从左上角到右下角的对角线扫描它们来做到这一点。移动线时,您应该在分段树中的线的每个点处存储打开的球体的数量。在任何球体的打开和关闭之间,线条不会改变,如果那里有任何自由点,则意味着你发现距离为r。

二进制搜索将log k归因于复杂性。每个检查过程都是n log n用于排序方块边界,n log k(n log n?)用于处理它们。

Voronoi图是另一种快速解决方案,也可以找到非整数答案。但即使对曼哈顿的措施也很难实施。