【问题标题】:efficient algorithm to find nearest point in a graph that does not have a known equation在没有已知方程的图中找到最近点的有效算法
【发布时间】:2011-07-22 14:46:46
【问题描述】:

我出于好奇而问这个问题,因为我快速而肮脏的实现似乎已经足够好了。不过我很好奇什么是更好的实现方式。

我有一张真实世界数据的图表。没有重复的 X 值,并且 X 值在整个图表中以一致的速率递增,但 Y 数据基于真实世界的输出。我想以编程方式从任意给定点 P 找到图形上最近的点。我正在尝试找到一种有效(即快速)的算法来执行此操作。我不需要确切的最近点,我可以选择一个“接近”最近点的点。

明显的惰性解决方案是通过图中的每个点递增,计算距离,然后找到距离的最小值。然而,理论上这对于大图可能会很慢;我想要的太慢了。

由于我只需要一个近似的最近点,我想理想的最快方程将涉及生成最佳拟合线并使用该线实时计算该点的位置;但这听起来像是一个潜在的数学难题,我不打算承担。

我的解决方案是一个 hack,它之所以有效,是因为我假设我的点 P 不是任意的,即我假设 P 通常会靠近我的图形线,当这种情况发生时,我可以从考虑中划掉远处的 X 值。我计算与 P 共享 X 坐标的线上的点有多接近,并使用该点与 P 之间的距离来计算可能是更接近点的最大/最小 X 值。

我不禁觉得应该有一个比我的解决方案更快的算法(这只是有用的,因为我假设 99% 的时间我的点 P 将是一个接近线的点)。我尝试在谷歌上搜索更好的算法,但发现很多算法不太适合,以至于在所有不合适的算法的混乱中很难找到我正在寻找的东西。那么,这里有没有人有一个更有效的建议算法?请记住,我不需要完整的算法,因为我已经满足了我的需求,我只是好奇正确的解决方案是什么。

【问题讨论】:

    标签: algorithm computational-geometry


    【解决方案1】:

    如果您将 [x,y] 点存储在 quadtree 中,您将能够快速找到最近的点(类似于 O(log n))。我认为这是你能做的最好的事情,而不需要对重点的位置做出假设。与其在此重复算法,不如看看link

    您的解决方案非常好,通过检查点如何在 y 中变化,您不能计算出您需要检查的沿 x 轴的点数的界限,而不是使用任意一个。

    【讨论】:

    • 我很遗憾地被一系列点所困扰,但对于一般问题,我提出了一个更好的数据结构可能是最好的解决方案。但是,您能否详细说明您将如何使用四叉树?
    • 四叉树是许多通过递归分区空间工作的数据结构之一。搜索 a 附近(相同的原子区域)点很容易,搜索最近的点有点尴尬 - 需要深度优先/广度优先/优先顺序搜索。
    【解决方案2】:

    如果可以使用数据结构,一些用于空间搜索(包括最近邻)的常用数据结构是......

    • 四叉树(和八叉树等)。
    • kd-树
    • bsp 树(仅适用于一组静态点)。
    • r-树

    r-tree 有许多变体。它与 B+ 树密切相关,但是(取决于变体)叶节点中的项目(点)的排序不同。

    希尔伯特 R 树使用基于希尔伯特曲线的点的严格排序。希尔伯特曲线(或者更确切地说是它的推广)非常适合对多维数据进行排序,因此空间中的附近点通常在线性排序中就在附近。

    原则上,希尔伯特排序可以通过对一个简单的点数组进行排序来应用。其中的自然聚类意味着搜索通常只需要在数组中搜索几个相当短的跨度 - 复杂的是您需要确定它们是哪些跨度。

    我曾经有一个关于希尔伯特曲线排序计算的好论文的链接,但我丢失了它。基于格雷码的排序会更简单,但在聚类方面效率不高。事实上,格雷码和希尔伯特曲线之间有很深的联系——我丢失的那篇论文相当多地使用了格雷码相关的函数。

    编辑 - 我找到了那个链接 - http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.133.7490

    【讨论】:

      【解决方案3】:

      假设您的观点P=(x,y),而您的实际数据是一个函数y=f(x)

      第 1 步:计算 r=|f(x)-y|

      第二步:在区间I=(x-r,x+r)中找点

      第 3 步:在 I 中查找到 P 的最近点。

      【讨论】:

      • 问题在于计算 f(x)。在不给我的代码增加大量复杂性的情况下,我将如何做到这一点?
      • 抱歉,f(x) 是您的“真实世界数据”。这是您的数据在 x 处的 y 值。
      • 好吧对不起,误读了你的答案。这与我所做的很接近,只是我使用距离的平方作为我的 r 而不是 f(X) -y。也许我只是想不清楚,但由于距离基于 X 和 Y 的平方,所以如果没有平方或平方根,这似乎是行不通的。(我的大脑现在没有完全运作所以我不能确定我是不是傻呵呵)
      • 实际上我刚刚意识到这会得到一个准确的答案,而不是一个近似值。画一张图。为你的函数画一条曲线和一个点P。现在在P 周围画一个圆,半径为r(如我的回答中所定义)。 I 之外的点无法包含在该圈内。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多