【问题标题】:the best algorithm to compare set of coordinates in database比较数据库中坐标集的最佳算法
【发布时间】:2014-02-12 02:23:51
【问题描述】:

我正在尝试查询指定位置的最近位置 我考虑过获取每个点与我所拥有的点之间的距离,但我认为这需要很多时间,可能是 O(n^2),有没有更好的方法

【问题讨论】:

  • 许多数据库都具有空间/GIS(地理信息系统)扩展,以使这些搜索更容易。它们使用一种称为 R-D 树的索引,可大大提高此类查询的性能。

标签: sql algorithm gis spatial


【解决方案1】:

四键减少维度,它类似于分形。四键也用于平铺,例如在 Bing 地图中。你可以试试我的 php 解决方案 hilbert-curve@phpclasses.org。它给出了希尔伯特曲线,也给出了四键。但这不是一个精确的搜索。如果您想优化搜索,您需要使用 harvesine 公式。您可以使用边界框来加快搜索速度。

【讨论】:

    【解决方案2】:

    考虑使用K-D treequad-treeoct-tree。它们实际上实施起来并不难,网上也有很好的例子。

    这叫Nearest-Neighbor search,维基百科上有很多关于它的信息。

    使用这些方法通常比 O(n2) 做得更好。

    K-D 树的基本轮廓是这样的:

    1. 对 X 上的坐标进行排序,然后选择中间的值。这 成为树的根节点。其他值左拆分和 对。

    2. 在左右子树上,对y坐标进行排序,然后 选择中间的值,这将成为 子树。

    3. 在进一步的子树上重复,确保在 X、Y、Y 上分裂 X,然后是 Y。

    4. 查询你的树时,你可以像二叉搜索树一样简单地往下走 基于数据的拆分方式。最近的邻居将是您登陆的最后一个节点 或其父母(我想,已经有一段时间了)。

    编辑:如果您正在寻找 K-最近邻,当您搜索您的 K-D 树时,您会在一个矩形指定的范围内进行搜索。您可以以相同的方式搜索子树,但您必须确保整个矩形位于节点的左侧、右侧、上方或下方(取决于您的拆分方式)。如果一个节点包含在矩形中,则在其子树上递归。使用这种方法,您原则上仍然可以比 O(n2) 做得更好。

    【讨论】:

    • 坐标是球体?你如何解决这个问题?
    • @Phpdna: 1) 不是每个人都在一个球体上操作。 2)我谈到的所有方法仍然适用。根据 OP 已经尝试过的方法,我建议的方法实际上可能更适用,更容易实现。
    • 你能详细说明一下吗? lat lng 是角度。你如何保存在 k-d 树中?
    • @Phpdna:您可以像 (x, y) 一样拆分纬度和经度。如果你真的想要,你可以将坐标转换为具有 (x, y, z) 坐标的球体上的点(假设是一个统一的球体),然后你可以应用 k-d 树。请参阅有关它的维基百科文章:en.wikipedia.org/wiki/…
    • :Imo 的问题是关于距离而不是树木。但是如何查询八叉树呢?
    猜你喜欢
    • 2014-04-18
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多