我正在尝试为字符串调制创建一个简单的网络
这个想法是网络的输出是最后执行的模块的输出 模块可以以任何方式排列,如果模块必须作为输入连接,则应对输入求和(字符串连接)。
为了实现它,我想将网络表示为图形数据结构。
现在阻止我的是如何确定模块有两个连接作为输入(所以我可以在输入结果作为输入之前将两个输出相加)?
用于遍历图表的算法是什么?广度优先?
任何更好的解决方案来代表网络? [伪代码非常感谢]
答案 0 :(得分:1)
如果您将图形存储为邻接列表(“此节点指向这些节点”),那么您可以简单地遍历邻接列表并交换A - > B对B - >; A,创建反邻接列表(“这些节点指向此节点”)。
this article中的更多信息。
编辑:
从您的图表中,邻接列表将是:
A -> [B, C]
B -> [D]
C -> [D]
D -> []
这可以表示为Map<Node, Collection<Node>>
。编写一个接受一对并更新地图的方法,称之为connect
。要构建结构,您可以使用connect(A, B)
,connect(A, C)
,connect(B, D)
,connect(C, D)
来调用它。
要反转它,请创建一个新的Map来保持倒置结构。迭代映射中的每个键,然后遍历列表中的每个值,并在反转结构上调用connect
,并反转参数。
答案 1 :(得分:1)
您可以在广度优先和深度优先两者中实现此功能。我要发布深度优先算法:
public class Node {
private List<Node> parents = new ArrayList<Node>();
private List<Node> children = new ArrayList<Node>();
private Map<Node, String> receivedMessages = new HashMap<Node, String>();
private String id = "";
public Node(String id) {
this.id = id;
}
void processMessage(Node sender, String message) {
if (parents.contains(sender))
receivedMessages.put(sender, message);
// if all the parents sent the message
if (receivedMessages.size() == parents.size()) {
String newMessage = composeNewMessage(receivedMessages);
if (children.size() == 0) // if end node or "leaf"
ouputResult(this, newMessage);
else {
for (Node child : children) {
child.processMessage(this, newMessage);
}
}
}
}
public void addParent(Node parent) {
if (parent != null)
parents.add(parent);
parent.children.add(this);
}
public void addChild(Node child) {
if (child != null)
children.add(child);
child.parents.add(this);
}
private void ouputResult(Node node, String newMessage) {
// TODO: implement
}
private String composeNewMessage(Map<Node, String> receivedMessages2) {
// TODO: implement
return "";
}
public static void main(String[] args) {
Node A = new Node("A");
Node B = new Node("B");
Node C = new Node("C");
Node D = new Node("D");
Node start = new Node("start");
Node end = new Node("end");
A.addParent(start);
B.addParent(A);
C.addParent(A);
D.addParent(B);
D.addParent(C);
end.addParent(D);
A.processMessage(start, "Message");
}
}