Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PriorityQueue经常需要调整比较器-如何最好地处理此问题?_Java_Priority Queue_Comparator_Dijkstra - Fatal编程技术网

Java PriorityQueue经常需要调整比较器-如何最好地处理此问题?

Java PriorityQueue经常需要调整比较器-如何最好地处理此问题?,java,priority-queue,comparator,dijkstra,Java,Priority Queue,Comparator,Dijkstra,我正在为大学研究Dijkstra算法,使用优先级队列存储图中剩余的顶点,按最短遍历距离排序。 我使用的比较器: class DistanceComparator implements Comparator<Integer> { int[] dist; public DistanceComparator(int[] d) { dist = d; } @Override public int compare(Integer i,

我正在为大学研究Dijkstra算法,使用优先级队列存储图中剩余的顶点,按最短遍历距离排序。 我使用的比较器:

class DistanceComparator implements Comparator<Integer> {
    int[] dist; 
    public DistanceComparator(int[] d) {
        dist = d;
    }

    @Override
    public int compare(Integer i, Integer j)
    {
        if((dist[i]-dist[j]) < 0) { 
            return -1;
        }
        if((dist[i]-dist[j]) > 0) { 
            return  1;
        }
        return 0;
    }
}
类距离比较器实现比较器{
国际[]区;
公共距离比较器(int[]d){
dist=d;
}
@凌驾
公共整数比较(整数i,整数j)
{
如果((dist[i]-dist[j])<0{
返回-1;
}
如果((dist[i]-dist[j])>0{
返回1;
}
返回0;
}
}
现在我面临的问题是距离在变化,因此我的队列的比较器需要经常更新

static PriorityQueue<Integer> refreshQueue(int[] d) {
    Comparator<Integer> comp = new DistanceComparator(d);
    PriorityQueue<Integer> q = new PriorityQueue<Integer>(adj.length, comp);
    for(int i = 0; i < adj.length; i++) {
        q.add(i);
    }
    return q;
}
静态优先级队列刷新队列(int[]d){
比较器comp=新的距离比较器(d);
PriorityQueue q=新的PriorityQueue(调整长度,组合);
for(int i=0;i
这就做到了,但是它也会使所需的运行时紧张
O(num Edges*log(num顶点))


如何消除每次调整比较器的需要?

在Java中实现Dijkstra算法的传统方法是创建一个包含节点和距离的单独类:

class Dist implements Comparable<Dist> {
  final int vertex;
  final int distance;

  public int compareTo(Dist other) {
    return Integer.compare(distance, other.distance);
  }
}
class Dist实现了可比较的{
最终整数顶点;
最终整数距离;
公共内部比较(其他地区){
返回整数。比较(距离,其他。距离);
}
}
并将其放入您的优先级队列中

您最终将看到过时的
Dist
对象反映了次优路径,但只有在您已经看到“最佳”路径之后,才可以看到,因此只需忽略已从优先级队列中取出的顶点

基本上,不要更改比较器:更改被比较的对象