Jak można zdefiniować skierowany graf acykliczny (DAG) (ciągów) (z jednego korzenia) najlepiej w Haskell?Jak zdefiniować drzewiastą DAG w Haskell
Szczególnie należy zastosować następujące dwie funkcje na tej struktury danych tak szybko, jak to możliwe:
- Znajdź wszystkie (bezpośrednie i pośrednie) przodków jednego elementu (w tym rodziców, rodziców itp).
- Znajdź wszystkie (bezpośrednio) dzieci jednego elementu.
myślałem [(String,[String])]
gdzie każda para ma jeden element wykresu składającej się z jej nazwą (String
) oraz listę ciągów ([String]
) zawierającego nazwiska rodziców (bezpośrednich) tego elementu. Problem z tą implementacją polega na tym, że trudno jest wykonać drugie zadanie.
Można również ponownie użyć [(String,[String])]
, podczas gdy lista ciągów znaków ([String]
) zawiera nazwy dzieci (bezpośrednich). Ale tutaj znowu ciężko jest wykonać pierwsze zadanie.
Co mogę zrobić? Jakie są alternatywy? Który sposób jest najbardziej efektywny?
EDYCJA: Jeszcze jedna uwaga: chciałbym również, aby łatwo ją zdefiniować. Muszę zdefiniować instancję tego typu danych osobiście "ręcznie", więc chciałbym uniknąć niepotrzebnych powtórzeń.
'dane Rodzina = Ego {rodzice, dzieci :: [Ciąg]}; wpisz DAG = Map String Family'? Jeśli przechowujesz zarówno rodziców, jak i dzieci, obie operacje powinny być stosunkowo szybkie. –
Lub dwie mapy. Jeden od rodziców do dzieci, drugi od dzieci do rodziców. Wybierz najlepszą dla siebie drogę. – Adrian
Dodałem dodatkową uwagę w oryginalnym pytaniu, co utrudnia twoją sugestię. –