Thuật toán tương tự tổ tiên chung thấp nhất cho biểu đồ


7

Tôi đang làm việc trên một hệ thống loại và gặp phải một vấn đề có vẻ giống với tổ tiên chung thấp nhất. Đưa ra hai loại, tôi cần tìm chuỗi chuyển đổi nhỏ nhất sẽ dẫn đến cùng loại mục tiêu. Nếu tôi có một loại cây đơn giản, tôi biết làm thế nào để có được kết quả, nhưng thật không may, tôi có một cấu trúc đồ thị phức tạp hơn một chút.

Biểu đồ đó có một vài điểm chính. Nó là đơn hướng và không có vòng lặp nào được hình thành. Do số lượng không giới hạn của các loại tuy nhiên nó không thể được sản xuất tĩnh. Khoảng cách của một con đường nói chung là khá thấp. Nó "cảm thấy" giống như một cái cây với một loạt các cạnh tắt.

Ban đầu tôi nhìn vào tổ tiên chung thấp nhất, nhưng nó chủ yếu được mô tả như một thuật toán cây. Tôi vẫn chưa từ bỏ hy vọng rằng tôi có thể thích nghi với nó. Khả năng khác sẽ là một thuật toán tìm đường dẫn chung hơn.

Tôi hy vọng ai đó đã nhìn thấy vấn đề này trước đây, hoặc một vấn đề tương tự, và có thể cho tôi một số tài liệu tham khảo về cách tiếp cận nó. Dường như đủ quen thuộc để tôi cho rằng một cái gì đó phải tồn tại và tôi chỉ đang tìm kiếm các thuật ngữ / tên sai.


Đây là nỗ lực của tôi để mô tả điều này chính thức hơn.

Đặt biểu đồ sao cho mỗi đỉnh có một tập hợp các cạnh đi . Lưu ý, vì biểu đồ là động, có thể là vô hạn, không có cách nào để xây dựng biểu mẫu cho toàn bộ biểu đồ.G={V}V={E=Vx}G={V,E=(Vx,Vy)}

Một đường dẫn được hình thành từ một đỉnh bằng cách theo bất kỳ cạnh nào có sẵn từ nút đó. . Độ dài của đường dẫn này bằng với số đỉnh trong chuỗi. Không có chu kỳ có thể. Tập hợp tất cả các đường dẫn giữa hai nút được biểu thị là .Pnmx=Vn,...,VmPnm={Vn,...,Vm}

Lưu ý rằng có thể được xác định là trống trong một số bước hữu hạn. Việc liệt kê toàn bộ bộ là không thực tế.PnmPnm

Vấn đề là tìm đường đi ngắn nhất từ ​​hai đỉnh đến đỉnh thứ ba. Nghĩa là, đã cho , tìm sao cho các đường dẫn và tồn tại và là tối thiểu.Va,VbVcPacxPbcylength(Pacx)+length(Pbcy)


1
Một đồ thị có hướng không có chu kỳ định hướng được gọi là DAG. Trong trường hợp của bạn, bạn nói rằng biểu đồ không chứa các vòng lặp. Nó có thể chứa chu kỳ?
Yuval Filmus 18/03/13

1
Ngoài ra, bạn có thể nêu vấn đề của bạn chính thức hơn? Đây là một khả năng Cho , bạn đang tìm kiếm một nút thu nhỏ , trong đó là khoảng cách được định hướng. Ngoài ra, được cung cấp một nút, bạn có thể liệt kê tất cả các cạnh chỉ vào nó, nói cách khác, tất cả các tổ tiên ngay lập tức? x,yzd(z,x)+d(z,y)d
Yuval Filmus 18/03/13

1
Tôi đã giả sử người ta phải giảm thiểu . Có phải tổ tiên thấp nhất của bạn tồn tại trong mọi trường hợp (ví dụ: Có "gốc" như ) không? maxd(z,x),d(z,y)java.lang.Object
frafl 18/03/13

