In verteilten Versionskontrollsystemen (wie Mercurial und Git ) müssen gerichtete azyklische Graphen (DAGs) effizient verglichen werden. Ich bin ein Mercurial-Entwickler, und wir wären sehr daran interessiert, etwas über theoretische Arbeiten zu erfahren, in denen die Zeit- und Netzwerkkomplexität des Vergleichs zweier DAGs erörtert wird.
Die fraglichen DAGs werden durch die aufgezeichneten Revisionen gebildet. Revisionen werden durch einen Hashwert eindeutig identifiziert. Jede Revision hängt von null (anfängliches Commit), einem (normales Commit) oder mehreren (Merge Commit) der vorherigen Revisionen ab. Hier ist ein Beispiel , wo Revisionen a
zu e
gemacht wurden einer nach dem sie:
a --- b --- c --- d --- e
Der Diagrammvergleich wird angezeigt, wenn jemand nur einen Teil des Verlaufs hat und den fehlenden Teil abrufen möchte. Stellen Sie sich vor ich hatte a
zu c
und machte x
und auf y
Basis von c
:
a --- b --- c --- x --- y
In Mercurial würde ich tun hg pull
und herunterladen d
und e
:
a --- b --- c --- x --- y
\
d --- e
Das Ziel besteht darin, zu identifizieren d
und e
effizient zu sein, wenn der Graph viele (beispielsweise mehr als 100.000) Knoten hat. Effizienz betrifft beides
- Netzwerkkomplexität: Die Anzahl der übertragenen Bytes und die Anzahl der erforderlichen Netzwerk-Roundtrips
- Zeitkomplexität: Der Rechenaufwand der beiden Server, die Änderungssätze austauschen
Typische Diagramme sind schmal mit wenigen parallelen Spuren wie oben. Es wird normalerweise auch nur eine Handvoll Blattknoten (wir nennen sie in Mercurial Köpfe) wie e
und y
darüber geben. Wenn ein zentraler Server verwendet wird, verfügt der Client häufig über einige Änderungssätze, die sich nicht auf dem Server befinden, während der Server über 100 neue Änderungssätze für die Clients verfügen kann, je nachdem, wer den Client vor langer Zeit zuletzt vom Server abgerufen hat . Eine asymmetrische Lösung wird bevorzugt: Ein zentraler Server sollte im Vergleich zu seinen Clients nur wenig rechnen.