Înțelegerea pseudocod în algoritmul Donald B. Johnson

voturi
5

Stie cineva algoritmul lui Donald B. Johnson , care enumără toate circuitele elementare (cicluri) într - un regia grafic?

Am hârtia el a publicat în 1975, dar nu pot să înțeleg pseudocod.

Scopul meu este de a pune în aplicare acest algoritm în Java.

Unele întrebări am, de exemplu, este ceea ce este matricea A k se referă la. În pseudocod, se menționează că

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

Asta înseamnă că trebuie să pună în aplicare un alt algoritm care găsește un k matrice?

O altă întrebare este ceea ce următoarele mijloace?

begin logical f; 

Are , de asemenea , linia logical procedure CIRCUIT (integer value v);înseamnă că procedura de circuit returnează o variabilă logică? În pseudocod are , de asemenea , linia „ CIRCUIT := f;“. Ce inseamna asta?

Ar fi grozav dacă cineva ar putea traduce pseudocod acest 1970 la un tip mai modern de pseudocod, așa că am putea înțelege

În cazul în care sunteți interesat să ajute, dar nu găsiți hârtia vă rugăm să-mi e-mail la pitelk@hotmail.com și vă voi trimite hârtia.

Întrebat 25/05/2010 la 22:14
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
7

Pseudo-cod amintește de Algol, Pascal sau Ada.

Asta înseamnă că trebuie să pună în aplicare un alt algoritm care găsește un k matrice?

Un k pare a fi o listă de matrice de valori de intrare având proprietățile specificate. Acesta poate fi legat de corespunzător matricea de adiacenta , dar nu este clar pentru mine. Cred că ceva de genul:

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

Ce logical fînseamnă?

Aceasta declară o variabilă locală care reprezintă o truesau falsevaloare, similar cu Java boolean.

logical procedure CIRCUIT (integer value v);

Aceasta declară un subprogram numit CIRCUITavând un parametru întreg unic , vcare este trecut prin valoare. Subprogramul returnează un logicalrezultat al truesau false, și CIRCUIT := fatribuie fca rezultat. În Java,

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

Cuvintele cheie beginși enddelimitează un domeniu de aplicare bloc care pot fi imbricate, așa că CIRCUITeste imbricat în blocul principal și UNBLOCKeste imbricate în interiorul CIRCUIT. :=este atribuire; ¬este not; este elementul; este gol; este !=; stackși unstacksugerează pushși pop.

Este doar un început, dar sper că ajută.

Addendum: Pe de reflecție, Ași Btrebuie să fie izomorfe.

Iată o foarte literală schiță. Nu știu destul despre A, Bși de Va alege o structură de date mai bune decât matrice.

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;
            }
        }
    }
}
Publicat 26/05/2010 la 06:09
sursa de către utilizator

voturi
1

Puteți găsi o implementare Java a acestui algoritm pe GitHub: https://github.com/1123/johnson . Acesta folosește Jung2 grafic java biblioteca.

Publicat 13/02/2013 la 21:47
sursa de către utilizator

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