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 aper estati 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 aalla ce feci xe ybasandomi su c:
a --- b --- c --- x --- y
In Mercurial, farei hg pulle scaricare de e:
a --- b --- c --- x --- y
\
d --- e
L'obiettivo è quello di identificare de ein 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 ee ysopra. 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.