在分布式版本控制系统(例如Mercurial和Git)中,需要有效地比较有向无环图(DAG)。我是一名Mercurial开发人员,对于听到有关讨论比较两个DAG的时间和网络复杂性的理论工作,我们将非常感兴趣。
有问题的DAG由记录的修订构成。修订由哈希值唯一标识。每个修订依赖于先前修订的零(初始提交),一个(普通提交)或多个(合并提交)。这是一个示例,一个接一个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
有效地进行识别。效率兼顾
- 网络复杂度:传输的字节数和所需的网络往返数
- 时间复杂度:交换变更集的两个服务器完成的计算量
典型的图形将很狭窄,几乎没有像上述的平行轨迹。还有通常只有叶节点少数的(我们称之为水银他们的头),如e
与y
以上。最后,当使用中央服务器时,客户端通常会有几个不在服务器上的变更集,而服务器可以为客户端提供100多个新变更集,具体取决于客户端上一次从服务器上拉出的是谁。一个非对称解决方案是首选:集中式服务器应该比较给客户做一点计算。