【发布时间】:2014-02-12 02:23:51
【问题描述】:
我正在尝试查询指定位置的最近位置 我考虑过获取每个点与我所拥有的点之间的距离,但我认为这需要很多时间,可能是 O(n^2),有没有更好的方法
【问题讨论】:
-
许多数据库都具有空间/GIS(地理信息系统)扩展,以使这些搜索更容易。它们使用一种称为 R-D 树的索引,可大大提高此类查询的性能。
我正在尝试查询指定位置的最近位置 我考虑过获取每个点与我所拥有的点之间的距离,但我认为这需要很多时间,可能是 O(n^2),有没有更好的方法
【问题讨论】:
四键减少维度,它类似于分形。四键也用于平铺,例如在 Bing 地图中。你可以试试我的 php 解决方案 hilbert-curve@phpclasses.org。它给出了希尔伯特曲线,也给出了四键。但这不是一个精确的搜索。如果您想优化搜索,您需要使用 harvesine 公式。您可以使用边界框来加快搜索速度。
【讨论】:
考虑使用K-D tree 或quad-tree 或oct-tree。它们实际上实施起来并不难,网上也有很好的例子。
这叫Nearest-Neighbor search,维基百科上有很多关于它的信息。
使用这些方法通常比 O(n2) 做得更好。
K-D 树的基本轮廓是这样的:
对 X 上的坐标进行排序,然后选择中间的值。这 成为树的根节点。其他值左拆分和 对。
在左右子树上,对y坐标进行排序,然后 选择中间的值,这将成为 子树。
在进一步的子树上重复,确保在 X、Y、Y 上分裂 X,然后是 Y。
查询你的树时,你可以像二叉搜索树一样简单地往下走 基于数据的拆分方式。最近的邻居将是您登陆的最后一个节点 或其父母(我想,已经有一段时间了)。
编辑:如果您正在寻找 K-最近邻,当您搜索您的 K-D 树时,您会在一个矩形指定的范围内进行搜索。您可以以相同的方式搜索子树,但您必须确保整个矩形位于节点的左侧、右侧、上方或下方(取决于您的拆分方式)。如果一个节点包含在矩形中,则在其子树上递归。使用这种方法,您原则上仍然可以比 O(n2) 做得更好。
【讨论】: