【问题标题】:Finding closest rects out of many rects从许多矩形中找到最接近的矩形
【发布时间】:2014-06-21 08:47:06
【问题描述】:

我在这里让自己陷入了一个难题,一个数组中有 50 个矩形,另一个数组中有 50 个矩形。我需要找到最接近的两个矩形。

所以我使用这个代码:

for(int i=0;i<49;i++)
{
 for(int j=0;j<49;j++)
 {
  double distance = Math.sqrt(Math.pow(rectF1.get(i).centerX() - rectF2.get(j).centerX(), 2) 
                               + Math.pow(rectF1.get(i).centerY() - rectF2.get(j).centerY(), 2));
 }
}

它有效,但我必须检查 2500 次!如果矩形移动(它们移动),那么我可能不会在正确的时刻捕捉到最接近的矩形! X.X

【问题讨论】:

    标签: java javascript android arrays


    【解决方案1】:

    您的搜索似乎基于矩形的中心。因此,您的问题成为最近邻问题。为了解决这个问题,我会使用 KD-Tree:

    http://en.wikipedia.org/wiki/K-d_tree

    有关 java 库,请查看 KDTree Implementation in Java

    【讨论】:

    • 是的!谢谢!有没有什么地方我可以学习所有这些 Java 数据结构类型?我喜欢学习:)
    • 这里的关键字是“数据结构和算法”。这是一个相当普遍的主题,独立于编程语言。我在大学里做过一个关于它的讲座。但是做一些谷歌搜索,你会发现很多材料。
    • 我想知道是否有更快的算法来做到这一点。使用这种方法,我们需要使用 kdtree 索引第二个矩形集,它采用O(m log m),其中m 是第二个矩形集的大小。然后,对于第一组中的每个矩形,在第二组中找到最近的邻居,总体而言,它采用O(n log m),其中n 是第一组的大小。总共需要O((n+m) log m)
    • 如果点分布均匀,可以将它们填充到网格中(取 O(m)),然后在 O(n) 中进行最近邻搜索,总计 O*n+m) .但是如果点聚集在一个小区域,而一些点分散在一个大区域,这种方法就失效了。
    猜你喜欢
    • 2022-01-18
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多