Pochopení pseudocode v Donald B. Johnsona algoritmu

hlasů
5

Ví někdo, algoritmus Donalda B. Johnsona , který vytvoří výčet všech základních okruhů (cyklů) v režii grafu?

Mám papír, kterou publikoval v roce 1975, ale nemohu pochopit pseudokód.

Mým cílem je implementace tohoto algoritmu v jazyce Java.

Některé otázky mám, například, je to, co je matice K se týká. V pseudokódu, že uvádí, že

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

Znamená to, že budu muset implementovat další algoritmus, který najde K matice?

Další otázkou je, co tyto prostředky?

begin logical f; 

Má také čára logical procedure CIRCUIT (integer value v);znamená, že postup okruh vrací logickou proměnnou? V pseudocode má také řádek „ CIRCUIT := f;“. Co to znamená?

Bylo by skvělé, kdyby někdo mohl přeložit tento 1970 pseudocode na modernější typ pseudokódu, takže to mohu chápat

V případě, že máte zájem pomoci, ale nemůžete najít papír, prosím napište mi na pitelk@hotmail.com a pošlu vám noviny.

Položena 25/05/2010 v 22:14
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
7

Pseudo-kód je připomínající Algol, Pascal nebo Ada.

Znamená to, že budu muset implementovat další algoritmus, který najde K matice?

K se zdá být seznam polí vstupních hodnot, které mají uvedené vlastnosti. To může být ve vztahu k odpovídající matice přilehlosti , ale to není jasné, ke mně. Hádám, že něco takového:

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

Co to logical fznamená?

To deklaruje místní proměnnou reprezentující truenebo falsehodnotu, podobně jako Java je boolean.

logical procedure CIRCUIT (integer value v);

To deklaruje podprogram s názvem CIRCUIT, který má jeden parametr celé číslo v, které je předán podle hodnoty. Podprogram vrátí logicalvýsledek true, nebo false, a CIRCUIT := fpřiřadí fjako výsledek. V Javě,

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

Klíčová slova begina endvymezují blokové rozsah, který může být vnořené, takže CIRCUITje vnořen do hlavního bloku a UNBLOCKje vnořená uvnitř CIRCUIT. :=je úkol; ¬je not; je prvek; je prázdný; je !=; stacka unstacknavrhnout pusha pop.

Je to jen začátek, ale doufám, že to pomůže.

Dodatek: Na zamyšlení, Aa Bmusí být isomorfní.

Zde je velmi doslovný obrys. Nemám dost informací o A, Ba Vvybrat si lepší datovou strukturu, než pole.

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;
            }
        }
    }
}
Odpovězeno 26/05/2010 v 06:09
zdroj uživatelem

hlasů
1

Najdete jávská realizace tohoto algoritmu na GitHub: https://github.com/1123/johnson . Používá Jung2 knihovnu java grafu.

Odpovězeno 13/02/2013 v 21:47
zdroj uživatelem

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