Mam problem z algorytmem zależności, zależność jest podobna do zależności maven, z wyjątkiem ścisłego zakresu wersji.Algorytm do rozwiązywania zależności zależnych od zakresu wersji
Na przykład:
component A, version 1 depends on: component B, version 1~3; and component C, version 2~3
component D, version 1 depends on: component B, version 2~4; and component C, version 1~2
Teraz chcę uzyskać zależnościami gdy chcę zainstalować składnik A, wersja 1 i składnik D, wersja 1. Ponieważ są to wszystko zależy od składnika B, C, więc potrzebuję poprawnego algorytmu dostać poprawną wersję B i C
Co więcej, może muszę uaktualnić składnik a i D. na przykład, teraz mam poniżej nowych wersjach:
component A, version 2 depends on: component B, version 3~5; and component C, version 4~5
component A, version 3 depends on: component B, version 6~7; and component C, version 4~5
component D, version 2 depends on: component B, version 3~4; and component C, version 3~4
Teraz potrzebuję algorytmu, aby uzyskać poprawną wersję A i D, do której mogę uaktualnić i wszystkie ich zależności. Jednym z problemów jest komponent A, wersja 3 i komponent D, wersja 2 ma konflikt zależności komponentu B
Czy istnieje algorytm rozwiązania tego problemu? Lub podobny (łatwiejszy) problem. Czy masz jakieś propozycje?
Ponieważ nie powinno być dużo danych, nie należy brać pod uwagę wydajności.
Z góry dziękuję!
Dla prostego rozwiązania, czy można użyć sortowania topologicznego? Możesz rozpocząć od zbudowania wykresu, w którym każdy węzeł to {node id, version no}. Następnie wykonaj sortowanie topologiczne, aby uzyskać kolejność zależności. – trequartista
Dziękuję, ale w moim przypadku zależność wystarczy, aby rozwiązać jedną wersję składnika, więc jeśli zbudujesz wykres, dla węzłów o tym samym identyfikatorze węzła, lista wyjściowa musi wyprowadzać tylko jeden węzeł; a dla niektórych węzłów ich wersja może być konfliktem, więc taki węzeł nigdy nie może znajdować się na liście wyników. Jak rozwiązać ten problem? – Xilang
Nie chodzi o to, co miałem na myśli, ponieważ każdy węzeł ma zarówno identyfikator węzła, jak i wersję. to znaczy. {Komponent A, wersja 1} i {Komponent A, wersja 2} to inne węzły. Na przykład: – trequartista