给定一组点,找到距离查询点的曼哈顿距离最小的点

时间:2014-12-21 08:38:15

标签: c++ algorithm data-structures stl tree

我正在尝试解决一个竞争性的编程问题,要求我找到与另一个最接近的点。使用的指标是曼哈顿距离。

到目前为止我尝试了什么

效率低且复杂的解决方案

这是我迄今为止所管理的内容。曼哈顿两点之间的距离是:

|x1 - x2| + |y1 - y2|

给定距离 r ,距离点最远 r 距离的点满足不等式

|x1 - x2| + |y1 - y2| <= r

这在平面中形成菱形(旋转45度的正方形)

所以我做的是,我将点数旋转了45度,所以这个数字变成了一个正方形。我现在可以检查两个点是否最多 r 单位,如果它们的x和y坐标最多 r 单位。

max(|x1 - x2|, |y1 - y2|) <= r

为了有效地检查数据库中的任何点是否位于远离给定点的 r 单位,我使用了一个分段树来查找位于 x之间的所有点的y值 - r x + r 并检查是否至少有一个y值在 y - r y + r

由于我的任务是找到曼哈顿最低距离,我对 r 的可能值应用了二进制搜索。

我的解决方案解决了O(log 3 n)时间内的每个查询。一个log n来自二进制搜索,一个用于检查段树,另一个用于验证y值是否落在范围内。 这对于问题限制来说太过分了。我最多需要O(log 2 n)查询处理时间。

有人会推荐一种性能更好的数据结构吗?

1 个答案:

答案 0 :(得分:1)

听起来像是k-d-tree的工作

http://en.wikipedia.org/wiki/K-d_tree