Tính thành phần quan hệ trong


7

Định nghĩa: Đặt là một DAG không có vòng lặp và và là đồ thị.G= =(V,E)XGYG

Input: . Đầu ra: Thành phần quan hệ Thành phần quan hệ trong .X,Y XYO(|E||V|)

  • Trường hợp 1:. Hai vòng lặp cho và : Runtime .|E||V|E(X)E(Y)O(|E|2)O(|E||V|)
  • Trường hợp 2:|V||E|
    1. Vẽ biểu đồ : . Chúng tôi gọi các cạnh từ đen và từ đỏ.(V(G),E(X)E(Y))(O(|V|)+O(|2E|)))E(X)E(Y)
    2. Sắp xếp theo cấu trúc liên kết (Kahn: ). Đặt mức đầu tiên là và các cạnh đi từ cấp độ lên cấp độ cao hơn.O(|V|)+O(|E|)0
    3. Vẽ biểu đồ này hai lần.
    4. Trong bản sao đầu tiên, xóa mọi cạnh màu đỏ bắt đầu ở mức chẵn và mọi cạnh màu đen bắt đầu ở mức lẻ: .O(E)
    5. Trong bản sao thứ hai, xóa mọi "chẵn đen" và "lẻ đỏ": .O(E)
    6. Đối với bản sao đầu tiên:
      • cho tất cả các nút trên cấpu2i
      • cho tất cả các nút trên cấpv2i+1
      • cạnh báo cáo (Thời gian chạy(u,v)O(V2)O(EV)).
    7. Đối với bản sao thứ hai: Tương tự cho "2i+1".
    8. Liên kết các nút được báo cáo, loại bỏ các bản sao O(V2)<=O(EV) (Tôi hy vọng biểu diễn đồ thị cho phép điều này).

Một số bạn có thể vui lòng xem qua thuật toán của tôi và kiểm tra xem

  • đúng rồi
  • nó là trong O(|E||V|)

Nếu nó đúng, thuật toán của tôi đã "tồn tại" chưa? Nếu không, bạn có thể cung cấp một sự thay thế? Tôi sẽ chấp nhận câu trả lời đầu tiên, nhưng hãy ủng hộ nếu một số người khác rất tốt để kiểm tra.

EDIT: Bước 6 Có vẻ là trong O(E2)đôi khi. Tôi ước điều này không thành sự thật. Có ai có một thuật toán làm việc?

Câu trả lời:


4

Vấn đề là ở Bước 6 (theo hiểu biết của tôi).

Về cơ bản, ý tưởng của bạn là kiểm tra trình tự (bạn,w)(w,v) liệu (bạn,w)E(X)(w,v)E(Y). Sự sắp xếp tôpô là chính xác, vì trong các trình tự như vậy, hai cạnh phải nằm sau nhau.

Một cạnh (bạn,w) là màu đen nếu nó thuộc về E(X). Một cạnh(w,v) là màu đỏ nếu nó thuộc về E(Y). Một cạnh có thể có hai màu trong trường hợp này.

Một nút bạn sẽ kiểm tra từng người hàng xóm w [st (bạn,w) là màu đen] nếu w có cạnh màu đỏ (w,v)cho một trong những người hàng xóm của nó. Trong trường hợp này:ΣbạnVdeg(bạn).ΣwN(x)deg(w)= =Ôi(E2)

Từ những gì tôi hiểu: bạn đã thực hiện một số bộ lọc của một số cạnh không cần thiết (bước 4,5) - tuy nhiên có thể có trường hợp xấu nhất sẽ dẫn đến độ phức tạp cao hơn Ôi(E2).


Cảm ơn, bạn đã đúng! Tôi không thể báo cáo tất cả các cặp nút, tôi phải theo các cạnh. Hmm vâng tôi nghĩ điều này có thể dẫn đếnÔi(E2). Tôi nghĩ rằng thuật toán của tôi không thể thực hiện được :(
Julian

vậy điều đó có trả lời câu hỏi của bạn không?
AJed

Vâng, nhiều hay ít. Mong muốn ai đó sẽ tìm thấy một sự thay thế cho bước 6, nhưng bạn sẽ được chấp nhận.
Julian

6

Định lý 2.29 trên trang 60 của Lý thuyết phân tích cú pháp của Sippu và Soisalon-Soininen đưa ra một thuật toán cho điện toán (trong số các hoạt động khác về quan hệ) thành phần của hai mối quan hệ. Thuật toán chạy trongÔi(t(|V|+|E|)) thời gian, ở đâu tlà thời gian cần thiết để thực hiện các hoạt động hợp nhất hoặc gán trên các đỉnh. Kết quả của hoạt động này là một tập hợp các đỉnh trên mỗi đỉnh đại diện cho các lân cận của nó. Thuật toán này hoạt động trên các biểu đồ tùy ý, không chỉ các biểu đồ theo chu kỳ.


Trông thật tuyệt, mặc dù tôi không có quyền truy cập vào cuốn sách này, thậm chí từ trường đại học :(
Julian

@Johannes, hãy thử thư viện của trường đại học của bạn - Tôi cũng không có quyền truy cập vào cuốn sách và tôi cũng đã nhận được nó từ thư viện của trường đại học của tôi.
Alex ten Brink
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.