Trong các hệ thống kiểm soát phiên bản phân tán (như Mercurial và Git ), cần phải so sánh hiệu quả các đồ thị chu kỳ có hướng (DAG). Tôi là một nhà phát triển Mercurial và chúng tôi sẽ rất thích nghe về công việc lý thuyết thảo luận về sự phức tạp về thời gian và mạng lưới của việc so sánh hai DAG.
Các DAG trong câu hỏi được hình thành bởi các phiên bản được ghi lại. Các sửa đổi được xác định duy nhất bởi một giá trị băm. Mỗi phiên bản phụ thuộc vào số không (cam kết ban đầu), một (cam kết bình thường) trở lên (cam kết hợp nhất) của các phiên bản trước. Dưới đây là một ví dụ trong đó sửa đổi a
để e
được thực hiện lần lượt nhau:
a --- b --- c --- d --- e
So sánh biểu đồ đi vào hình ảnh khi ai đó chỉ có một phần của lịch sử và muốn lấy lại phần còn thiếu. Hãy tưởng tượng tôi đã a
đến c
và làm x
và y
dựa trên c
:
a --- b --- c --- x --- y
Trong Mercurial, tôi sẽ làm hg pull
và tải xuống d
và e
:
a --- b --- c --- x --- y
\
d --- e
Mục tiêu là xác định d
và e
hiệu quả khi biểu đồ có nhiều nút (giả sử, hơn 100.000). Hiệu quả liên quan đến cả
- độ phức tạp của mạng: số byte được truyền và số lượng chuyến đi khứ hồi mạng cần thiết
- độ phức tạp thời gian: số lượng tính toán được thực hiện bởi hai máy chủ trao đổi thay đổi
Các biểu đồ điển hình sẽ được thu hẹp với một vài rãnh song song như trên. Thông thường cũng sẽ chỉ có một số ít các nút lá (chúng tôi gọi chúng là các đầu trong Mercurial) như thế e
và y
ở trên. Cuối cùng, khi một máy chủ trung tâm được sử dụng, máy khách thường sẽ có một vài thay đổi không có trên máy chủ, trong khi máy chủ có thể có hơn 100 thay đổi mới cho các máy khách, tùy thuộc vào việc máy khách được kéo từ máy chủ từ lâu . Một giải pháp bất đối xứng được ưa thích: một máy chủ tập trung nên thực hiện ít tính toán so với các máy khách của nó.