В распределенных системах контроля версий (таких как Mercurial и Git ) существует необходимость эффективного сравнения направленных ациклических графов (DAG). Я - разработчик Mercurial, и нам было бы очень интересно услышать о теоретической работе, в которой обсуждается сложность времени и сети при сравнении двух групп DAG.
Рассматриваемые группы обеспечения доступности баз данных формируются по зарегистрированным изменениям. Редакции однозначно идентифицируются хеш-значением. Каждая ревизия зависит от нуля (начальная фиксация), одной (нормальная фиксация) или более (фиксация слияния) предыдущих ревизий. Ниже приведен пример , где изменения a
к e
были сделаны один за другим:
a --- b --- c --- d --- e
Сравнение графиков входит в картину, когда кто-то имеет только часть истории и хочет извлечь недостающую часть. Представьте, что я должен a
был c
и сделал x
и y
на основе c
:
a --- b --- c --- x --- y
В Mercurial я бы сделал hg pull
и скачал d
и e
:
a --- b --- c --- x --- y
\
d --- e
Цель состоит в том, чтобы идентифицировать d
и e
эффективно, когда граф имеет много (скажем, более 100 000) узлов. Эффективность касается как
- сложность сети: количество переданных байтов и количество необходимых сетевых обходов
- временная сложность: объем вычислений, выполненных двумя серверами, которые обмениваются наборами изменений
Типичные графики будут узкими с несколькими параллельными дорожками, как указано выше. Также обычно будет только несколько конечных узлов (мы называем их головами в Mercurial), как e
и y
выше. Наконец, когда используется центральный сервер, у клиента часто будет несколько наборов изменений, которых нет на сервере, в то время как на сервере может быть более 100 новых наборов изменений для клиентов, в зависимости от того, кто давно клиент последний раз брал с сервера , Асимметричное решение является предпочтительным: централизованный сервер должен сделать небольшое вычисление по сравнению со своими клиентами.