Η κατανόηση της pseudocode σε αλγόριθμο του Donald B. Τζόνσον

ψήφοι
5

Ξέρει κανείς τον αλγόριθμο Donald B. Τζόνσον , ο οποίος απαριθμεί όλα τα στοιχειώδη κυκλώματα (κύκλοι) σε σκηνοθεσία γράφημα;

Έχω το χαρτί που είχε δημοσιευθεί το 1975, αλλά δεν μπορώ να καταλάβω τον ψευδοκώδικα.

Στόχος μου είναι να εφαρμόσει αυτόν τον αλγόριθμο σε Java.

Μερικές ερωτήσεις που έχω, για παράδειγμα, είναι αυτό που είναι η μήτρα A k αναφέρεται. Στο pseudocode, αναφέρει ότι

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

Μήπως αυτό σημαίνει ότι πρέπει να εφαρμόσει ένα άλλο αλγόριθμο που βρίσκει το A k μήτρα;

Ένα άλλο ερώτημα είναι ποια είναι τα εξής μέσα;

begin logical f; 

Έχει, επίσης, η γραμμή logical procedure CIRCUIT (integer value v);σημαίνει ότι η διαδικασία κύκλωμα επιστρέφει μια λογική μεταβλητή; Στο pseudocode έχει επίσης τη γραμμή « CIRCUIT := f;». Τι σημαίνει αυτό?

Θα ήταν υπέροχο αν κάποιος θα μπορούσε να μεταφράσει ψευδοκώδικα αυτό το 1970 σε ένα πιο σύγχρονο είδος της ψευδοκώδικα ώστε να μπορώ να το καταλάβω

Σε περίπτωση που ενδιαφέρεστε να βοηθήσει, αλλά δεν μπορείτε να βρείτε το χαρτί παρακαλώ στείλτε μου σε pitelk@hotmail.com και θα σας στείλω το χαρτί.

Δημοσιεύθηκε 25/05/2010 στις 22:14
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
7

Ο ψευδο-κώδικας θυμίζει Algol, Pascal ή Ada.

Μήπως αυτό σημαίνει ότι πρέπει να εφαρμόσει ένα άλλο αλγόριθμο που βρίσκει το A k μήτρα;

Μια k φαίνεται να είναι μια λίστα των συστοιχιών των τιμών εισόδου που έχει τον συγκεκριμένο ιδιότητες. Μπορεί να σχετίζεται με το αντίστοιχο πίνακας γειτνίασης , αλλά δεν είναι σαφές για μένα. Υποθέτω κάτι σαν αυτό:

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

Τι logical fσημαίνει αυτό;

Αυτό δηλώνει μια τοπική μεταβλητή που αντιπροσωπεύει ένα trueή falseαξία, παρόμοια με της Java boolean.

logical procedure CIRCUIT (integer value v);

Αυτό δηλώνει ένα υποπρόγραμμα που ονομάζεται CIRCUITέχει ένα μόνο ακέραιο παράμετρο vπου έχει περάσει από την αξία. Το υποπρόγραμμα επιστρέφει ένα logicalαποτέλεσμα trueή falseκαι CIRCUIT := fεκχωρεί fως αποτέλεσμα. Στην Java,

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

Οι λέξεις-κλειδιά beginκαι endοριοθετούν ένα πεδίο μπλοκ που μπορεί να είναι ένθετες, έτσι CIRCUITφωλιάζει στο κύριο τμήμα και UNBLOCKείναι τοποθετημένος στο εσωτερικό του CIRCUIT. :=Είναι ανάθεση? ¬είναι not? είναι στοιχείο? είναι άδειο; είναι !=? stackκαι unstackπροτείνουν pushκαι pop.

Είναι μόνο η αρχή, αλλά ελπίζω ότι βοηθά.

Προσθήκη: Από τον προβληματισμό, Aκαι Bπρέπει να είναι ισομορφικοί.

Εδώ είναι μια πολύ κυριολεκτική περίγραμμα. Δεν ξέρω αρκετά για A, Bκαι Vνα επιλέξει μια καλύτερη δομή δεδομένων από πίνακες.

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;
            }
        }
    }
}
Απαντήθηκε 26/05/2010 στις 06:09
πηγή χρήστη

ψήφοι
1

Μπορείτε να βρείτε μια εφαρμογή Java αυτού του αλγορίθμου σε GitHub: https://github.com/1123/johnson . Χρησιμοποιεί τη βιβλιοθήκη γράφημα java Jung2.

Απαντήθηκε 13/02/2013 στις 21:47
πηγή χρήστη

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