Megértése pszeudokódját a Donald B. Johnson algoritmusa

szavazat
5

Tudja valaki, hogy a Donald B. Johnson algoritmusa , amely felsorolja az összes elemi áramkörök (ciklus) egy irányított gráf?

Van a papír már közzétették az 1975, de nem tudom megérteni a pszeudokódokra.

Célom az, hogy végre ezt az algoritmust a Java.

Néhány kérdés van, például az, ami az A mátrix k utal. A pszeudokódokra, megemlíti, hogy

Ak:=adjacency structure of strong component K with least 
    vertex in subgraph of G induced by {s,s+1,....n};

Ez azt jelenti, végre kell hajtania egy másik algoritmust, amely megkeresi az A k mátrix?

Másik kérdés, hogy mi a következő eszközökkel?

begin logical f; 

Nincs is a vonal logical procedure CIRCUIT (integer value v);azt jelenti, hogy az áramkör eljárás visszatér egy logikai változó? A pszeudokódját is a vonal CIRCUIT := f;„” Mit is jelent ez?

Jó lenne, ha valaki tudna lefordítani ezt a 1970-es pszeudokódokra egy modernebb típusú pszeudokódokra így meg tudom érteni

Ha érdekel, hogy segítsen, de nem találja a papírt, kérjük írjon nekem pitelk@hotmail.com és én küldök neked a papírt.

A kérdést 25/05/2010 22:14
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
7

A pszeudo-kód emlékeztető Algol, Pascal vagy Ada.

Ez azt jelenti, végre kell hajtania egy másik algoritmust, amely megkeresi az A k mátrix?

A k úgy tűnik, hogy egy listát a tömbök bemeneti értékek, amelyek a megadott tulajdonságokkal. Ez összefüggésben lehet a megfelelő szomszédsági mátrix , de ez nem világos számomra. Gondolom, valahogy így:

int[][] a = new int[k][n];
int[][] b = new int[k][n];
boolean[] blocked = new boolean[n];
int s;

Mit logical fjelent?

Ez kimondja, egy helyi változót képviselő truevagy falseérték, hasonló Java boolean.

logical procedure CIRCUIT (integer value v);

Ez kijelenti Egy alprogram neve CIRCUIT, amelynek egyetlen egész paraméter vátadott érték alapján. Az alprogram vissza logicaleredménye truevagy false, és CIRCUIT := fhozzárendeli faz eredménye. A Java,

boolean circuit(int v) {
    boolean f;
    ...
    f = false;
    ...
    return f;
}

A kulcsszavak beginés endkörülhatárolja a blokk körét, hogy lehet tolni, így CIRCUITvan ágyazva a fő blokk és UNBLOCKfészkei belsejében CIRCUIT. :=jelentése hozzárendelés; ¬van not; jelentése elem; üres; van !=; stackés unstackazt sugallják, pushés pop.

Ez csak a kezdet, de remélem ez segít.

Kiegészítés: A gondolkodás, Aés Blegyen izomorfak.

Itt van egy nagyon is szó körvonala. Nem tudom eléggé A, Bés Vhogy válasszon egy jobb adatstruktúra mint tömbök.

import java.util.Stack;

public final class CircuitFinding {
    static int k, n;
    int[][] a = new int[k][n];
    int[][] b = new int[k][n];
    boolean[] blocked = new boolean[n];
    int[] v = new int[k];
    int s = 1;
    Stack<Integer> stack = new Stack<Integer>();

    private void unblock(int u) {
        blocked[u] = false;
        for (int w : b[u]) {
            //delete w from B(u)
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a[v]) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a[v]) {
                //if (v∉B(w)) put v on B(w);
            }
        }
        v = stack.pop();
        return f;
    }

    public void main() {
        while (s < n) {
            //A:= adjacency structure of strong component K with least
            //vertex in subgraph of G induced by {s, s+ 1, n};
            if (a[k] != null) {
                //s := least vertex in V;
                for (int i : v) {
                    blocked[i] = false;
                    b[i] = null;
                }
                L3:
                circuit(s);
                s++;
            } else {
                s = n;
            }
        }
    }
}
Válaszolt 26/05/2010 06:09
a forrás felhasználó

szavazat
1

Megtalálható egy Java megvalósítása ennek az algoritmusnak a GitHubról: https://github.com/1123/johnson . Ez használ a Jung2 java grafikon könyvtárban.

Válaszolt 13/02/2013 21:47
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more