Zrozumienie Pseudokod algorytmu Donalda B. Johnsona

głosy
5

Czy ktoś zna algorytm Donalda B. Johnsona , który wylicza wszystkie elementarne obwody (cykle) w reżyserii wykres?

Mam papier miał opublikowany w 1975 roku, ale nie mogę zrozumieć Pseudokod.

Moim celem jest wdrożenie tego algorytmu w języku Java.

Kilka pytań mam, na przykład, jest to, co jest macierzy A k ono odnosi. W Pseudokod, wspomina, że

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

Czy to znaczy, muszę wdrożyć inny algorytm, który znajdzie  k macierzy?

Inną kwestią jest to, co się następujące środki?

begin logical f; 

Czy też linia logical procedure CIRCUIT (integer value v);oznacza, że procedura obwód zwraca zmienną logiczną? W Pseudokod ma również linię „ CIRCUIT := f;”. Co to znaczy?

Byłoby wspaniale, gdyby ktoś mógłby przetłumaczyć to 1970 Pseudokod do bardziej nowoczesnego typu pseudocode więc mogę to zrozumieć

W przypadku, gdy są zainteresowani, aby pomóc, ale nie można znaleźć papier proszę napisz do mnie na pitelk@hotmail.com i wyślę ci papier.

Utwórz 25/05/2010 o 22:14
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
7

Pseudo-kod przypomina Algol, Pascal czy Ada.

Czy to znaczy, muszę wdrożyć inny algorytm, który znajdzie  k macierzy?

K pojawia się lista z tablic wartości wejściowych o określonych właściwościach. Może to być związane z odpowiednią macierz sąsiedztwa , ale to nie jest dla mnie jasne. Zgaduję coś takiego:

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

Co to logical foznacza?

Ten deklaruje zmienną lokalną reprezentujących truelub falsewartość, podobny do Javy boolean.

logical procedure CIRCUIT (integer value v);

Ten deklaruje podprogram o nazwie CIRCUITo jeden parametr liczbę całkowitą v, która jest przekazywane przez wartość. Podprogram zwraca logicalwynik truelub false, i CIRCUIT := fprzypisuje fjako wynik. W Javie

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

Słowa kluczowe begini endograniczają zakresu bloków, które mogą być umieszczone tak, CIRCUITjest zagnieżdżony w głównym bloku i UNBLOCKjest zagnieżdżona wewnątrz CIRCUIT. :=jest przyporządkowanie; ¬jest not; jest element wewnętrzny; jest pusty; jest !=; stacki unstacksugerują, pushi pop.

To dopiero początek, ale mam nadzieję, że to pomaga.

Uzupełnienie: Po zastanowieniu, Ai Bmuszą być izomorficzne.

Oto bardzo dosłowny konspektu. Nie wiem wystarczająco dużo o A, Bi Vwybrać lepszą strukturę danych niż tablic.

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;
            }
        }
    }
}
Odpowiedział 26/05/2010 o 06:09
źródło użytkownik

głosy
1

Można znaleźć implementację Javy tego algorytmu na github: https://github.com/1123/johnson . Wykorzystuje wykresu java biblioteki Jung2.

Odpowiedział 13/02/2013 o 21:47
źródło użytkownik

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