W rozproszonych systemach kontroli wersji (takich jak Mercurial i Git ) istnieje potrzeba skutecznego porównywania ukierunkowanych wykresów acyklicznych (DAG). Jestem programistą Mercurial i bardzo chcielibyśmy usłyszeć o pracy teoretycznej, która omawia złożoność czasową i sieciową porównywania dwóch DAG.
Wspomniane DAG są tworzone na podstawie zarejestrowanych zmian. Wersje są jednoznacznie identyfikowane przez wartość skrótu. Każda wersja zależy od zera (początkowe zatwierdzenie), jednej (normalne zatwierdzenie) lub więcej (scalanie zatwierdzenia) poprzednich wersji. Oto przykład, gdzie poprawki a
do e
wykonano jeden po drugim:
a --- b --- c --- d --- e
Porównanie wykresów pojawia się na zdjęciu, gdy ktoś ma tylko część historii i chce odzyskać brakującą część. Wyobraź sobie, miałem a
do c
i wykonana x
i y
na podstawie c
:
a --- b --- c --- x --- y
W Mercurial robiłbym hg pull
i pobierał d
i e
:
a --- b --- c --- x --- y
\
d --- e
Celem jest identyfikacja d
i e
wydajna identyfikacja, gdy wykres ma wiele (powiedzmy ponad 100 000) węzłów. Wydajność dotyczy obu
- złożoność sieci: liczba przesłanych bajtów i liczba potrzebnych podróży w obie strony do sieci
- złożoność czasu: ilość obliczeń wykonanych przez dwa serwery wymieniające zestawy zmian
Typowe wykresy będą wąskie z kilkoma równoległymi ścieżkami, jak powyżej. Zwykle będzie też tylko kilka węzłów liści (nazywamy je głowami w Mercurial) jak e
i y
wyżej. Wreszcie, gdy używany jest serwer centralny, klient często ma kilka zestawów zmian, których nie ma na serwerze, podczas gdy serwer może mieć ponad 100 nowych zestawów zmian dla klientów, w zależności od tego, kto dawno temu klient ostatnio ściągnął z serwera . Asymetryczne rozwiązanie jest preferowane: scentralizowany serwer powinien zrobić trochę obliczeń w stosunku do swoich klientów.