Есть теоретический ответ на график и ответ программиста на это. Я полагаю, вы сами справитесь с программистами. Для графа теоретический ответ:
- DAG - это набор модулей, в которых никогда не бывает так, что A нужен B, и в то же время B (или одному из модулей B) нужен A, говоря по модулям: циклическая зависимость отсутствует. Я видел циклические зависимости (ищите примеры на форумах Gentoo), так что вы даже не можете быть на 100% уверены, что у вас есть DAG, но давайте предположим, что у вас есть. Если проверка циклических зависимостей не очень сложная, я бы порекомендовал сделать это где-нибудь в загрузчике модулей.
- В дереве никогда не может произойти то, что A зависит от B и C, а B и C зависят от D (ромба), но это может происходить в DAG.
- Кроме того, дерево имеет ровно один корневой узел, но группа обеспечения доступности баз данных может иметь несколько «корневых» узлов (т. Е. Модулей, от которых ничего не зависит). Например, такая программа, как GIMP, программа GIMP будет корневым узлом набора модулей, но для GENTOO почти любая программа с графическим интерфейсом является «корневым» узлом, а библиотеки и т. Д. Являются их зависимостями. (То есть Konqueror и Kmail зависят от Qtlib, но ничего не зависит от Konqueror и ничего не зависит от Kmail)
Теоретический ответ Графа на ваш вопрос, как указывали другие, заключается в том, что DAG нельзя преобразовать в дерево, в то время как каждое дерево является DAG.
Однако (программисты высокого уровня отвечают), если вам нужно дерево для графических представлений, вас интересуют только зависимости конкретного модуля, а не то, что зависит от этого модуля. Позвольте мне привести пример:
A depends on B and C
B depends on D and E
C depends on D and F
Я не могу показать это как дерево ASCII-искусства, по той простой причине, что это не может быть преобразовано в дерево.
Однако, если вы хотите показать, от чего зависит A, вы можете показать это:
A
+--B
| +--D
| +--E
+--C
+--D
+--F
Как видите, вы получаете двойные записи в своем дереве - в данном случае «только» D, но если вы сделаете «развернуть все» в дереве Gentoo, я гарантирую вам, что ваше дерево будет иметь как минимум 1000-кратную сумму узлов, так как есть модули. (есть как минимум 100 пакетов, которые зависят от Qt, поэтому все, от чего зависит Qt, будет присутствовать в дереве как минимум 100 раз).
Если у вас есть «большое» или «сложное» дерево, может быть лучше развернуть дерево динамически, а не заранее, в противном случае у вас может быть процесс, требующий очень большой памяти.
Недостаток дерева выше в том, что если вы нажмете кнопку open B, то D, вы увидите, что A и B зависят от D, но не то, что C также зависит от D. Однако, в зависимости от вашей ситуации, это может быть важно вообще - если вы поддерживаете список загруженных модулей, при загрузке C вы видите, что вы уже загрузили D, и не важно, что он был загружен не для C, а для B. Он загружен, вот и все вопросы. Если вы динамически поддерживаете то, что напрямую зависит от определенного модуля, вы можете решить и противоположную проблему (выгрузку).
Однако то, что вы не можете сделать с деревом, это то, что в вашем последнем предложении: сохранить топологический порядок, то есть, если B загружается в тот же контейнер, что и C, вы никогда не загрузите C в тот же контейнер, что и Что ж. Или вам, возможно, придется смириться с тем, чтобы все было помещено в один контейнер (хотя я не совсем понимаю, что вы имеете в виду под «загрузкой в один контейнер»)
Удачи!