Comprendere la pseudocodice nel algoritmo di Donald B. Johnson

voti
5

Qualcuno conosce l'algoritmo di Donald B. Johnson , che elenca tutti i circuiti elementari (cicli) in un diretto grafico?

Ho la carta che aveva pubblicato nel 1975, ma non riesco a capire il pseudocodice.

Il mio obiettivo è quello di implementare questo algoritmo in Java.

Alcune domande che ho, per esempio, è ciò che è la matrice A k si riferisce. Nel pseudocodice, si informa che

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

Vuol dire che devo implementare un altro algoritmo che trova la A k matrice?

Un'altra domanda è che cosa i seguenti mezzi?

begin logical f; 

Ha anche la linea logical procedure CIRCUIT (integer value v);significa che la procedura del circuito restituisce una variabile logica? In pseudocodice ha anche la linea CIRCUIT := f;. Cosa significa questo?

Sarebbe bello se qualcuno potesse tradurre pseudocodice questo 1970 a un tipo più moderno di pseudocodice così posso capire che

Nel caso in cui si è interessati ad aiutare, ma non riesce a trovare la carta prego email a pitelk@hotmail.com e io vi invierà la carta.

È pubblicato 25/05/2010 alle 22:14
fonte dall'utente
In altre lingue...                            


2 risposte

voti
7

La pseudo-codice ricorda Algol, Pascal o Ada.

Vuol dire che devo implementare un altro algoritmo che trova la A k matrice?

Un k sembra essere un elenco di array di valori di ingresso aventi le proprietà specificate. Può essere correlato al corrispondente matrice di adiacenza , ma non è chiaro. Sto indovinando qualcosa di simile:

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

Cosa vuol logical fdire?

Questo dichiara una variabile locale che rappresenta una trueo falsevalore simile a Java boolean.

logical procedure CIRCUIT (integer value v);

Questo dichiara un sottoprogramma chiamato CIRCUITavere un unico parametro intero vche viene passato per valore. Il sottoprogramma restituisce un logicalrisultato di trueo false, e CIRCUIT := fassegna fil risultato. In Java,

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

Le parole chiave begine enddelimitano un ambito blocco che possono essere nidificati, quindi CIRCUITè annidata nel blocco principale ed UNBLOCKè annidato all'interno di CIRCUIT. :=è assegnazione; ¬è not; è elemento; è vuoto; è !=; stacke unstacksuggerire pushe pop.

E 'solo un inizio, ma spero che aiuta.

Addendum: Riflettendoci, Ae Bdeve essere isomorfo.

Ecco una molto letterale contorno. Io non ne so abbastanza su A, Be Vdi scegliere una struttura di dati meglio di array.

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;
            }
        }
    }
}
Risposto il 26/05/2010 a 06:09
fonte dall'utente

voti
1

È possibile trovare un'implementazione Java di questo algoritmo su GitHub: https://github.com/1123/johnson . Esso utilizza la libreria grafico Java Jung2.

Risposto il 13/02/2013 a 21:47
fonte dall'utente

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