den Pseudo-Code in der Donald B. Johnsons Algorithmus zu verstehen,

stimmen
5

Kennt jemand den Donald B. Johnson-Algorithmus , der alle Elementarschaltungen (Zyklen) in einem aufzählt gerichteten Graphen?

Ich habe das Papier, das er im Jahr 1975 veröffentlicht hatte, aber ich kann den Pseudo-Code nicht verstehen.

Mein Ziel ist es, diesen Algorithmus in Java zu implementieren.

Einige Fragen , die ich habe, zum Beispiel, ist das, was ist die Matrix A k bezieht er sich auf. In dem Pseudo - Code, es wird erwähnt , dass

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

Bedeutet das, dass ich einen anderen Algorithmus zu implementieren, die die A findet k Matrix?

Eine andere Frage ist, was die folgenden Mittel?

begin logical f; 

Ist auch die Linie logical procedure CIRCUIT (integer value v);bedeutet , dass die Schaltung vor , um eine logische Variable gibt? In dem Pseudo - Code hat auch die Zeile „ CIRCUIT := f;“. Was bedeutet das?

Es wäre toll, wenn jemand dies 1970 Pseudo-Code zu einer moderneren Art von Pseudo-Code übersetzen könnte, damit ich es verstehen kann,

Falls Sie helfen interessiert, aber Sie das Papier bitte an pitelk@hotmail.com mailen Sie mich nicht finden können, und ich werde Ihnen das Papier schicken.

Veröffentlicht am 25/05/2010 um 22:14
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
7

Der Pseudo-Code erinnert an Algol, Pascal oder Ada.

Bedeutet das, dass ich einen anderen Algorithmus zu implementieren, die die A findet k Matrix?

A k erscheint eine Liste von Anordnungen von Eingangswerten die angegebenen Eigenschaften zu sein. Es kann auf die entsprechenden Beziehung gesetzt werden Adjazenzmatrix , aber es ist mir nicht klar. Ich vermute , so etwas wie diese:

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

Was bedeutet logical fdas?

Dies erklärt eine lokale Variable a darstellt trueoder falseWert, ähnlich wie Java boolean.

logical procedure CIRCUIT (integer value v);

Dies erklärt ein Unterprogramm namens CIRCUITeinen einzigen Integer - Parameter, die vdie von Wert übergeben wird. Das Unterprogramm gibt ein logicalErgebnis trueoder false, und CIRCUIT := fweist fals Ergebnis. In Java,

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

Die Schlüsselwörter beginund endeinen Block Umfang begrenzen , die verschachtelt werden können, so dass CIRCUITin dem Hauptblock verschachtelt ist und UNBLOCKinnerhalb verschachtelt CIRCUIT. :=Zuweisung ist; ¬ist not; Element ist; ist leer; ist !=; stackund unstacklegen nahe , pushund pop.

Es ist nur ein Anfang, aber ich hoffe, es hilft.

Nachtrag: Nach einigem Nachdenken, Aund Bmuss isomorph sein.

Hier ist ein sehr wörtlicher Umriss. Ich weiß nicht genug über A, Bund Veine bessere Datenstruktur als Arrays zu wählen.

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;
            }
        }
    }
}
Beantwortet am 26/05/2010 um 06:09
quelle vom benutzer

stimmen
1

Sie können eine Java - Implementierung dieses Algorithmus auf Github finden: https://github.com/1123/johnson . Es nutzt die Jung2 Java Graph - Bibliothek.

Beantwortet am 13/02/2013 um 21:47
quelle vom benutzer

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