[英]Java multi-way tree searching using fork-join
我具有多向树结构,必须遍历以确定其状态。 我正在研究“后订单”类型遍历,其中先处理叶节点。 搜索结束条件取决于状态为非活动的子节点中的任何一个。 另外,从性能角度来看,我将使用JDK7的fork-join机制。
这是一个(非常)大概的草图。
final class TreeNode {
private final Iterable<TreeNode> children;
TreeNode(Iterable<TreeNode> aChildren) {
children = aChildren;
}
Iterable<TreeNode> getChildren() {
return children;
}
void postorder(TreeNodeIterator iterator) {
postorderTraverse(this, iterator);
}
private void postorderTraverse(TreeNode node, TreeNodeIterator iterator) {
for (TreeNode child : children) {
postorderTraverse(child, iterator);
}
iterator.visit(node);
}
void postorderParallel(TreeNodeIterator iterator) {
new ForkJoinPool().invoke(new VisitNodeAction(iterator, this));
}
interface TreeNodeIterator {
void visit(TreeNode child);
}
private class VisitNodeAction extends RecursiveAction {
private final TreeNodeIterator iterator;
private final TreeNode node;
private VisitNodeAction(TreeNodeIterator iterator, TreeNode node) {
this.iterator = iterator;
this.node = node;
}
@Override
protected void compute() {
List<RecursiveAction> tasks = new LinkedList<RecursiveAction>();
for (TreeNode child : children) {
tasks.add(new VisitNodeAction(iterator, child));
}
invokeAll(tasks);
iterator.visit(node);
}
}
}
有些事情需要修改:
RecursiveAction
中保留一个原子布尔值,该布尔值在处理节点之前进行检查,并在节点处于非活动状态时进行更新,尽管这不是很干净或实用的路由。 ForkJoinPool
上的每次调用postorderParallel
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.