Самый быстрый обход дерева - PullRequest
0 голосов
/ 13 февраля 2012

У меня довольно большая древовидная структура данных, которая будет обновляться (удаление и добавление узлов и т. Д.).Я должен пройти по дереву, используя первый подход ширины, чтобы посетить все узлы (до определенной ширины, например, 7) и поместить его в список.Затем функция будет проходить через узлы и возвращать значение true, если информация была найдена внутри списка.

Это занимает много времени для обхода узлов.Я не думаю, что мне следует сопоставлять каждый отдельный узел с каждым дочерним узлом, а затем извлекать узел с помощью Dictionary и получать все его дочерние элементы (рекурсивно).Как мне это сделать?Самый быстрый способ - сопоставить все узлы между собой, например, узел

Dictionary<Node, List<Node>>

  • , список всех дочерних элементов (включая дочерние элементы дочерних элементов ...), а затем вытащить эти узлы.и получить его как 2000 детей быстро.Но если узел добавляется или удаляется в любом месте, все словарные узлы должны быть обновлены (что кажется хлопотным).Другой способ состоит в том, чтобы динамически проходить через него во время выполнения (что занимает время).Это вопрос отображения всего вместе в начале во время генерации дерева или зацикливания во время выполнения.

Как лучше всего справиться с этой ситуацией?Любая идея, указатели, комментарии, любая вещь полезна.В настоящее время эта операция занимает около 25% времени выполнения программы.

1 Ответ

0 голосов
/ 13 февраля 2012

Если вы просто оцениваете предикат, вы можете сделать это непосредственно при обходе дерева, вам не нужно сначала помещать полное дерево в список - если только вы не кешируете список.Оценив предикат непосредственно на узлах дерева, вы можете закорочить / прекратить обход раньше, когда впервые найдете интересующую вас информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...