[LinkedIn] Find K nearest (closest) neighbors from point (comparator/comparable, priority queue )


/**
This is for finding k nearest neighbor from the original point
using a MAX heap, each time if the dist is less than the MAX we put it into the q.
**/
public Collection<Point> getClosestPoints(Collection<Point> points, int k) {
    PriorityQueue<Point> queue = new PriorityQueue<Point>(k);

    for (Point point : points) {
        if (queue.size() < k) {
            queue.offer(point);
        } else {
            if (queue.peek().compareTo(point) < 0) {
                queue.poll();
                queue.offer(point);
            }
        }
    }

    return queue;
}


class Point implements Comparable<Point> {
    int x, y;
    double dist;

    public Point(int x, int y, Point originPoint) {
        this.x = x;
        this.y = y;
        //Math.hypot() returns sqrt(x^2 + y^2)
        this.dist = Math.hypot(x - originPoint.x, y - originPoint.y);
    }

    //assuming the original point is (0,0)
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
        this.dist = Math.hypot(x , y );
    }

    @Override
    public int compareTo(Point that) {
        return Double.valueOf(that.dist).compareTo(dist);
    }

    @Override
    public String toString() {
        return "x: " + x + " y: " + y;
    }
}

转载于:https://www.cnblogs.com/jxlgetter/p/4395090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值