에서는 분산 버전 관리 시스템 (예 의욕 및 힘내 ) 효율적 관한 비교할 비순환 그래프 (DAG에) 할 필요가있다. 저는 Mercurial 개발자이며 두 DAG를 비교하는 시간 및 네트워크 복잡성을 논의하는 이론적 작업에 대해 매우 관심이 있습니다.
해당 DAG는 기록 된 개정으로 구성됩니다. 리비전은 해시 값으로 고유하게 식별됩니다. 각 개정은 이전 개정의 0 (초기 커밋), 하나 (정상 커밋) 또는 그 이상 (병합 커밋)에 따라 달라집니다. 다음 개정 예는 a
하기 e
각각 차례로 만들었다는 :
a --- b --- c --- d --- e
누군가가 히스토리의 일부만 가지고 누락 된 부분을 검색하려고 할 때 그래프 비교가 그림에 나타납니다. 내가 가진 상상 a
을 c
하고 만든 x
및 y
기반으로 c
:
a --- b --- c --- x --- y
의욕에, 나는 할 것이다 hg pull
및 다운로드 d
및 e
:
a --- b --- c --- x --- y
\
d --- e
목표는 그래프에 많은 노드 (예 : 100,000 개 이상)가있을 때 를 식별 d
하고 e
효율적으로 만드는 것입니다. 효율성 문제
- 네트워크 복잡성 : 전송 된 바이트 수와 필요한 네트워크 왕복 수
- 시간 복잡성 : 변경 세트를 교환하는 두 서버가 수행 한 계산량
일반적인 그래프는 위와 같이 몇 개의 병렬 트랙으로 좁아집니다. 또한 일반적으로 같은 (우리가 의욕에 그 머리를 호출) 잎 노드의 소수가있을 것입니다 e
및 y
위. 마지막으로 중앙 서버를 사용하는 경우 클라이언트는 종종 서버에없는 몇 개의 변경 세트를 가지게되며, 클라이언트가 서버에서 마지막으로 가져온 사람에 따라 서버는 클라이언트에 대해 100 개 이상의 새로운 변경 세트를 가질 수 있습니다. . 비대칭 용액이 바람직하다 : 중앙 서버는 클라이언트에 비해 적은 계산을 수행한다.