Chỉ đạo công đoàn tìm


11

Hãy xem xét một đồ thị có hướng mà người ta có thể tự động thêm các cạnh và thực hiện một số truy vấn cụ thể.G

Ví dụ: khu rừng tách rời

Hãy xem xét các nhóm truy vấn sau:

arrow(u, v)
equiv(u, v)
find(u)

cái đầu tiên thêm một mũi tên vào biểu đồ, cái thứ hai quyết định nếu , cái cuối cùng tìm thấy một đại diện chính tắc của lớp tương đương , tức là một sao cho ngụ ý .u v r ( u ) u v r ( v ) = r ( u )uvuvr(u)uvr(v)=r(u)

Có một thuật toán nổi tiếng sử dụng cấu trúc dữ liệu rừng tập hợp rời rạc thực hiện các truy vấn này với độ phức tạp khấu hao gần như không đổi, cụ thể là . Lưu ý rằng trong trường hợp này được thực hiện bằng cách sử dụng .O(α(n))equivfind

Biến thể phức tạp hơn

Bây giờ tôi quan tâm đến một vấn đề phức tạp hơn trong đó các hướng dẫn quan trọng:

arrow(u, v)
confl(u, v)
find(u)

đầu tiên thêm một mũi tên , giây quyết định nếu có một nút có thể truy cập từ cả và , tức là . Người cuối cùng sẽ trả về một đối tượng sao cho ngụ ý trong đó nên dễ dàng tính toán. (Để, nói, tính toán ). Mục tiêu là tìm ra một cấu trúc dữ liệu tốt để các thao tác này được nhanh chóng.uvwuvuvr(u)uvr(u)r(v)confl

Chu kỳ

Biểu đồ có thể chứa chu kỳ.

Tôi không biết có cách nào để tính toán hiệu quả và tăng dần các thành phần được kết nối mạnh mẽ hay không, để chỉ xem xét các DAG cho vấn đề chính.

Tất nhiên tôi cũng sẽ đánh giá cao một giải pháp cho DAGs. Nó sẽ tương ứng với một tính toán gia tăng của tổ tiên ít phổ biến nhất.

Cách tiếp cận ngây thơ

Cấu trúc dữ liệu rừng tách rời không hữu ích ở đây, vì nó không quan tâm đến hướng của các cạnh. Lưu ý rằng không thể là một nút đơn, trong trường hợp đồ thị không hợp lưu.r(u)

Người ta có thể định nghĩa và để xác định là khi . Nhưng làm thế nào để tính toán này tăng dần?r(u)={vuv}S1S2S1S2

Có lẽ việc tính toán một tập lớn như vậy là không hữu ích, một tập nhỏ hơn sẽ thú vị hơn, như trong thuật toán tìm liên kết thông thường.

Câu trả lời:


3

( Chỉnh sửa : viết lại hoàn toàn câu trả lời của tôi bây giờ rằng sự hiểu biết của tôi về vấn đề này (tôi hy vọng) rõ ràng hơn.)

Có vẻ như vấn đề này có thể được giảm xuống để tăng dần việc xây dựng và cải thiện sự gần đúng của việc đóng cửa quá độ của biểu đồ, khi biểu đồ được xây dựng và tìm kiếm.

r(u)Tóm lại, là tập hợp của tất cả các nút có thể truy cập từ cả và cho mọi trong biểu đồ. (Tất nhiên, không phải tất cả các cặp sẽ nhất thiết phải có một nút có thể đạt được từ cả hai.) Không giống như trường hợp trong union-find, tập hợp này không thể được biểu diễn dưới dạng nút đại diện chính tắc trong biểu đồ, bởi vì có thể có các nút có thể truy cập được từ cả và , và từ cả và , dù sao cũng không thể truy cập được từ cả và .uvvuu,vuvuwvw

Giả sử bạn duy trì, với mỗi , một tập hợp các nút có thể truy cập từ (Tôi sẽ gọi đây là ). Các bộ này nhất thiết phải là một cấu trúc dữ liệu bổ sung cho mỗi nút, hoặc ít nhất, một bộ các cạnh "phím tắt" bổ sung trong biểu đồ. Nếu bạn không quan tâm đến việc giữ lại cấu trúc đã chỉ định của biểu đồ, sẽ không cần phân biệt giữa các cạnh này và các cạnh được chỉ định.uuR(u)

Tôi không có ý tưởng nào cho cấu trúc dữ liệu nắm bắt được điều này hiệu quả hơn trường hợp chung (ví dụ: vectơ bit hoặc bảng băm), nhưng bạn có thể cập nhật các bộ này tăng dần:

