分散バージョン管理システム(例えばMercurialのとGitの)効率的に有向非巡回グラフ(DAGの)を比較する必要があります。私はMercurialの開発者であり、2つのDAGを比較することの時間とネットワークの複雑さを議論する理論的な研究について非常に興味があります。
問題のDAGは、記録されたリビジョンによって形成されます。リビジョンは、ハッシュ値によって一意に識別されます。各リビジョンは、前のリビジョンのゼロ(初期コミット)、1(通常のコミット)、またはそれ以上(マージコミット)に依存します。ここではリビジョンが一例であるa
ためにe
、各次々に行われましたが。
a --- b --- c --- d --- e
グラフの比較は、誰かが履歴の一部しか持っておらず、欠落している部分を取得したいときに表示されます。私が持っていたと想像a
するc
と作られたx
とy
に基づいてc
:
a --- b --- c --- x --- y
Mercurialのでは、私はどうなるhg pull
とダウンロードd
とe
:
a --- b --- c --- x --- y
\
d --- e
目標は、グラフに多くの(たとえば、100,000を超える)ノードがある場合を識別しd
、e
効率的にすることです。効率は両方に関係します
- ネットワークの複雑さ:転送されたバイト数と必要なネットワーク往復回数
- 時間の複雑さ:変更セットを交換する2つのサーバーによって行われる計算の量
典型的なグラフは狭く、上記のような平行なトラックはほとんどありません。また、通常e
、y
上記のような少数のリーフノード(Mercurialではヘッドと呼びます)のみが存在します。最後に、中央サーバーを使用すると、クライアントにはサーバー上にないいくつかの変更セットが含まれることがありますが、サーバーは、クライアントが最後にサーバーから最後にプルした人に応じて、クライアント用に100以上の新しい変更セットを持つことができます。非対称溶液が好ましい:中央サーバは、クライアントに比べて少し計算を行う必要があります。