java – 最近的一对点算法

我试图实现这个算法的更简单版本,但它比二次算法更好.我的想法主要是只用x坐标对点进行排序,并尝试从那里解决它.一旦我按x坐标对点阵列进行排序,我想迭代数组,基本上跳过距离大于我前两点的点.

例如,我的currentminDist = x;

如果我正在观察的两对点的距离> x(仅由其x coord dist),我忽略该点并在数组中移过它.

我有这个想法,但我有点坚持如何实际实现这一点(特别是条件部分).我有一个函数,它根据x坐标返回两点之间的距离.

我很困惑如何实际为我的循环写我的条件因为我想忽略一个点,如果距离恰好太远并仍然填写我的数组,其中将包含每个i的最近点的答案(我是当前点我在看).

任何提示或方向将不胜感激.我对编码算法知之甚少,所以非常令人沮丧.

这是我的代码的一部分:

for (i = 0; i < numofmypoints; i++)
        {
            for (int j = i + 1; (j < numpofmypoints) && ((inputpoints[j].x - inputpoints[i].x) < currbest); j++ )
            {
                currdist = Auxilary.distbyX(inputpoints[i],inputpoints[j]);

                if (currdist < bestdist) 
                {
                 closest[i] = j;
                 bestdist = currdist;

                }
            }
        }

distbyX是我的函数,只返回两点之间的距离.

谢谢!

最佳答案
使用KD树的快速算法
该算法创建kd树,然后为每个点找到最接近的对.创建kd树是O(n log2n),找到一个点的最近邻居是O(logn).信用必须转到Wikipedia,在一篇文章中解释了如何创建kd树以及如何使用它们来查找最近的邻居.

import java.util.*;

public class Program
{
    public static void main(String[] args)
    {
        List

修复问题中的代码
如果你真的不担心复杂性,那么你的代码唯一的问题就是你向前看但不向后看.只需复制内部循环并使j从(i – 1)变为0:

Point[] points = sort(input());
int[] closest = new int[points.length];

for (int i = 0; i < points.length; i++)
{
    double bestdist = Double.POSITIVE_INFINITY;

    for (int j = i + 1; (j < points.length) && ((points[j].x - points[i].x) < bestdist); j++ )
    {
        double currdist = dist(points[i],points[j]);

        if (currdist < bestdist)
        {
            closest[i] = j;
            bestdist = currdist;
        }
    }
    for (int j = i - 1; (j >= 0) && ((points[i].x - points[j].x) < bestdist); j-- )
    {
        double currdist = dist(points[i],points[j]);

        if (currdist < bestdist)
        {
            closest[i] = j;
            bestdist = currdist;
        }
    }
}

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...