簡體   English   中英

Dijkstra算法中使用的優先級隊列的比較器類實現?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM