algorithm - 优化搜索最近点的暴力解决方案

标签 algorithm computational-geometry

我有非空的 Set 散布在平面上的点,它们由坐标给出。 问题是快速回复此类查询:

Give me the point from your set which is nearest to the point A(x, y)

我目前的解决方案伪代码

query( given_point )
{
  nearest_point = any point from Set
  for each point in Set
    if dist(point, query_point) < dist(nearest_point, given_point)
      nearest_point = point
  return nearest_point
}

但是这个算法很慢,复杂度是O(N)

问题是,是否有任何数据结构或带有预先计算的棘手算法可以显着降低时间复杂度?我至少需要 O(log N)

更新

距离是指欧氏距离

最佳答案

使用 kd-tree 可以获得 O(log N) 时间.这就像一棵二叉搜索树,只是它首先在 x 维度上拆分点,然后在 y 维度上拆分点,然后再在 x 维度上拆分点,依此类推。

如果您的点是均匀分布的,您可以通过将点分箱到大小均匀的框中然后搜索查询点所在的框及其八个框来实现 O(1) 查找相邻的盒子。

很难从 Voronoi 图得出有效的解决方案,因为这需要您解决确定查询点落入哪个 Voronoi 单元的问题。大部分时间这涉及构建 R* 树来查询Voronoi 单元的边界框(O(log N) 时间),然后执行多边形中的点检查(O(p)多边形的周长)。

关于algorithm - 优化搜索最近点的暴力解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49443866/

相关文章:

c++ - 二维中一组点中以 X 轴为底的最大空矩形

java - 查找相邻的多边形 Java

algorithm - 与四面体相交的线段

algorithm - 在使用线性探测构建散列表以解决冲突时,额外项是始终添加到散列中还是仅在发生冲突时添加?

c# - 为什么在.Net中HashHelpers.IsPrime是这样实现的呢?

python - 如何使用生成器在 Python 中生成不带 "reverse duplicates"的列表排列

c - 寻找元组匹配算法

algorithm - 如何计算分布式系统中大量数据的分布(直方图)?

algorithm - 获取二维点集的周长

r - 遗传规划适应度函数