Số lượng con cháu của mỗi nút trong DAG


8

1) Có thuật toán nào tốt hơn O (| E |. | V |) ngây thơ để tính số lượng con cháu của mỗi đỉnh trong một DAG không?

2) Có một thuật toán trực tuyến để làm như vậy không, giả sử rằng các nút được thêm từng cái một và kết nối với một tập hợp con không trống của các nút hiện có?

Bối cảnh: Tôi quan tâm đến trường hợp m = O (n), hàng triệu đỉnh, hàng chục triệu cạnh thông thường. Ngoài ra, đếm số lượng con cháu cũng bị chìm sẽ hữu ích.


Một cách tiếp cận xác suất sẽ là băm nhỏ, như một cách để biểu diễn tập hợp con cháu của mỗi nút. Sự kết hợp của cấu trúc băm min là không đáng kể, và tính chính xác của liên kết có thể được ước tính từ số lượng trùng khớp trong băm nhỏ.

Tuy nhiên, tôi không chắc sẽ cư xử tốt như thế nào khi tuyên truyền DAG, theo trực giác có vẻ như các lỗi sẽ kết hợp khá nhanh.


Rất liên quan: /cstheory/553/what-bound-can-be-put-on-counting-reachable-nodes-in-a-dag Và thực sự là một bản sao của: https: // cstheory.stackexchange.com/questions/18787/what-is-the-fastest-deterministic-alerskym-for-incremental-dag-reachability


Bạn đã thay đổi câu hỏi của bạn. O (n ^ 2 + m) cho kịch bản 1 có giúp bạn không?
Niklas B.

Nó sẽ không đủ nhanh nhưng tôi muốn nghe cách bạn làm điều đó.
Arthur B

Là outdegree của các nút của bạn giới hạn? Hay nói chung, bạn có một số thuộc tính của biểu đồ có thể giúp thiết kế một thuật toán nhanh hơn không? Theo trực giác, một DAG không đơn giản như một biểu đồ chung ở đây, bởi vì bạn có thể phân tách một biểu đồ chung thành các SCC tạo thành một DAG
Niklas B.

1
Tôi xin lỗi vì câu trả lời trước đây của tôi - điều đó chắc chắn sai!
templatetypedef

2
Tôi sẽ đề nghị bạn hỏi điều này trên CS.stackexchange.com. Trực giác của tôi là nó là một vấn đề khó hơn nó trông như thế. Nếu bạn khái quát nó cho vấn đề mà bạn có trọng lượng nút và muốn biết cho mỗi nút tổng trọng lượng có thể tiếp cận, thì ít nhất cũng khó như vấn đề tương tự đối với đồ thị chung do giảm SCC mà tôi đã đề cập. Nhưng có thể có một số kỹ thuật để tăng tốc tính toán cho loại biểu đồ bạn đang đối mặt
Niklas B.

Câu trả lời:


4
  1. Sắp xếp theo cấu trúc liên kết các nút trong DAG của bạn.
  2. Đối với mỗi nút N, thiết lập N.QueryCount = 0.
  3. Đối với mỗi nút N, theo thứ tự tôpô ngược:
    • Đặt N.Descendants = {N} U {C.Descendants | C in N.Children}.
    • Năng suất (N, N.Descendants.Count)từ thuật toán.
    • Nếu N.Parentstrống, bạn có thể xử lý N.Descendants.
    • Đối với mỗi Ctrong N.Children, tăng C.QueryCount. Nếu C.QueryCount == C.Parents.Count, bạn có thể loại bỏ C.Descendants.

Điều này tất nhiên là đắt tiền nếu độ nút của bạn lớn. Độ phức tạp tồi tệ nhất có thể không tốt hơn đáng kể so với "thuật toán ngây thơ" không xác định của bạn.

Vấn đề là đây là một vấn đề rất khó giải quyết. Giả sử có một DAG với hàng triệu nút, hàng triệu cạnh, v.v. Tôi chỉ cho bạn phần này của biểu đồ:

A--> B
 \-> C

Có bao nhiêu con cháu A? Số lượng con cháu Bcộng với số lượng con cháu Ctrừ đi số lượng con cháu chung của BC. Đó là thuật ngữ thứ ba tạo ra khó khăn. Bạn không thể biết số lượng con cháu của BC- bạn cũng cần biết con cháu là gì.


1
Đó dường như là O (n * m) ít nhất
Niklas B.

1
Và thuật toán ngây thơ sẽ thực hiện khả năng tiếp cận (DFS hoặc BFS) từ mọi nút
Niklas B.

@NiklasB. Nếu đặt union là O (1) thì đây là O (n + m). Tất nhiên, thiết lập union là không, nhưng nếu độ nút tương đối thấp thì nó sẽ hoạt động tốt về mặt sử dụng CPU và RAM. EDIT: Điều này không đúng, xin vui lòng bỏ qua.
Timothy Shields

1
Tôi không chắc lắm, ngay cả khi độ thấp có thể xảy ra rằng rất nhiều đỉnh có rất nhiều người kế vị. Đối với cây nhị phân không cân bằng (ví dụ chuỗi chuỗi), nó sẽ là O (n ^ 2) trừ khi bạn sử dụng liên kết theo trọng số (nhưng tôi không nghĩ rằng điều đó mang lại cho bạn rất nhiều cho trường hợp chung)
Niklas B .

@NiklasB. Ồ, đúng rồi, vì các Descendantsbộ sẽ có kích thước gần bằng O (n) gần cuối.
Timothy Shields

1

Liệt kê tất cả các hậu duệ của tất cả các đỉnh có thể tạo ra đầu ra có kích thước O(n²), ví dụ nếu biểu đồ là đồ thị tuyến tính thì đỉnh không có cạnh đến có n - 1hậu duệ, đỉnh sau n - 2, v.v.

Điều này để lại câu hỏi nếu bạn có thể xác định số lượng con cháu mà không liệt kê chúng. Tôi không thể đưa ra một bằng chứng nhưng tôi khá tự tin câu trả lời là không. Giả sử một đỉnh xcó con uvsau đó bạn phải tìm tính chính của giao điểm của các tập hợp con cháu uvnhưng không có gì bạn biết về tập hợp đó - uvkhông thể chia sẻ một hậu duệ hoặc chúng có thể có cùng một tập hợp con cháu .

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.