Dalam sistem kontrol versi terdistribusi (seperti Mercurial dan Git ) ada kebutuhan untuk secara efisien membandingkan grafik asiklik terarah (DAG). Saya adalah pengembang Mercurial, dan kami akan sangat tertarik untuk mendengar tentang karya teoretis yang membahas kompleksitas waktu dan jaringan membandingkan dua DAG.
DAGs yang dimaksud dibentuk oleh revisi yang direkam. Revisi diidentifikasi secara unik oleh nilai hash. Setiap revisi bergantung pada nol (komit awal), satu (komit normal) atau lebih (gabungan komit) dari revisi sebelumnya. Berikut adalah contoh di mana revisi a
ke e
dilakukan satu demi satu sama lain:
a --- b --- c --- d --- e
Perbandingan grafik muncul ketika seseorang hanya memiliki sebagian dari sejarah dan ingin mengambil bagian yang hilang. Bayangkan saya harus a
ke c
dan membuat x
dan y
berdasarkan c
:
a --- b --- c --- x --- y
Di Mercurial, saya akan melakukan hg pull
dan mengunduh d
dan e
:
a --- b --- c --- x --- y
\
d --- e
Tujuannya adalah untuk mengidentifikasi d
dan e
efisien ketika grafik memiliki banyak (katakanlah, lebih dari 100.000) node. Efisiensi menyangkut keduanya
- kompleksitas jaringan: jumlah byte yang ditransfer dan jumlah perjalanan pulang-pergi jaringan yang diperlukan
- kompleksitas waktu: jumlah perhitungan yang dilakukan oleh dua server yang bertukar perubahan
Grafik khas akan sempit dengan beberapa trek paralel seperti di atas. Ada juga akan biasanya hanya segelintir node daun (kami menyebutnya kepala di Mercurial) seperti e
dan y
di atas. Akhirnya, ketika server pusat digunakan, klien akan sering memiliki beberapa set perubahan yang tidak ada di server, sementara server dapat memiliki 100+ perubahan baru untuk klien, tergantung pada siapa yang dulu klien terakhir menarik dari server. . Sebuah solusi asimetris disukai: server terpusat harus melakukan sedikit perhitungan dibandingkan dengan klien.