[英]Comparator class implementation for priority queue used in Dijkstra's Algorithm?
我正在嘗試從CLRS-算法入門一書中實現Dijsktra的算法,但是,在使用Comparator
接口實現優先級隊列時遇到了麻煩。 如您所見,這是我的Vertex類;
public class Vertex {
public boolean explored;
public int vertexID;
public LinkedList<Vertex> adjacencyList;
public LinkedList<Edge> edgeSet;
public int shortestDistance;
public Vertex predecessor;
public Vertex(int vertexID){
this.vertexID = vertexID;
this.explored = false;
this.adjacencyList = new LinkedList<>();
this.edgeSet = new LinkedList<>();
this.shortestDistance = Integer.MAX_VALUE;
this.predecessor = null;
}
}
所以最初shortestDistance
屬性被聲明為Integer.MAX_VALUE
。 此外,您可以看到從Comparator實現的類,該類用於優先級隊列。
public class WeightComparator implements Comparator<Vertex> {
@Override
public int compare(Vertex o1, Vertex o2) {
return Math.min(o1.shortestDistance, o2.shortestDistance);
}
}
我確信由於我的一些測試,整個實現不會有任何邏輯錯誤,但是,在某些測試中,它會失敗。 我用此語句創建對隊列的引用
PriorityQueue<Vertex> queue = new PriorityQueue<>(N, weightComparator);
其中N是隊列的大小。 因此,如果我對它的工作方式有誤,請糾正我。 當您從中poll
項目時,它將刪除優先級最低的項目。 希望能清楚地理解我的問題,如果有人可以提供幫助,我將非常感謝。 所以還是謝謝
Math.min
為您提供兩個值中的較小者。 將其作為比較值返回是錯誤的。
compare
返回值<0表示第一個值小於第二個值,但是如果返回Math.Min(5, 3)
,則將獲得3,即> 0,這意味着比較器將告訴它3 > 5.錯了。
您正在尋找的是:
public int compare(Vertex o1, Vertex o2) {
return Integer.compare(o1.shortestDistance, o2.shortestDistance);
}
除非shortestDistance
可以為負,否則您的比較器永遠不會返回負數。 因此,這不是正確的實現。
從概念上講,基元的比較器應返回減法:
return o1.shortestDistance-o2.shortestDistance;
或者如果想下降則反之。 但是您需要提防溢出問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.