Là thuật toán được thực hiện bởi git bisect tối ưu?


8

Đặt là DAG. Chúng tôi biết rằng một số nút trong là "xấu", trong khi các nút khác là "tốt"; hậu duệ của một nút xấu là xấu trong khi tổ tiên của một nút tốt là tốt. Chúng tôi cũng biết rằng các nút xấu có một phần tử tối thiểu duy nhất trong G mà chúng tôi muốn tìm truy vấn càng ít nút càng tốt với các truy vấn thuộc loại "Bạn tốt hay xấu?".GGGG

Vấn đề này được giải quyết trong Git, hệ thống kiểm soát phiên bản phổ biến, bằng lệnh git-bisect, giúp lập trình viên tìm ra cam kết đầu tiên trong đó một lỗi được đưa ra.

Khi bắt đầu, thuật toán được thực hiện bởi Git giả định phải biết một cam kết xấu duy nhất và một hoặc nhiều cam kết tốt. Ở mỗi bước thực hiện, thuật toán tìm thấy một cam kết sử dụng các bước sau (lấy từ đây ):

  1. Chỉ giữ lại các cam kết rằng:

    a) là tổ tiên của cam kết xấu (bao gồm cả chính cam kết xấu) và

    b) không phải là tổ tiên của một cam kết tốt (không bao gồm các cam kết tốt).

  2. Bắt đầu từ kết thúc tốt đẹp của biểu đồ kết quả, liên kết với mỗi cam kết số lượng tổ tiên mà nó có cộng với một.

  3. Liên kết với mỗi cam kết min(X,NX) , trong đó X là giá trị được liên kết với cam kết trong bước 2 và N là tổng số lần xác nhận trong biểu đồ (sau khi giảm ở bước 1).

  4. Điểm chia nhỏ tốt nhất là cam kết có số lượng liên kết cao nhất.

Thuật toán này về cơ bản là tìm ra cam kết đạt được "trường hợp tốt nhất tồi tệ nhất": trên thực tế, là số nút trong DAG ở lần lặp tiếp theo trong trường hợp tốt nhất, do đó là trường hợp tốt nhất tồi tệ nhất.min(X,NX)maxmin(X,NX)

Tôi tự hỏi:

  • Liệu nó có khác biệt gì không nếu chúng ta chọn "trường hợp xấu nhất tốt nhất", nghĩa là nút đạt được ?minmax(X,NX)
  • Là thuật toán này trường hợp xấu nhất tối ưu?

EDIT: Tôi đã nhận thấy rằng vấn đề này có ràng buộc . Hãy xem xét DAG được hình thành bởi một nút với cha mẹ được gọi là . Nếu chúng ta biết rằng là xấu thì chúng ta phải kiểm tra từng cha mẹ để xem họ có phải là nút xấu tối thiểu không.Ω(N)bN1g1,,gN1b

EDIT 2: Cái trước thực sự là một ràng buộc , trong đó là chiều rộng của poset. Một thuật toán thay thế cho vấn đề này được đưa ra trong câu trả lời này trên cstheory.stackexchange sử dụng các truy vấn .Ω(w)wO(wlogn)


1
Chúng tôi không thể trả lời liệu nó có tối ưu hay không mà không xác định ý nghĩa của chúng tôi là tối ưu. Cụ thể, có phải chúng ta đang nói về sự phức tạp trong trường hợp xấu nhất? Trường hợp trung bình phức tạp? Khối lượng công việc điển hình là gì? (Biểu đồ điển hình trông như thế nào? Phân phối trên biểu đồ là gì?) Những câu hỏi đó rất quan trọng trong thực tế, nhưng có thể không có câu trả lời phân tích rõ ràng hoặc đơn giản.
DW

Tôi chủ yếu quan tâm đến sự phức tạp trong trường hợp xấu nhất. Tôi đã thử xây dựng các trường hợp trong đó thuật toán tham lam có quá nhiều lựa chọn sai, nhưng không thể làm như vậy. Tất nhiên, biểu đồ git điển hình có rất nhiều cấu trúc (tôi mong đợi một chuỗi dài trong đó phần lớn cam kết: nhánh chính), nhưng có lẽ quá khó để mô tả.
Jacopo Notarstefano

1
Tôi không thực sự hiểu những gì bạn đang hỏi, nhưng bất đẳng thức sau có thể hữu ích: Đối với bất kỳ hàm nào của hai biến , luôn luôn là trường hợp . Xem ví dụ: math.stackexchange.com/a/186722/3060max x min y f ( x , y ) min x max y f ( x , y )fmaxxminyf(x,y)minxmaxyf(x,y)
Nick Alger

Câu trả lời:


5

Đây là một số trực giác cho những gì và đang làm. Tập trung vào một cam kết cụ thể . Giả sử chúng tôi kiểm tra và phân loại nó là "tốt" hoặc "xấu". Cho đến khi chúng tôi kiểm tra nó, chúng tôi không biết liệu nó tốt hay xấu, nhưng chúng tôi có thể dự đoán trước đồ thị sẽ nhỏ hơn bao nhiêu trong mỗi hai trường hợp đó. Cụ thể, là số lần xác nhận sẽ bị cắt bớt nếu cam kết hóa ra là tốt và là số lần cam kết sẽ bị cắt nếu cam kết trở nên xấu.XNccXcNXc

Do đó, giá trị là giới hạn thấp hơn về số lượng cam kết chúng tôi sẽ có thể cắt giảm trong bước tiếp theo, bất kể thử nghiệm diễn ra như thế nào. Ý tưởng của thuật toán Git là tối đa hóa số liệu này. Nói cách khác, Git chọn một ngưỡng càng lớn càng tốt và cam kết để kiểm tra tiếp theo, để Git có thể chắc chắn rằng nó sẽ có thể cắt giảm ít nhất cam kết trong bước tiếp theo.min(X,NX)tct

Nếu chúng ta không có thông tin về việc mỗi cam kết có khả năng trở nên tốt hay xấu, thì cũng có khả năng là tốt hay xấu, thì đây có vẻ là một lựa chọn tối ưu cục bộ. Do đó, thuật toán Git là một thuật toán tham lam.

Là thuật toán Git tối ưu toàn cầu? Điều đó sẽ phụ thuộc vào định nghĩa "tối ưu" và (có thể) về phân phối DAG mà người ta gặp trong thực tế. Có lẽ không có đặc điểm đơn giản nào về phân phối xác suất trên các DAG mà người ta gặp trong thực tế, vì vậy tôi hy vọng có thể sẽ khó tìm được kết quả tối ưu cho vấn đề này.


2
Mặc dù đây là một lời giải thích thú vị, đây không phải là một câu trả lời cho câu hỏi của tôi, vì vậy tôi không thể chấp nhận nó.
Jacopo Notarstefano 17/03/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.