问题描述
给出一个边为N的正方形网格。在网格上还给出了一组输入点。需要在网格上找到另一组点(可以是多个),这些点到给定输入点的曼哈顿距离最大。
例如,使用N = 4
并输入[p1:{0,0},p2:{3,3}]
,输出应为[{0,3},{1,2},{2,1},{3,0}]
,距离等于3。
0 1 2 3
┌───┬───┬───┬───┐
0 │p1 │ │ │ x │
├───┼───┼───┼───┤
1 │ │ │ x │ │
├───┼───┼───┼───┤
2 │ │ x │ │ │
├───┼───┼───┼───┤
3 │ x │ │ │p2 │
└───┴───┴───┴───┘
我的第一个尝试是简单的蛮力迭代-对于网格中的每个点,计算到每个输入点的曼哈顿距离,取最小值,最后从这些最小值中取最大值。这当然可以,但是在大N和输入下速度很慢。
在我的第二次尝试中,我首先构建了一个kd树。接下来的迭代几乎与以前一样,不同之处在于,我现在不再计算到每个输入点的距离,而是计算到最接近的输入点(或多个输入点)的距离。这有所帮助,但仍然有人告诉我,有更好的算法。
解决方法
您应该使用从所有给定点开始的广度优先搜索来同时找到每个像元与其最近点的距离。这需要线性时间,并且非常容易编码。
然后找到最远的距离(或者记住它,因为它将是您写的最后一个),并返回具有该距离的所有单元格。
如果您的观点不太稀疏,那将非常有效。如果它们之间相隔很远,那么您将需要一种算法,该算法随点数而不是网格的大小而增长。那将基于计算曼哈顿距离Voronoi图,因为您要返回的所有点都在上面。