Mỗi khi bạn thêm một cạnh từ tới một số nút khác , bạn thiết lập .uvR(u)=R(u)R(v)

Thực hiện conflbằng cách thử đầu tiên ; nếu không trống, trả về true. Nhưng nếu nó trống rỗng, làm hai tìm kiếm chiều rộng đầu tiên song song từ và cho đến khi bạn hoặc cạn kiệt cả hai bộ có thể truy cập hoặc tìm một nút chung. Trong khi bạn làm điều này, cũng cập nhật và (và của tất cả các nút trung gian bạn tìm thấy) để bao gồm các nút có thể tiếp cận mà bạn tìm thấy. và nếu bạn tìm thấy một nút chung, đặt R (u) = R (v) = R (u) \ cup R (v) .R(u)R(v)R(u)R(v)R(u)R(v)R

find(u)chỉ trả về . Vấn đề là không được thực hiện hoàn toàn về mặt . Tôi không thấy nó có thể như thế nào trừ khi thuật toán không tăng dần (tức là tính toán trước tất cả các tập hợp của tất cả các nút với sự đóng cửa tạm thời của biểu đồ.) Tuy nhiên, cách tiếp cận gia tăng vẫn sẽ cho bạn khấu hao khá tốt chi phí, mặc dù tôi không biết nếu nó tiếp cận trực tiếp . (Có lẽ là không. Câu trả lời sai từ yêu cầu bạn khởi động hai BFS ngay cả khi các bộ của bạn đã bão hòa; điều này cũng có vẻ khó tránh khỏi trừ khi thuật toán được thực hiện không tăng dần.)R(u)conflfindRO(α(n))conflR

Điều này nghe có vẻ giống như nó có thể là một trường hợp đặc biệt của các phương pháp của La Poutré và van Leeuwen để duy trì sự đóng cửa quá độ của đồ thị .

Tôi nhận ra điều này không trả lời đầy đủ câu hỏi, nhưng có lẽ nó phục vụ để làm rõ nó và ai đó có nhiều kinh nghiệm hơn với thuật toán đồ thị có thể cung cấp cấu trúc dữ liệu tốt hơn để mã hóa các bộR


Cảm ơn câu trả lời của bạn, tôi hy vọng tôi đã làm rõ câu hỏi của mình hơn bây giờ: Tôi không quan tâm đến các thành phần được kết nối (nhưng CC mạnh mẽ thể hữu ích cho giải pháp cuối cùng); Tôi chưa có và này không thể là một nút trong DAG. r(u)r(u)
jmad

OK, rõ ràng hơn một chút. Dường như là một cách trừu tượng, tập hợp tất cả các nút có thể truy cập từ cả và cho mọi trong biểu đồ. Bộ này có thể là một tập hợp các "phím tắt" ngoài , tôi nghĩ, và sau đó nó bắt đầu giống như tính toán sự đóng cửa quá độ của khả năng tiếp cận trong biểu đồ. Tôi vẫn không thấy ngay tại sao điều này không thể được thực hiện tăng dần (nén các đường dẫn khi bạn tìm thấy chúng) mặc dù nó có thể sẽ cần nhiều bộ nhớ / công việc hơn (nhãn / cập nhật tất cả các cạnh "phím tắt" so với tìm liên kết. Điều này có nghĩa không? r(u)uv vuu
Chris Pressey

Giả sử đóng cửa bắc cầu là một cách công bằng để mô tả , điều này nghe có vẻ như có liên quan chặt chẽ: en.wikipedia.org/wiki/ Kẻr(u)
Chris Pressey

Tôi không nghĩ confl(u,v)nên hợp nhất và . Nó có thể sửa đổi chúng, nhưng điều đó đã được thực hiện bằng lệnh gọi , giống như trong phương thức rừng được thiết lập rời rạc. R(u)R(v)find
jmad

Bạn đúng rằng nó không nên hợp nhất chúng; Tôi sẽ chỉnh sửa câu trả lời. Nhưng các cuộc gọi để findthực sự không thể tính toán bất cứ điều gì hữu ích, bởi vì không có đối tượng duy nhất để "tìm" ngoại trừ , mà gần đúng. (Làm thế nào để biết những gì cần tìm, để thực hiện cập nhật? Nó chỉ được cung cấp cho nhưng thông tin trong có khả năng áp dụng cho mọi nút khác trong biểu đồ.)r(u)R(u)finduR(u)
Chris Pressey 16/12/12
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.