我正在尝试解决一个竞争性的编程问题,要求我找到与另一个最接近的点。使用的指标是曼哈顿距离。
到目前为止我尝试了什么
效率低且复杂的解决方案
这是我迄今为止所管理的内容。曼哈顿两点之间的距离是:
|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)查询处理时间。
有人会推荐一种性能更好的数据结构吗?