Topological sort

Topological sort 就是有相依性的一種排序,當"誰要在誰前面" 就是拓樸排序要上場

概念就是先計算出所有點的 in-degree (或是積分)後,再從最少或最大 in-degree 一個一個挑出來

然後把這個點可以到的地方的點的 in-degree扣掉,這樣就可以在往下一步前進,

過程用 queue 把下一回合要輸出的點記下來

這種 list 裝的圖的複雜度是 O(V + E)

如果是用矩陣裝的圖,那就會是 O(V^2) (因為要遍歷每個矩陣點看是不是0)

public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
    // write your code here
    ArrayList<DirectedGraphNode> results = new ArrayList<>();
    if (graph.size() == 0) {
        return results;
    }

    //calculate in and out degrees
    HashMap<DirectedGraphNode, Integer> inDegrees = new HashMap<>();

    for (int i = 0; i < graph.size(); i++) {
        DirectedGraphNode node = graph.get(i);
        if (!inDegrees.containsKey(node)) {
            inDegrees.put(node, 0);
        }
        for (int j = 0; j < node.neighbors.size(); j++) {
            DirectedGraphNode neighbor = node.neighbors.get(j);
            if (inDegrees.containsKey(neighbor)) {
                inDegrees.put(neighbor, inDegrees.get(neighbor)+1);
            } else {
                inDegrees.put(neighbor, 1);
            }
        }
    }

    Queue<DirectedGraphNode> Q = new LinkedList<>();
    for (Map.Entry<DirectedGraphNode, Integer> entry : inDegrees.entrySet()) {
        if (entry.getValue() == 0) {
            Q.offer(entry.getKey());
            // break;   <- all node with zero in-degree should be put in queue initially
        }
    }

    while (!Q.isEmpty()) {
        DirectedGraphNode node = Q.poll();
        results.add(node);
        for (int i = 0; i < node.neighbors.size(); i++) {
            DirectedGraphNode neighbor = node.neighbors.get(i);
            inDegrees.put(neighbor, inDegrees.get(neighbor)-1);
            if (inDegrees.get(neighbor) == 0) {
                Q.offer(neighbor);
            }
        }
    }

    return results;
}

results matching ""

    No results matching ""