Đã chỉnh sửa. Có một nút, vâng, bạn có thể liệt kê tất cả tổ tiên ngay lập tức của nó. Không, không có gốc chung và không đảm bảo rằng hai loại có tổ tiên chung.
edA-qa mort-ora-y

1
Lưu ý rằng "bạn có thể liệt kê tất cả tổ tiên trực tiếp của nó" không ngụ ý rằng số lượng tổ tiên ngay lập tức là hữu hạn, đó có thể là những gì bạn muốn nói. Nếu quy tắc "tìm đường đi ngắn nhất" chỉ nhằm mục đích như một cách quảng cáo để giải quyết sự mơ hồ trong hệ thống loại, thì nó có thể có một số thuộc tính không mong muốn. Mặt khác, bạn có thể chỉ ra rằng nó không có các đặc tính không mong muốn nếu được sử dụng một cách thích hợp, đó sẽ là một kết quả thú vị. Mặt khác, "giới hạn trên thấp nhất" trong poset sẽ là cách giải thích tự nhiên hơn về "tổ tiên chung thấp nhất".
Thomas Klimpel

Câu trả lời:


5

Nếu tổ tiên chung thấp nhất của hai loại luôn tồn tại và là duy nhất, thì cấu trúc của bạn là một bán kết. Tính toán tổ tiên chung thấp nhất là có thể, nhưng độ phức tạp thời gian chạy tồi tệ nhất không tốt như tôi mong đợi bằng trực giác. Tôi đã hỏi một câu hỏi liên quan một thời gian trước đây, nhưng quá lười để viết câu trả lời sau khi tôi tìm thấy giải pháp có liên quan trong "tài liệu". Tôi vừa mới viết câu trả lời, và nó bắt đầu như sau:

Đây blogpost trên lý thuyết mạng có một phần tài liệu tham khảo hữu ích, trong đó có những người khác "Lattice thuyết với ứng dụng" bởi Vijay K. Garg. Chương 2 "Đại diện cho các vị trí" mô tả một số cấu trúc dữ liệu để biểu diễn các vị trí và thảo luận về cách tính toán nối (x, y) bằng cách sử dụng cấu trúc dữ liệu đó.

Đây là phần có liên quan từ chương 2.3.1:

Bây giờ chúng tôi đưa ra thuật toán để tính toán nối của hai phần tử và . Thuật toán trả về nếu tham gia không tồn tại. Trước tiên chúng tôi cho rằng chúng tôi đang sử dụng quan hệ bìa. Để tính toán , chúng tôi tiến hành như sau:O(n+|e|)xynulljoin(x,y)

  • Bước 0: Tô màu tất cả các nút màu trắng.
  • Bước 1: Tô màu tất cả các nút có thể truy cập từ là màu xám. Điều này có thể được thực hiện bởi BFS hoặc DFS bắt đầu từ nút .xx
  • Bước 2: Thực hiện BFS / DFS từ nút . Màu tất cả các nút màu xám đạt đến màu đen.y
  • Bước 3: Bây giờ chúng tôi xác định cho mỗi nút đen , số lượng nút đen trỏ đến . Gọi số này cho bất kỳ nút . Bước này có thể được thực hiện trong bằng cách đi qua danh sách kề của tất cả các nút đen và duy trì số tích lũy cho mảng .zzinBlack[z]zO(n+|e|)inBlack
  • Bước 4: Chúng tôi đếm số nút đen với bằng . Nếu có chính xác một nút, chúng tôi trả lại nút đó làm câu trả lời. Nếu không, chúng tôi trả về .zinBlack[z]0null

Câu trả lời này diễn giải "tổ tiên chung thấp nhất" đối với thứ tự từng phần được xác định bởi DAG. Đối với việc đọc liên quan đến độ dài đường dẫn, chúng ta không còn có một nửa mạng, nhưng thuật toán vẫn có thể được điều chỉnh bằng cách chỉ sử dụng BFS và xen kẽ cả hai tìm kiếm một cách thích hợp. Việc giải thích poset vẫn hữu ích để xác định xem có tồn tại ít nhất một ứng cử viên "tổ tiên chung thấp nhất" hay không.
Thomas Klimpel
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.