了解唐纳德·B·约翰逊算法中的伪代码 - java

有谁知道Donald B. Johnson's algorithm,它在有向图中枚举了所有基本电路(循环)?

我有他在1975年发表的论文,但我听不懂伪代码。

我的目标是用Java实现此算法。

我有一些问题,例如,它所指的矩阵Ak是什么。在伪代码中,它提到

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

这是否意味着我必须实现另一种找到Ak矩阵的算法?

另一个问题是什么意思?

begin logical f; 

"logical procedure CIRCUIT (integer value v);"行还表示电路过程返回逻辑变量吗?伪代码中还包含“CIRCUIT := f;”行。这是什么意思?

如果有人可以将1970年的伪代码转换为更现代的伪代码,这样我才能理解,那将是很好的

如果您有兴趣提供帮助,但找不到该论文,请给我发送电子邮件[email protected],我将向您发送该论文。

参考方案

伪代码让人想起Algol,Pascal或Ada。

这是否意味着我必须实现另一种找到Ak矩阵的算法?

Ak似乎是具有指定属性的输入值数组的列表。它可能与相应的adjacency matrix有关,但我不清楚。我猜是这样的:

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

logical f是什么意思?

这将声明一个表示truefalse值的局部变量,类似于Java的boolean

logical procedure CIRCUIT (integer value v);
这将声明一个名为CIRCUIT的子程序,该子程序具有按值传递的单个整数参数v。子程序返回logicaltruefalse结果,并且CIRCUIT := f分配f作为结果。在Java中,

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

关键字beginend界定了可能嵌套的块范围,因此CIRCUIT嵌套在主块中,UNBLOCK嵌套在CIRCUIT内。 :=是赋值; ¬not; 是元素; 为空; !=; stackunstack建议pushpop

这只是一个开始,但我希望对您有所帮助。

附录:反射时,AB必须是同构的。

这是一个非常字面的轮廓。我对ABV不够了解,无法选择比数组更好的数据结构。

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

Java-将int更改为ascii - java

java有没有办法将int转换为ascii符号? 参考方案 您是否要将int转换为char?:int yourInt = 33; char ch = (char) yourInt; System.out.println(yourInt); System.out.println(ch); // Output: // 33 // ! 还是要将int转换为Stri…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…