首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fork-join的Java多向树搜索

使用fork-join的Java多向树搜索
EN

Stack Overflow用户
提问于 2013-01-10 02:45:18
回答 1查看 1.6K关注 0票数 0

我有多向树结构,我必须遍历它来确定状态。我正在研究“Post-Order”类型的遍历,其中首先处理叶节点。并且搜索结束条件取决于任何处于非活动状态的子节点。另外,从性能的角度来看,我会使用JDK7的fork-join机制。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-10 04:04:48

这是一个(非常)粗略的草图,告诉你如何去做。

代码语言:javascript
复制
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中保留一个原子布尔值,在处理节点之前检查它,并在节点处于非活动状态时更新它,尽管这不是一个非常干净或有效的路由。
  • 添加了一种方法来决定何时应该使用新线程,上面的方法为每个节点使用了一个线程。此外,您还可以通过不在每次调用postorderParallel.

时都创建ForkJoinPool来对其进行优化

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14244263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档