Проблемы:Эффективного способ преобразования набора ребер графа в дневной «напечатанный» дерево
Я пытаюсь взять набор ребер графа сохраняется следующим образом:
my $edges = {
# Parent => set_of_children
1 => [ 2, 6, 8 ],
2 => [ 6 ],
6 => [ 7 ],
};
И преобразуйте его в полномасштабное дерево (конечный вывод JSON, но я отлично согласен с Perl-эквивалентной структурой данных, которую могу подавать на кодирование модуля JSON)
my $full_tree = {
node => 1,
children => [
{
node => 2,
children => [ # Subtree expanded right here. List children
{
node => 6,
children => [
{ node => 7 }, # Leaf level, no children
],
}, # End Node 6
],
}, # End Node 2
{
node => 6,
children => [
{ node => 7 }, # IMPORTANT: Again expanding node #6!
],
}, # End Node 6
{
node => 8,
}, # Leaf level, no children
],
};
Обратите внимание на важные детали:
- Если узел встречается в дереве, мы выводим ПОЛНЫЙ поддерево для него
- Если узел встречается в дереве> 1 раз, мы выводим полную копию поддерева в каждом месте (свидетельский узел 6).
То, что я пытался:
Я попробовал очевидное (рекурсивно печать - я даже не буду размещать код здесь, так как рекурсивное решение Алгоритмы и структуры данных 101 материалов).
Что мне нужно помочь с:
В Perl, вызовы подпрограмм имеют затраты. Для очень большого дерева (6 цифр # узлов, с большим количеством узлов в нескольких местах), я буду платить штраф производительности как:
Having пересчитывать множественные, протекающие узлы.
Возможно, это может быть исправлено с помощью memoization.
Исполнение штрафов за стеки по стопкам вызовов подпрограмм.
Как таковой, мне было интересно, существует ли хороший подход Perl для печати нужной структуры данных БЕЗ отказоустойчивого алгоритма, реализованного посредством рекурсии реальной подпрограммы. Какой-то тип DFS/BFS, полученный в виде цикла, будет моим догадком, но я не эксперт по алгоритмам дерева, поэтому не знал бы, как подойти к нему.
Общий набор специфических для Perl алгоритмов/рекомендаций по структуре данных достаточен, мне не нужен полный рабочий код как таковой.
Производительность несколько важна для крупногабаритных.
Примечание: мы знаем, что «1» уже является корнем дерева. Мне не нужно это вычислять. – YHZ
То, что вы описываете, - это не дерево. В дереве узел всегда имеет один родительский элемент. Случай, когда вы дважды посещаете узел, не существует. Вместо этого вы должны взглянуть на алгоритмы ориентированного графа. измененная версия DFS (итеративная версия) должна дать вам то, что вы ищете –
_ | «Я пробовал очевидное (рекурсивно печатать его - я даже не буду размещать код здесь, так как рекурсивное решение является материалом« Алгоритмы и данные »).» _. Да, но есть выбор алгоритмов, структур данных и реализаций, даже на уровне 101. – dwarring