2010-05-25 6 views
5

Кто-нибудь знает Donald B. Johnson's algorithm, который перечисляет все элементарные схемы (циклы) в ??Понимание псевдокода в алгоритме Дональда Б. Джонсона

У меня есть документ, который он опубликовал в 1975 году, но я не могу понять псевдокод.

Моя цель - реализовать этот алгоритм в Java.

Некоторые вопросы, которые я имею, например, это то, что является матрицей A k это относится к. В псевдокоде, он упоминает, что

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

Означает ли это, что я должен реализовать другой алгоритм, который находит A к матрицы?

Другой вопрос: что означает следующее?

begin logical f; 

ли также линии "logical procedure CIRCUIT (integer value v);" означает, что процедура схема возвращает логическую переменную? В псевдокоде также есть строка «CIRCUIT := f;». Что это значит?

Было бы здорово, если бы кто-то мог бы перевести этот 1970-х годов псевдокод на более современный тип псевдокоде, так что я могу понять это

В случае, если вы заинтересованы, чтобы помочь, но вы не можете найти бумагу, пожалуйста, напишите мне на pitelk @ hotmail.com, и я пришлю вам статью.

+0

Вы пытались прочитать статью, с которой вы связались? Кажется, у него есть сопроводительное объяснение и доказательство. – 2010-05-25 22:33:06

+0

да у меня есть, но все же он не объясняет сам код, просто общая идея. То, что я не понимаю, это псевдокод. также я нашел еще одну ссылку на бумагу, если первая не работает http://dutta.csc.ncsu.edu/csc791_spring07/wrap/circuits_johnson.pdf – Pitelk

+0

Спасибо вам всем, что вы позаботились о внешний вид моего вопроса (он выглядел лучше, исправил орфографические ошибки и изменил код, который я написал в оригинале статьи - по какой-то странной причине я не мог просто скопировать - вставьте код, чтобы я набрал его с нуля.) – Pitelk

ответ

7

Псевдокод напоминает Алгол, Паскаль или Аду.

Означает ли это, что я должен реализовать другой алгоритм, который находит A к матрицы?

к, как представляется, список массивов входных значений, имеющих указанные свойства. Он может быть связан с соответствующим adjacency matrix, но мне это непонятно.

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; 
      } 
     } 
    } 
} 
+0

Большое спасибо за информацию. Тем не менее я не смог добиться значительного прогресса. я попытаюсь выяснить синтаксис ada или algol. До тех пор вы можете мне кое-что уточнить? CIRCUIT: = f возвращает значение immiadetly или просто назначает значение, которое будет возвращено позже? Другими словами, это похоже на f = false или как return (f = false) Thanks – Pitelk

+0

Оператор 'CIRCUIT: = f' присваивает текущее значение локальной переменной' f' в качестве результата, когда подпрограмма выходит из системы после следующих заявление. Назначение не вызывает причину возврата; он просто предшествует этому. Использование идентификатора 'CIRCUIT' не означает рекурсии, тогда как' UNBLOCK', как представляется, вызывается рекурсивно. Код сильно похож на алгоритмы Вирта _Algorithms + Data Structures = Programs_: http://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs – trashgod

+0

Я думаю, что после изучения этого снова и снова и с вашими полезными комментариями он начинает иметь смысл для меня , Я попытаюсь написать свою версию псевдокода, и я опубликую его, когда он будет готов! – Pitelk