İçinde dağıtılmış sürüm kontrolü sistemleri (örneğin, bir Mercurial ve Git ) verimli bir şekilde yönlendirilmiş karşılaştırma asiklik grafikler (DAG'ler) için bir ihtiyaç vardır. Ben bir Mercurial geliştiricisiyim ve iki DAG'ı karşılaştırmanın zamanını ve ağ karmaşıklığını tartışan teorik çalışmaları duymakla çok ilgileniriz.
Söz konusu DAG'lar kaydedilen revizyonlardan oluşur. Revizyonlar bir karma değeri ile benzersiz bir şekilde tanımlanır. Her revizyon, önceki revizyonların sıfırına (ilk taahhüt), bir (normal taahhüt) veya daha fazlasına (birleştirme taahhüdü) bağlıdır. İşte revizyonları bir örnek a
için e
birbirlerine ardına yapılmıştır:
a --- b --- c --- d --- e
Grafik karşılaştırması, biri tarihin sadece bir kısmına sahip olduğunda ve eksik kısmı almak istediğinde resme gelir. Ben hayal a
etmek c
ve yapılan x
ve y
esas c
:
a --- b --- c --- x --- y
Mercurial, ben yapacağını hg pull
ve indirmek d
ve e
:
a --- b --- c --- x --- y
\
d --- e
Amaç, grafiğin çok sayıda (örneğin 100.000'den fazla) düğüme sahip olduğunu tanımlamak d
ve e
verimli bir şekilde yapmaktır. Verimlilik her ikisini de ilgilendirir
- ağ karmaşıklığı: aktarılan bayt sayısı ve gereken ağ gidiş-dönüşlerinin sayısı
- zaman karmaşıklığı: Değişiklik kümelerini değiştiren iki sunucu tarafından yapılan hesaplama miktarı
Tipik grafikler, yukarıdaki gibi birkaç paralel iz ile dar olacaktır. Ayrıca tipik olarak sadece bir avuç yaprak düğümü olacaktır (bunlara Mercurial'ta başları diyoruz) e
ve y
yukarıda. Son olarak, merkezi bir sunucu kullanıldığında, istemcinin sunucuda olmayan birkaç değişiklik kümesi olurken, istemcinin sunucudan en son ne zaman önce çekildiğine bağlı olarak, sunucu istemciler için 100'den fazla yeni değişiklik kümesine sahip olabilir. . Bir asimetrik bir çözüm tercih edilir: merkezi sunucu müşterilerine kıyasla çok az hesaplama yapmalıdır.