【问题标题】:Given a set of points, find the one that has the smallest Manhattan distance from a query point给定一组点,找到与查询点的曼哈顿距离最小的点
【发布时间】:2015-02-19 16:15:35
【问题描述】:

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

到目前为止我已经尝试过什么

低效复杂的解决方案

这是我到目前为止所管理的。两点之间的曼哈顿距离为:

|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 值- rx + r 并检查是否至少有一个 y 值在 y - ry + r范围内>

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

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

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

【问题讨论】:

  • 查看 R-trees (en.wikipedia.org/wiki/R-tree)。他们将空间划分为框,然后可以搜索这些框以找到离查询点最近的第 N 个点(在您的情况下,N 为 1)。
  • 输入的样子如何?您是否必须在计时期间构建您的结构?
  • @Jarod42 10^5 分。 50k 个查询。在竞争激烈的编程环境中限制 5 秒。他们没有指定测试用例的数量。
  • @DXsmiley 我没有将 R-Trees 用于我的解决方案,但它们可能会起作用。你有什么好的资源吗?

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


【解决方案1】:

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

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

【讨论】:

  • 这就像一个魅力!可能不是最好的解决方案,但它肯定足以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2014-08-13
  • 2013-06-10
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多