【问题标题】:Algorithm to find the nearest coordinate to a given point in a 2-D graph在二维图中找到离给定点最近的坐标的算法
【发布时间】:2014-06-08 07:02:14
【问题描述】:

问题: 有一组固定的蓝色坐标。我想找到最接近给定red 坐标的blue 坐标 Here is the graph

这是我的方法:

获取到所有蓝点的笛卡尔距离并找到它的最小值。

float min=Float.MAX_VALUE;
float temp=0;
for(int i=0;i<cordinateList.size;i++){
    temp=cordinateList.get(i).x*cordinateList.get(i).x+cordinateList.get(i).y*cordinateList.get(i).y;
    if(temp<min){
        min=temp;
    }
}

我需要什么:

我的方法不可行,因为 cordinateList 非常大,因此查找到所有人的距离非常低效,并且我的程序无法在给定时间内完成任务。

那么有没有比我的更有效的算法和任何建议?

更新: 红点一次出现大约一百万次。蓝点列表是固定的。因此,我认为我可以负担对蓝点列表的任何初始更改,例如在需要时进行排序。

谢谢。

【问题讨论】:

  • 你可以在所有点上准备Voronoi图,然后检查检查点落在哪个区域
  • 如果坐标仅在列表中可用,并且任何坐标都可以出现在列表中的任何点,则没有实质性的改进,因为您总是需要查看列表中的每个点,是否计算距离,对列表进行排序等。但是,如果坐标点有某种模式,您也许可以利用它。有吗?
  • 坐标列表是否以任何方式排序?比如按x轴值排序?
  • @jaket - 我不认为它有帮助......
  • @StephenC - 我正在考虑使用分治法cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html 的最接近配对算法的变体。算法的第一个要求是按x轴对点进行排序。

标签: java algorithm data-structures graph shortest-path


【解决方案1】:

如果您只是(只有)一个点列表,并且您需要这样做一次,那么就没有更有效的方法了。

但是,如果您必须针对许多不同的点多次执行此过程,那么有一些方法可以提高效率。例如:

但请注意,这些方法涉及设置开销,需要在收支平衡之前通过多次查找(即查找最近点计算)分摊。

【讨论】:

  • 谢谢。我听说在 Google 地图 API 中我可以映射到最近的标记。所以我认为如果有这么高效的算法我可以用它来做我的
  • 我认为kd-trees 可能最适合解决这个特定问题。
  • @MikePedersen 谢谢。会参考
  • @MikePedersen 谢谢。看起来很有趣。你用过它吗? :)
  • 用蓝色点创建一个 kd-tree,然后使用 kd-tree 为每个红色点找到最近的邻居。不过,我认为蓝点的数量远小于红点的数量,在这种情况下,这与你能得到的一样好。如果情况正好相反,那么四叉树和 kd 树的组合可能会更好。
【解决方案2】:

解决方案是一个层次树,即树状图或层次聚类。您可以使用 clusterfck JS 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2018-08-28
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多