En los sistemas de control de versiones distribuidas (como Mercurial y Git ) existe la necesidad de comparar eficientemente los gráficos acíclicos dirigidos (DAG). Soy un desarrollador de Mercurial, y estaríamos muy interesados en escuchar sobre el trabajo teórico que discute la complejidad del tiempo y la red de comparar dos DAG.
Los DAG en cuestión están formados por las revisiones registradas. Las revisiones se identifican de forma exclusiva por un valor hash. Cada revisión depende de cero (confirmación inicial), una (confirmación normal) o más (confirmación de fusión) de las revisiones anteriores. Aquí es un ejemplo donde las revisiones a
a e
se hicieron una después de la otra:
a --- b --- c --- d --- e
La comparación gráfica aparece cuando alguien tiene solo una parte del historial y quiere recuperar la parte que falta. Imagínese que tenía a
a c
e hice x
y y
basándonos en c
:
a --- b --- c --- x --- y
En Mercurial, haría hg pull
y descargaría d
y e
:
a --- b --- c --- x --- y
\
d --- e
El objetivo es identificar d
y e
eficientemente cuando el gráfico tiene muchos (digamos, más de 100,000) nodos. La eficiencia concierne a ambos
- complejidad de la red: la cantidad de bytes transferidos y la cantidad de viajes de ida y vuelta necesarios
- complejidad de tiempo: la cantidad de cómputo realizado por los dos servidores que intercambian conjuntos de cambios
Los gráficos típicos serán estrechos con pocas pistas paralelas como las anteriores. Por lo general, solo habrá un puñado de nodos hoja (los llamamos cabezas en Mercurial) como e
y por y
encima. Finalmente, cuando se usa un servidor central, el cliente a menudo tendrá un par de conjuntos de cambios que no están en el servidor, mientras que el servidor puede tener más de 100 conjuntos de cambios nuevos para los clientes, dependiendo de quién hace mucho tiempo que el cliente se retiró del servidor por última vez . Se prefiere una solución asimétrica : un servidor centralizado debería hacer pocos cálculos en comparación con sus clientes.