当前位置: 首页 > 知识库问答 >
问题:

Java优先级队列行为怪异

赵高韵
2023-03-14

我正在实现一个应用程序,该应用程序根据曼哈顿距离查找(x,y)平面中给定位置的最近n个事件。我使用最大优先级队列来存储找到的事件,并使用曼哈顿距离比较器。这个队列应该总是有最大人距离事件作为它的窥视,但是我发现这不会一直发生。我在循环中使用pq.poll()打印了这个队列的结果,我发现队列在删除后没有重新排列,只是有时。

我的比较者:

public class LocationComparator implements Comparator<Event> {
private double xCord,yCord;

public LocationComparator(double x,double y){
    xCord=x;
    yCord=y;
}
@Override
public int compare(Event x,Event y){
    double xManDist=Math.abs(x.getxCord()-xCord)+Math.abs(x.getyCord()-yCord);
    double yManDist=Math.abs(y.getxCord()-xCord)+Math.abs(y.getyCord()-yCord);
    return (int)(yManDist-xManDist);
}
}

以主方法打印:

System.out.println(MessageFormat.format("Closest Events to location {0},{1}",x,y));
        while (!(events.isEmpty())){
            Event temp=events.poll();
            System.out.println(temp);
            System.out.println(temp.calcManDistance(x, y));

输出:

Closest Events to location 0,0
name: Event 5
x: 3.43
y: -4.97
8.398549367213874
name: Event 10
x: -8.98
y: -0.49
9.469052759377341
name: Event 3
x: -0.77
y: 7.92
8.693576027826397
name: Event 2
x: -0.57
y: -6.56
7.127381509823561
name: Event 6
x: -0.56
y: -3.38
3.935261527783056

如您所见,事件不是按降序排列的!然而,有时是这样。我无法追踪这种不一致行为的原因。我遗漏了什么吗?

如果这是相关的,我将在这个方法中生成队列。我从最小优先级队列中获取事件,其中peek事件应该是x轴上距离位置最近的事件。然后,我将其添加到保存最近事件的maxPriorityQueue中,如果其大小小于5,或其peek manDistance高于与之相比的事件。如果我从MaxPriority队列中找到一个比peek事件的ManDistanance高x的事件,则我找到了最近的5个事件。

pqTemp - 在最小优先级队列中保存所有事件,其中扫视最接近 x 轴上的位置

manDistanceFarthest——保存当前最近的事件,其中peek是最大曼哈顿距离的事件。

public void findClosestEvents(){
    int steps=1;
    PriorityQueue<Event> pqTemp=new PriorityQueue<>(xClosest);
    manDistFarthest.add(pqTemp.poll());
    while (!(pqTemp.isEmpty())){
        steps+=1;
        if (manDistFarthest.size()<5)
            manDistFarthest.add(pqTemp.poll());

        else if (Math.abs(pqTemp.peek().getxCord())>manDistFarthest.peek().calcManDistance(xLoc, yLoc))
            break;
        else
            if (pqTemp.peek().calcManDistance(xLoc, yLoc)<=manDistFarthest.peek().calcManDistance(xLoc, yLoc)){
                manDistFarthest.poll(); 
            manDistFarthest.add(pqTemp.poll());
        }
            else pqTemp.poll();
    }
    System.out.println(MessageFormat.format("Checked {0} events out of {1}.",steps,xClosest.size()));

}

共有1个答案

柯乐池
2023-03-14

我在这里看到的唯一问题是你对int的转换。举个例子,如果这个增量小于1,你会得到0-这意味着等于-这不是真的。我不了解整个情况。如何在pqTemp中使用比较器?你可能有类似的活动吗?

 类似资料:
  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现。 这就是我如何实现比较器以将优先级队列转换为队列: /由于优先级队列的“自然排序”在队列的头部具有最小的元素,并且当第一个元素小于第二个元素时,传统比较器返回-1,

  • 问题内容: 我编写了一个迷宫求解程序,该程序应该支持DFS,BFS,A *,Dijkstra和贪婪算法。无论如何,我选择了PriorityQueue作为我的边界数据结构,因为我认为优先级的行为就像队列,堆栈或优先级队列一样,取决于比较器的实现。 这是我实现比较器以将优先级队列转换为队列的方式: / 由于优先级队列的“自然排序”元素最少,并且常规比较器在第一个小于第二个时返回-1,因此被黑的比较器始

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 一般来说,如果我理解正确的话,在给定列表和添加每个元素之间的“heapizing;o(n)”运行时是有区别的;o(lg n)。java遵循这种行为吗?如果不是,下面的问题可能无效。 下面的示例似乎创建了一个"min-heap"。 然而,假设我想构建一个“最大堆”,但是构造函数不允许我同时传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比的包装器类吗? 注意:我知道可以用比较器创