Nei sistemi di controllo di versione distribuito (come Mercurial e Git ) è necessario confrontare in modo efficiente i grafici aciclici diretti (DAG). Sono uno sviluppatore Mercurial e saremmo molto interessati a conoscere il lavoro teorico che discute della complessità temporale e di rete del confronto tra due DAG.
I DAG in questione sono formati dalle revisioni registrate. Le revisioni sono identificate in modo univoco da un valore hash. Ogni revisione dipende da zero (commit iniziale), uno (commit normale) o più (commit di unione) delle revisioni precedenti. Ecco un esempio in cui le revisioni a
per e
stati fatti uno dopo l'altro:
a --- b --- c --- d --- e
Il confronto dei grafici viene visualizzato quando qualcuno ha solo una parte della cronologia e desidera recuperare la parte mancante. Immaginate Ho dovuto a
alla c
e feci x
e y
basandomi su c
:
a --- b --- c --- x --- y
In Mercurial, farei hg pull
e scaricare d
e e
:
a --- b --- c --- x --- y
\
d --- e
L'obiettivo è quello di identificare d
e e
in modo efficiente quando il grafico ha molti (diciamo, più di 100.000) nodi. L'efficienza riguarda entrambi
- complessità della rete: il numero di byte trasferiti e il numero di round trip della rete necessari
- complessità temporale: la quantità di calcolo effettuata dai due server che scambiano i changeset
I grafici tipici saranno stretti con poche tracce parallele come sopra. Di solito ci saranno solo una manciata di nodi foglia (li chiamiamo teste in Mercurial) come e
e y
sopra. Infine, quando viene utilizzato un server centrale, il client avrà spesso un paio di changeset che non si trovano sul server, mentre il server può avere oltre 100 nuovi changeset per i client, a seconda di chi molto tempo fa il client ha estratto l'ultima volta dal server . È preferibile una soluzione asimmetrica : un server centralizzato dovrebbe fare pochi calcoli rispetto ai suoi client.