Có một thuật toán trực tuyến để theo dõi các thành phần trong một biểu đồ không thay đổi?


12

Vấn đề

Tôi có một biểu đồ vô hướng (có nhiều cạnh), sẽ thay đổi theo thời gian, các nút và cạnh có thể được chèn và xóa. Trên mỗi sửa đổi của biểu đồ, tôi phải cập nhật các thành phần được kết nối của biểu đồ này.

Tính chất

Các thuộc tính bổ sung là sẽ không có hai thành phần nào được kết nối lại. Rõ ràng, biểu đồ có thể có chu kỳ đến một lượng tùy ý (nếu không thì giải pháp sẽ là tầm thường). Nếu một cạnh không chứa nút , nó sẽ không bao giờ chấp nhận nút đó. Tuy nhiên, nếu , nó có thể thay đổi thành .ennene

Phương pháp tiếp cận

Tôi có hai cách tiếp cận có thể cho đến nay, nhưng như bạn sẽ thấy chúng thật kinh khủng:

Nhà nước chậm

Tôi có thể tìm kiếm (dfs / bfs) biểu đồ bắt đầu từ (các) phần tử được sửa đổi mỗi lần. Điều này bảo tồn không gian, nhưng chậm vì chúng ta có O (n + m) cho mỗi sửa đổi.

Cách tiếp cận nhanh (-er) (?)

Tôi có thể lưu trữ tất cả các đường dẫn có thể cho mỗi nút cho tất cả các nút có thể, nhưng nếu tôi thấy nó chính xác, điều này sẽ chiếm bộ nhớ O (n ^ 4). Nhưng tôi không chắc cách cải thiện thời gian chạy là như thế nào (nếu có một cái, vì tôi phải giữ thông tin cập nhật cho mọi nút trong cùng một thành phần).

Câu hỏi

Bạn có bất kỳ con trỏ, làm thế nào tôi có thể tìm hiểu thêm về vấn đề đó hoặc có lẽ một số thuật toán tôi có thể xây dựng?

Ghi chú

Nếu có một sự cải thiện lớn về thời gian chạy / bộ nhớ, tôi có thể sống với một giải pháp không tối ưu mà đôi khi nói hai thành phần là một, nhưng tất nhiên tôi sẽ thích một giải pháp tối ưu hơn.


Nếu tôi đọc đúng hai câu cuối của bạn trong "Thuộc tính", thì có vẻ như bạn chỉ quan tâm đến vấn đề giảm dần. Nếu vậy, hãy chắc chắn kiểm tra công việc của Thorup về kết nối động giảm dần. (Bạn có thể tìm thấy trích dẫn qua con trỏ của JeffE, phiên bản dành cho phiên bản hoàn toàn năng động của vấn đề.)
Maverick Woo

@Maverick Woo: Luôn có thể có các cạnh / nút mới. Tôi nghĩ tài sản cuối cùng không mạnh lắm, vì chính xác lý do này. Nó vẫn đủ điều kiện là giảm dần?
bitmask

Rất tiếc, tôi không biết làm thế nào tôi bỏ lỡ câu đầu tiên ... Xem "câu trả lời" bên dưới.
Maverick Woo

Câu trả lời:


16

Có một số cấu trúc dữ liệu hỗ trợ chèn cạnh, xóa cạnh và truy vấn kết nối (Hai đỉnh này có nằm trong cùng một thành phần được kết nối không?) Trong thời gian đa giác.


Điều này nghe có vẻ tuyệt vời, một khi tôi đã thông qua các bài báo, rất có thể tôi sẽ chấp nhận điều này.
bitmask

6

Tôi nghĩ rằng bạn đang tìm kiếm cái được gọi là thuật toán đồ thị động để phân tách thành phần được kết nối. Thuật toán của Holm, de Lichtenberg và Thorup [HLT01] đã khấu hao thời gian polylogarithmic trên mỗi cập nhật cạnh. Đã lâu rồi tôi mới xem xét vấn đề lần trước, nên có lẽ có nhiều tiến bộ gần đây.

[HLT01] Jacob Holm, Kristian de Lichtenberg và Mikkel Thorup. Các thuật toán xác định hoàn toàn động lực học đa logarit cho kết nối, cây bao trùm tối thiểu, 2 cạnh và hai mặt. Tạp chí ACM , 48 (4): 723 Từ760, tháng 7 năm 2001. http://doi.acm.org/10.1145/502090.502095


Jinx. Bạn nợ tôi một cốc.
Jeffε

@JeffE: Tôi không biết về trò chơi đó . Nhưng theo các quy tắc, tôi đã không thua trò chơi (tôi chỉ ở trạng thái của jinxed nghén), vì vậy tôi không nợ bạn một cốc nào trừ khi tôi nói thêm nữa oh oh, đợi một lát.
Tsuyoshi Ito

nếu chỉ bạn có thể giao dịch bằng điểm danh tiếng :)
Suresh Venkat

5

(Hiện tại, hãy để tôi sử dụng các truy vấn kết nối, điều không may là có thể không đủ cho ứng dụng của bạn.)

Nhiều công việc trước đây về vấn đề kết nối động nằm trong mô hình cập nhật cạnh: bạn giả sử số lượng đỉnh được cố định và bạn có thể chèn và / hoặc xóa các cạnh trong khi thực hiện truy vấn. Nếu bạn chỉ có thể chèn (xóa), đó là gia tăng (giảm dần). Nếu bạn có thể làm cả hai, đó là hoàn toàn năng động. Các tác phẩm của Thorup như được chỉ ra bởi JeffE (và bản thân tôi trong phần bình luận) đều dành cho các bản cập nhật cạnh.

AFAIK, cộng đồng lý thuyết CS chỉ mới bắt đầu xem xét các cập nhật đỉnh cho các biểu đồ chung. Có một công trình đột phá về vấn đề này của Chan, Pătraşcu và Roditty trong FOCS 2008. Xem liên kết này để xem bản sửa đổi rất gần đây (tháng 9 năm 2010) và các tài liệu tham khảo trong đó.


Tại sao bạn nghĩ rằng Holm et. al. Cách tiếp cận không làm việc cho vấn đề của tôi? Tôi sẽ chấp nhận nó.
bitmask

Nếu biểu đồ của bạn có mức độ giới hạn, thì theo lý thuyết, bạn có thể mô phỏng cập nhật đỉnh bằng cách sử dụng một loạt các cập nhật cạnh. Mặt khác, một bản cập nhật đỉnh duy nhất (giả sử, việc loại bỏ trung tâm của biểu đồ sao) có thể thay đổi mạnh mẽ kết nối của biểu đồ và trong trường hợp đó bạn cần kết quả của Chan et al.
Maverick Woo

Tôi hiểu rồi. Đáng lẽ tôi nên nói trong câu hỏi ban đầu, việc loại bỏ đỉnh là rất hiếm, vì vậy tôi có thể đủ khả năng để thực hiện nó cạnh nhau.
bitmask
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.