2010-05-25 9 views
5

Qualcuno conosce lo Donald B. Johnson's algorithm, che enumera tutti i circuiti elementari (cicli) in un grafico diretto diretto?Comprensione dello pseudocodice nell'algoritmo di Donald B. Johnson

Ho il documento che aveva pubblicato nel 1975, ma non riesco a capire lo pseudocodice.

Il mio obiettivo è implementare questo algoritmo in Java.

Alcune domande che ho, ad esempio, è qual è la matrice A k a cui fa riferimento. 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 k matrice A?

Un'altra domanda è che cosa significa?

begin logical f; 

fa anche la linea "logical procedure CIRCUIT (integer value v);" significa che la procedura del circuito restituisce una variabile logica? Nello pseudocodice è presente anche la riga "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 si riesce a trovare la carta prego email a pitelk @ hotmail.com e ti invierò il documento.

+0

Hai provato a leggere la carta a cui sei collegato? Sembra avere una spiegazione e una prova di accompagnamento. –

+0

sì, ma ancora non spiega il codice stesso, solo l'idea generale. Quello che non riesco a capire è lo pseudo codice. anche io ho trovato un altro link alla carta nel caso in cui il primo non funziona http://dutta.csc.ncsu.edu/csc791_spring07/wrap/circuits_johnson.pdf – Pitelk

+0

Grazie a tutti voi, vi siete presi cura del aspetto della mia domanda (ha fatto sembrare migliore, corretto errori di ortografia e cambiato il codice che ho scritto sull'originale del foglio -per qualche strana ragione non potevo semplicemente copiare e incollare il codice così l'ho digitato da zero.) – Pitelk

risposta

7

Lo 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. Potrebbe essere correlato al corrispondente adjacency matrix, ma non è chiaro per me. 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 logical f significa?

Questo dichiara una variabile locale che rappresenta una true o false valore, simile a Java di boolean.

logical procedure CIRCUIT (integer value v);

Questo dichiara un sottoprogramma nome CIRCUIT avere un unico parametro intero v che viene passato per valore. Il sottoprogramma restituisce un risultato logical di true o false e assegna come risultato il f.In Java,

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

Le parole chiave begin e end delimitano un ambito blocco che possono essere nidificati, così CIRCUIT è annidato nel blocco principale e UNBLOCK è annidato all'interno di CIRCUIT. := è un incarico; ¬ è not; è un elemento; è vuoto; è !=; stack e unstack suggeriscono push e pop.

È solo un inizio, ma spero che sia d'aiuto.

Addendum: A riflessione, A e B devono essere isomorfi.

Ecco uno schema molto letterale. Non so abbastanza su A, B & V per scegliere una struttura dati migliore degli 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; 
      } 
     } 
    } 
} 
+0

Grazie mille per l'informazione. Ancora non ero in grado di fare progressi significativi. cercherò di scoprire la sintassi ada o algol. Fino ad allora puoi chiarirmi qualcosa? the CIRCUIT: = f restituisce il valore immiadetly o assegna semplicemente il valore da restituire in seguito? in altre parole è come f = false o come return (f = false) Grazie – Pitelk

+0

L'istruzione 'CIRCUIT: = f' assegna il valore corrente della variabile locale' f' come risultato quando il sottoprogramma esce normalmente dopo il seguente dichiarazione. Il compito non _cause_ il ritorno; lo precede semplicemente. L'uso dell'identificatore 'CIRCUIT' non implica la ricorsione, mentre' UNBLOCK' sembra essere chiamato ricorsivamente. Il codice assomiglia molto a Wirth's _Algorithms + Data Structures = Programs_: http://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs – trashgod

+0

Penso che dopo averlo studiato ancora e ancora e con i tuoi utili commenti inizi a dare un senso a me . Proverò a scrivere la mia versione di pseudo-codice e lo posterò quando sarà pronto! – Pitelk

Problemi correlati