Jak przekonwertować kierowany Wykres acykliczny (DAG) na drzewo

Szukałem przykładów w C#, aby przekształcić DAG w drzewo.

Czy ktoś ma Przykład lub wskazówkę we właściwym kierunku?

Aktualizacja Objaśnień

Mam wykres, który zawiera listę modułów, które moja aplikacja jest wymagana do załadowania. Każdy moduł ma listę modułów, od których zależy. Na przykład tutaj są moje Moduły, A, B C, D i E

  • A nie ma zależności
  • B zależy od A, C i E
  • C zależy od A
  • D zależy od
  • E zależy od C i a

Chcę rozwiązać zależności i wygenerować drzewo, które wygląda tak...

--A

-- + -- B

-----+--C

---------+--D

--+ -- E

Sortowanie Topologiczne

Dzięki za informacje, jeśli wykonam sortowanie topologiczne i odwrócę wyjście będę miał następujące order

  • A
  • B
  • C
  • D
  • E

Chcę zachować strukturę hierarchiczną tak, aby moje moduły były ładowane do właściwego kontekstu, na przykład... moduł E powinien znajdować się w tym samym pojemniku co B

Thanks

Rohan

Author: polygenelubricants, 2009-03-09

5 answers

Jest odpowiedź teoretyczna grafu i odpowiedź programisty na to. Zakładam, że poradzisz sobie sam z programistami. Dla grafu odpowiedź teoretyczna:

    DAG jest zbiorem modułów, w których nigdy nie zdarza się, że A potrzebuje B, a jednocześnie B (lub jeden z modułów B potrzebuje) potrzebuje a, w modules-speak: no circular dependency. Widziałem, że zdarzają się okrągłe zależności (poszukaj przykładów na forach Gentoo), więc nie możesz być nawet w 100% pewien, że masz DAG, ale niech Załóżmy, że tak. Nie jest to bardzo trudne do sprawdzenia na kołowych zależności, więc polecam zrobić to gdzieś w swoim module loader.
  • w drzewie, coś, co nigdy nie może się zdarzyć, to to, że A zależy od B I C i że zarówno B, jak i C zależą od D (diamentu), ale to może się zdarzyć w DAG.
  • ponadto drzewo ma dokładnie jeden węzeł korzeniowy, ale DAG może mieć wiele węzłów "korzeniowych" (tzn. modułów, od których nic nie zależy). GIMP, GIMP program będzie root 'em. na przykład program taki jak GIMP, będzie root' em. na przykład program GIMP będzie root ' em. węzeł zestawu modułów, ale dla GENTOO prawie każdy program z GUI jest węzłem" root", podczas gdy biblioteki itp są ich zależnościami. (Tj. zarówno Konqueror, jak i Kmail zależą od Qtlib, ale nic nie zależy od Konquerora i nic nie zależy od Kmaila)

Teoretyczna odpowiedź na twoje pytanie, jak zauważyli inni, jest taka, że DAG nie może być zamieniony na drzewo, podczas gdy każde drzewo jest DAG.

Jednakże (Programiści wysokiego poziomu odpowiadają) jeśli chcesz, aby drzewo dla reprezentacje graficzne, interesują Cię tylko zależności konkretnego modułu, a nie to, co zależy od tego modułu. Podam przykład:

A depends on B and C
B depends on D and E
C depends on D and F

Nie mogę pokazać tego jako drzewa ASCII-art, z tego prostego powodu, że nie można tego przekształcić w drzewo. Jeśli jednak chcesz pokazać, od czego zależy A, możesz pokazać to:

A
+--B
|  +--D
|  +--E
+--C
   +--D
   +--F

Jak widzisz, dostajesz podwójne wpisy w swoim drzewie - w tym przypadku "tylko" D, ale jeśli zrobisz "Rozwiń wszystko" na drzewie Gentoo, gwarantuję Ci że twoje drzewo będzie miało co najmniej 1000 razy więcej węzłów niż istnieją Moduły. (istnieje co najmniej 100 pakietów, które zależą od Qt, więc wszystko od czego zależy Qt będzie obecne co najmniej 100 razy w drzewie).

Jeśli masz" duże "lub" złożone " drzewo, może być najlepiej rozwinąć drzewo dynamicznie, nie z góry, w przeciwnym razie możesz mieć bardzo intensywny proces pamięci.

Wadą powyższego drzewa jest to, że jeśli klikniesz otwórz B, to D, zobaczysz, że A i B zależy od D, ale nie to, że również C zależy od D. Jednak, w zależności od twojej sytuacji, może to wcale nie być ważne - jeśli utrzymasz listę załadowanych modułów, po załadowaniu C zobaczysz, że już załadowałeś D, i nie ma znaczenia, że nie był załadowany dla C, ale dla B. jest załadowany, to wszystko, co się liczy. Jeśli dynamicznie utrzymujesz to, co bezpośrednio zależy od określonego modułu, możesz również poradzić sobie z przeciwnym problemem (rozładowaniem).

Jednak to, czego nie można zrobić z drzewem, to co jest w twoim ostatnim zdaniu: zachowaj porządek topologiczny, tzn. jeśli B zostanie załadowany do tego samego kontenera co C, nigdy nie załadujesz C do tego samego kontenera. Nie rozumiem, co masz na myśli mówiąc "ładowanie do tego samego pojemnika"("loading into the same container")

Powodzenia!
 20
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 08:58:39

DAG i drzewo to nie to samo matematycznie. Tak więc każda konwersja wprowadza niejednoznaczność. Drzewo z definicji nie ma cykli, kropka.

 4
Author: dsimcha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 02:18:46

To, czego szukasz, aby znaleźć kolejność załadowania modułów, to sortowanie topologiczne twojego DAG. Jeśli krawędzie przechodzą od modułu do modułów, od których zależy (co myślę, że jest najbardziej prawdopodobne), będziesz musiał załadować Moduły w odwrotnej kolejności sortowania topologicznego, ponieważ moduł pojawi się-przed - wszystkimi modułami, od których zależy.

Jeśli reprezentujesz DAG w taki sposób, że krawędzie przechodzą od modułów zależnych do modułów zależnych od je (możesz to uzyskać odwracając wszystkie krawędzie na powyższym wykresie), możesz po prostu załadować Moduły w kolejności topologicznej.

 2
Author: arnsholt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 02:36:25

To zależy od tego, jak reprezentujesz swój DAG. Na przykład, może to być macierz przylegająca (a[I,j] = 1, jeśli istnieje krawędź od węzła i do węzła j, w przeciwnym razie 0), lub jako system wskaźników, lub jako tablica węzłów i tablica krawędzi....

Dalej, nie jest jasne, jaką transformację próbujesz zastosować. Połączone DAG to drzewo, więc obawiam się, że musisz nieco wyjaśnić swoje pytanie.

 1
Author: MarkusQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 02:06:51

Można to zrobić tylko wtedy, gdy wszystkie podzbiory mają pojedynczy węzeł główny.

 0
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 02:05:48