- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有谁知道 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 年代的伪代码翻译成更现代的伪代码类型,以便我能够理解,那就太好了
如果您有兴趣提供帮助但找不到论文,请发送电子邮件至 pitelk@hotmail.com 我会将论文发送给您。
最佳答案
伪代码让人想起 Algol、Pascal 或 Ada。
Does that mean I have to implement another algorithm that finds the Ak matrix?
Ak 似乎是具有指定属性的输入值数组列表。可能与对应的adjacency matrix有关,但我不清楚。我猜是这样的:
int[][] a = new int[k][n];
int[][] b = new int[k][n];
boolean[] blocked = new boolean[n];
int s;
What does
logical f
mean?
这声明了一个表示true
或false
值的局部变量,类似于 Java 的 boolean
。
logical procedure CIRCUIT (integer value v);
这声明了一个名为 CIRCUIT
的子程序,它有一个按值传递的整数参数 v
。子程序返回 true
或 false
的 logical
结果,并且 CIRCUIT := f
分配 f
作为结果。在 Java 中,
boolean circuit(int v) {
boolean f;
...
f = false;
...
return f;
}
关键字begin
和end
界定了一个可以嵌套的 block 作用域,所以CIRCUIT
嵌套在主 block 中, UNBLOCK
嵌套在 CIRCUIT
中。 :=
是赋值; ¬
是不是
; ∈
为元素; ∅
为空; ≠
是!=
; 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;
}
}
}
}
关于java - 理解 Donald B. Johnson 算法中的伪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908575/
我想修改 Johnson 算法的 networkx 实现 ( https://networkx.github.io/documentation/networkx-1.10/_modules/netwo
我正在使用来自 https://gist.github.com/ashleyholman/6793360 的 Jonhson 算法代码,但是在编译时它会抛出一些错误,其中一些我已经解决了,但还有一些我
在Johnson's algorithm您创建一个新节点,然后将零权重边从该节点添加到所有其他节点,作为重新加权过程的第一步。但是为什么我们不能在不添加新节点的情况下做同样的事情呢?那是在图中选择一个
我有一个问题,我在学校过去的一些考试中被问过,但我找不到答案。 Is it possible knowing the final matrix after running the Johnson Al
我正在尝试简化在 Google map (API v3 Javascript)上绘制的复杂多边形。我的目标是接收一组简单的多边形。问题是我画的图有的可以分析,有的不能分析。 例如: 1) 图 8-垂直
有谁知道 Donald B. Johnson's algorithm , 它枚举了有向图中的所有基本电路(循环)? 我有他在 1975 年发表的论文,但我看不懂伪代码。 我的目标是用 Java 实现这
我正在尝试使用随机投影的方法(基本上,在保持两点之间的欧氏距离的同时减少维度),最近我在网上找到了一些代码(matlab 的 mex 文件): /* * sjlt.c - Sparse Johnso
我无法理解 Donald Johnson 发表的关于在图中查找循环(Circuits)的论文的特定部分。 更具体地说,我无法理解以下伪代码行中提到的矩阵 Ak 是什么: Ak:=最小的强分量K的邻
Johnson's paper开始在有向图中描述不同的基本电路(简单循环): A circuit is elementary if no vertex but the first and last a
使用什么抽象数据类型 (ADT) 来实现 steinhaus-johnson-trotter algorithm在 Python 中生成对象的排列? 我特别担心在数据的任何位置插入的复杂性成本: 1
此代码的最终目标是确保客户定义的形状实际上可以由我们的……呃,机器加工。为此,我们将指定的形状向内偏移钻头的半径,然后向外退回相同的量,从而将任何太细而无法实际装入钻头的部分四舍五入。对于多边形偏移,
我是一名优秀的程序员,十分优秀!