Многоуровневый поиск по дереву Java с использованием fork-join

У меня есть многоуровневая древовидная структура, которую я должен пройти, чтобы определить статус. Я просматриваю обход типа Post-Order, где сначала обрабатываются узлы листа. И условие конца поиска зависит от того, какой из дочерних узлов имеет статус неактивный. Кроме того, с точки зрения производительности, я бы использовал механизм JKK-fork-join.

enter image description here

0
nl ja de

1 ответы

Вот (очень) грубый эскиз того, как вы могли это сделать.

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 tasks = new LinkedList();
            for (TreeNode child : children) {
                tasks.add(new VisitNodeAction(iterator, child));
            }
            invokeAll(tasks);
            iterator.visit(node);
        }
    }
}

Некоторые вещи, которые необходимо будет изменить:

  • Добавление чека в состояние неактивного состояния. Самый простой способ состоял бы в том, чтобы сохранить атомный булев в каждом RecursiveAction , который проверяется перед обработкой узла и обновляется, когда узел неактивен, хотя это не очень чистый или функциональный маршрут.
  • Добавляя способ решить, когда будут использоваться новые потоки, приведенное выше использует поток для каждого узла. Кроме того, вы можете немного оптимизировать его, не создавая ForkJoinPool при каждом вызове postorderParallel .
1
добавлено
Спасибо за блестящий шаблон решения, я возьму его отсюда ...
добавлено автор gpa, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async