2013-06-17 30 views
10

Tập hợp các danh sách (A):(Set of) Danh sách bộ (s) Descartes sản phẩm() từ đồ thị tương ứng với tập hợp danh sách

{[a,b,d,f], 
[a,c,d,f], 
[a,b,e,f], 
[a,c,e,f]} 

đó a, b, c, d, đ và f là mặt hàng (không nhất thiết phải ký tự trong một từ), có thể là yếu tố như một đồ thị acyclic đạo (DAG, B, tất cả các cạnh điểm từ trái -> sang phải):

b-->d 
/\/\ 
a X f 
\/\/
    c-->e 

hoặc là sản phẩm Descartes của 4 bộ mặt hàng (C, trục được đặt tên):

{a} * {b,c} * {d, e} * {f} 

Ổi có số đẹp method để tạo bộ danh sách (A) từ danh sách các bộ (C).

Tôi đang thử một thuật toán chấp nhận đồ thị như B và trả về danh sách các trục như C (thực tế một hoặc nhiều hơn, xem ví dụ bên dưới), có thể được sử dụng với phương pháp ở trên để tạo một tập hợp danh sách như A.

Tuy nhiên, không đảm bảo rằng tập hợp danh sách sẽ là sản phẩm Descartes. Ví dụ:

{[a,b,d,f], 
-missing- 
[a,b,e,f], 
[a,c,e,f]} 

tương ứng với DAG:

b-->d 
/\ \ 
a \ f 
\ \/
    c-->e 

không thể được diễn tả như sản phẩm Descartes nhưng có thể được thể hiện dưới dạng 2:

{a}*{b}*{d,e}*{f} and {a}*{c}*{e}*{f} 

tương ứng với đồ thị:

 d 
    /\ 
a-->b f   and  a-->c-->e-->f 
    \/
     e 

Danh sách phải có mức độ liên quan nào đó (nghĩ: mẫu ngẫu nhiên của sản phẩm Cartesian rất lớn).

Lưu ý: danh sách các độ dài khác nhau không thể chia sẻ cùng một tập hợp các trục.

Có một thuật toán thực hiện điều này và tôi vừa không tìm được đúng thuật ngữ đúng không? Nếu không, chúng ta có thể tạo ra nó?

Độ phức tạp của thuật toán có thể là vấn đề vì tập hợp có thể có 10^2 danh sách và mỗi danh sách có thể có 10^2 mục, tức là biểu đồ khá lớn. Tôi có thể đảm bảo rằng các biểu đồ đầu vào sẽ có số lượng nút tối thiểu có thể đại diện cho tập các danh sách ... và các nút không phân nhánh được kết nối (a-> c-> e-> f) có thể được cuộn thành một đối tượng (acef).

PS. Tôi không nghĩ rằng điều này giống như Cartesian product of graphs, nhưng có thể có một số trùng lặp.

+0

Có thư viện biểu đồ (Tôi đang nghĩ về jgrapht ở đây, nhưng có thể có những người khác), bạn đã thử và chọc họ để xem họ có điều gì đó tiếp cận chưa? – fge

+0

@fge Tôi quen thuộc với JGraphT và nó không có một thuật toán như vậy. – Jon

+0

Tôi sẽ xem xét danh sách dưới dạng từ và cố định vị trí các hậu tố phổ biến dài nhất. –

Trả lời

1

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn đang theo dõi (A) và chỉ muốn (C) làm bước trung gian. Tạo số shortest paths thông qua biểu đồ bằng cách sử dụng ví dụ: Dijkstra's algorithm - điều này sẽ tạo tập hợp các danh sách (A). Nếu bạn vẫn cần sản phẩm Descartes tại thời điểm này (tức là nếu bạn không chỉ tạo ra sản phẩm Descartes như một bước trung gian để tạo ra (A)) thì việc tạo ra nó từ A (A) sẽ dễ dàng hơn nhiều so với (B).

+0

Có thể có nhiều hơn Integer.MAX_VALUE đường dẫn qua biểu đồ để không khả thi hoặc có thể tạo A hoàn toàn. Tôi muốn các trục có thể tạo ra một mẫu cân bằng của các đường đi qua biểu đồ (... có thể ngẫu nhiên đi trong trường hợp đó ... nhưng sẽ rất thú vị khi thử một thuật toán). – Jon

+0

@Jon Nếu bạn muốn các mẫu ngẫu nhiên đồng nhất, có một thuật toán thời gian tuyến tính đếm số lượng đường đi từ mỗi đỉnh và một thuật toán thời gian tuyến tính khác để sử dụng các số này để lấy mẫu. Nó không phải là một thuật toán phức tạp nhưng tôi không có thời gian để viết nó ngay bây giờ. –

+0

Thuật toán đếm đường dẫn được mô tả [tại đây] (http://stackoverflow.com/questions/5164719/number-of-paths-between-two-nodes-in-a-dag/5164820#5164820) –

Các vấn đề liên quan