Inzicht in de pseudocode in de Donald B. Johnson's algoritme

stemmen
5

Weet iemand het algoritme Donald B. Johnson , die alle de elementaire circuits (cycli) in een somt gericht grafiek?

Ik heb het papier dat hij in 1975 had gepubliceerd, maar ik kan de pseudocode niet begrijpen.

Mijn doel is om dit algoritme in Java te implementeren.

Sommige vragen Ik heb bijvoorbeeld wat is de matrix A k verwijst naar. In de pseudocode, vermeldt dat

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

Betekent dat ik een algoritme dat de A vindt implementeren k matrix?

Een andere vraag is wat de volgende middelen?

begin logical f; 

Heeft ook de lijn logical procedure CIRCUIT (integer value v);betekenen dat het circuit procedure geeft een logische variabele? In de pseudocode heeft ook de lijn CIRCUIT := f;. Wat betekent dit?

Het zou geweldig zijn als iemand dit 1970 pseudocode zou kunnen vertalen naar een meer moderne vorm van pseudocode, zodat ik het kan begrijpen

Indien u geïnteresseerd bent om te helpen, maar je kunt het niet vinden het papier gelieve me in pitelk@hotmail.com en ik zal u het papier te sturen.

De vraag is gesteld op 25/05/2010 om 22:14
bron van user
In andere talen...                            


2 antwoorden

stemmen
7

De pseudo-code doet denken aan Algol, Pascal en Ada.

Betekent dat ik een algoritme dat de A vindt implementeren k matrix?

Een k blijkt een lijst arrays invoerwaarden die het opgegeven eigenschappen zijn. Het kan worden gerelateerd aan de bijbehorende adjacentiematrix , maar het is mij niet duidelijk. Ik gok dat zoiets als dit:

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

Wat betekent logical fdat?

Dit verklaart een lokale variabele die een trueof falsewaarde, vergelijkbaar met Java boolean.

logical procedure CIRCUIT (integer value v);

Dit verklaart een subprogramma met de naam CIRCUITmet een enkele integer parameter vdie wordt doorgegeven door de waarde. Het subprogramma retourneert een logicalresultaat van trueof false, en CIRCUIT := fkent fals resultaat. In Java,

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

De zoekwoorden beginen endbegrenzen een blok ruimte die kan worden genest, dat CIRCUITis genest in het hoofdblok en UNBLOCKgenest binnenin CIRCUIT. :=is opdracht; ¬is not; element is; is leeg; is !=; stacken unstacksuggereren pushen pop.

Het is slechts een begin, maar ik hoop dat het helpt.

Addendum: Bij nader inzien, Aen Bmoet isomorf zijn.

Hier is een zeer letterlijke omtrek. Ik weet niet genoeg over te weten A, Ben Vom een betere datastructuur dan arrays te kiezen.

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;
            }
        }
    }
}
antwoordde op 26/05/2010 om 06:09
bron van user

stemmen
1

: U kunt een Java-implementatie van dit algoritme op GitHub vinden https://github.com/1123/johnson . Het maakt gebruik van de Jung2 java grafiek bibliotheek.

antwoordde op 13/02/2013 om 21:47
bron van user

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