Forstå pseudokode i Donald B. Johnson algoritme

stemmer
5

Vet noen Donald B. Johnson algoritme , som lister opp alle de elementære kretser (sykler) i en rettet graf?

Jeg har papiret han hadde publisert i 1975, men jeg kan ikke forstå pseudokode.

Mitt mål er å implementere denne algoritmen i Java.

Noen spørsmål jeg har, for eksempel, er det som er matrisen A k det refererer til. I pseudokode, det nevner at

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

Betyr det at jeg må gjennomføre en algoritme som finner en k matrise?

Et annet spørsmål er hva disse betyr?

begin logical f; 

Har også linjen logical procedure CIRCUIT (integer value v);betyr at kretsen prosedyren returnerer en logisk variabel? I pseudo har også linjen CIRCUIT := f;. Hva betyr dette?

Det ville være flott om noen kunne oversette dette 1970 pseudokode til en mer moderne type pseudokode, så jeg kan forstå det

I tilfelle du er interessert i å hjelpe, men du kan ikke finne papir vennligst send meg på pitelk@hotmail.com og jeg vil sende deg papiret.

Publisert på 25/05/2010 klokken 21:14
kilden bruker
På andre språk...                            


2 svar

stemmer
7

Den pseudo-kode er minner om Algol, Pascal eller Ada.

Betyr det at jeg må gjennomføre en algoritme som finner en k matrise?

En k synes å være en liste med grupper av inngangsverdier som har de angitte egenskaper. Det kan ha sammenheng med den tilsvarende nabomatrisen , men det er ikke klart for meg. Jeg gjetter noe sånt som dette:

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

Hva betyr logical fbety?

Dette sier en lokal variabel som representerer en trueeller falseverdi, i likhet med Java boolean.

logical procedure CIRCUIT (integer value v);

Dette erklærer et underprogram som heter CIRCUITsom har en enkelt heltall parameter vsom passeres av verdi. Underprogrammet returnerer et logicalresultat av trueeller false, og CIRCUIT := ftildeler fsom resultat. I Java,

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

De ordene beginog endavgrenser en blokk omfang som kan være nestet, så CIRCUITer nestet i hovedblokken og UNBLOCKer nestet inne i CIRCUIT. :=er oppdrag; ¬er not; er elementet; er tom; er !=; stackog unstackforeslå pushog pop.

Det er bare en start, men jeg håper det hjelper.

Tillegg: På refleksjon, Aog Bmå være isomorfe.

Her er en svært bokstavelig disposisjon. Jeg vet ikke nok om A, Bog Vå velge en bedre datastruktur enn arrays.

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;
            }
        }
    }
}
Svarte 26/05/2010 kl. 05:09
kilden bruker

stemmer
1

Du kan finne en Java gjennomføringen av denne algoritmen på GitHub: https://github.com/1123/johnson . Den bruker Jung2 java grafen bibliotek.

Svarte 13/02/2013 kl. 20:47
kilden bruker

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