Java中使用扫描线算法的最近点对

Java中使用扫描线算法的最近点对,java,algorithm,closest-points,Java,Algorithm,Closest Points,首先;我在学校做作业,这就是为什么我要使用扫描线算法。我是根据我老师给出的伪代码来做的 我已经用TreeMap而不是平衡二叉搜索树实现了我自己的一个实现,我被告知它将提供相同的功能。(不知道这是不是真的?) 然而,我没有得到正确的最终结果,我真的不知道为什么。我一直目不转睛地盯着自己 下面是我执行实际计算的代码部分。我省略了点列表的创建,以及其他不重要的东西 count = 0; TreeMap<Double, Point> tree

首先;我在学校做作业,这就是为什么我要使用扫描线算法。我是根据我老师给出的伪代码来做的

我已经用TreeMap而不是平衡二叉搜索树实现了我自己的一个实现,我被告知它将提供相同的功能。(不知道这是不是真的?)

然而,我没有得到正确的最终结果,我真的不知道为什么。我一直目不转睛地盯着自己

下面是我执行实际计算的代码部分。我省略了点列表的创建,以及其他不重要的东西

            count = 0;

            TreeMap<Double, Point> tree = new TreeMap<Double, Point>();

            double dist = Double.POSITIVE_INFINITY;

            // Sorts points on x-axis
            Collections.sort(points); 

            // Gets left-most point
            Point q = points.get(count++);

            for (Point p : points) {

                while (q.getX() < p.getX() - dist) {
                    tree.remove(q.getY());
                    q = points.get(count++);
                }

                NavigableSet<Double> keys = tree.navigableKeySet();

                // Look at the 4 points above 'p'
                int i = 1;
                Iterator<Double> iterHi = keys.tailSet(p.getY()).iterator();

                while (i <= 4 && iterHi.hasNext()) {
                    double tmp = p.distanceTo(tree.get(iterHi.next()));
                    if (tmp < dist) {
                        dist = tmp;
                        pClosest = p;
                        qClosest = q;
                    }
                    i++;
                }

                // Look at the 4 points below 'p'
                i = 1;
                Iterator<Double> iterLo = keys.headSet(p.getY()).iterator();

                while (i <= 4 && iterLo.hasNext()) {
                    double tmp = q.distanceTo(tree.get(iterLo.next()));
                    if (tmp < dist) {
                        dist = tmp;
                        pClosest = p;
                        qClosest = q;
                    }
                    i++;
                }

                tree.put(p.getY(), p);
            }

            double finalDist = pClosest.distanceTo(qClosest);
count=0;
TreeMap tree=newtreemap();
双距离=双正无穷大;
//对x轴上的点进行排序
集合。排序(点);
//得到最左边的点
Point q=points.get(count++);
对于(点p:点){
while(q.getX()虽然(我我已经在您的代码中发现了几个bug(我不确定是否还有其他bug):

  • 如果多个点具有相同的y坐标,该怎么办?
    TreeMap
    对于每个y值只能容纳一个点。这就是您想要的吗

  • 当您查看当前点下方和上方的点时,您计算到
    iterHi.next()
    double tmp=p.distanceTo(tree.get(iterHi.next());
    ,然后将
    qClosest
    指定给
    q
    。这是不正确的(显然,
    iterHi.next()
    q
    不是同一点)

  • 在第二个内部循环中,计算从
    q
    到集合元素的距离:
    double tmp=q.distanceTo(tree.get(iterLo.next());
    。它应该是
    p


  • 我还建议维护
    点的
    树集,而不是使用
    树映射(当然,它们应该通过y坐标进行比较)。

    你期望的最终结果是什么?你得到了什么?最左边的点肯定在索引0,而不是1?点q=点。get(count++);你能提供你老师给出的伪代码吗?你期望的输出是什么?它与实际的输出有什么不同?康曼:好的。我已经把代码改为在“get”之后递增Tim Hallyburton和Florent Bayle:我编辑了原始帖子来回答你的问题。1.在我目前使用的点集中,所有的y值都是独占的,所以这至少暂时不应该是个问题。2.我对此有点不确定,因为伪代码说将其分配给“q”,而“q”在顶部。3。这是用伪代码写的。但是你说的很有意义,我会尝试修改。好的,应用2和3中的修改给了我正确的结果。非常感谢,ILoveCoding!