Biểu diễn nhỏ gọn của các đường dẫn trong biểu đồ


9

Tôi có một tập hợp con của các đường dẫn đơn giản trong biểu đồ. Độ dài của các đường dẫn được giới hạn bởi .d

Cách nhỏ gọn nhất (trí nhớ thông minh) Tôi có thể biểu diễn các đường dẫn sao cho không có đường dẫn nào khác ngoài các đường dẫn được chọn được trình bày?

Lưu ý rằng tôi muốn sử dụng biểu diễn này trong một thuật toán sẽ lặp đi lặp lại qua tập hợp con các đường dẫn này và tôi muốn khá nhanh, vì vậy, tôi không thể sử dụng bất kỳ thuật toán nén tiêu chuẩn nào.

Một đại diện xuất hiện trong tâm trí tôi là đại diện cho họ như một bộ cây. Tôi đoán mặc dù việc hạ nó xuống một số lượng cây tối ưu là NP-hard? Những đại diện nào khác sẽ tốt?


2
Khi "lặp qua tập hợp con này", bạn cần thông tin gì về mỗi đường dẫn? Chiều dài? Các nút truy cập? Giao lộ với các đường dẫn khác? ... Có thể có nhiều , vì vậy bạn phải chuẩn bị "không thực sự nhanh" nếu bạn cần lưu trữ toàn bộ đường dẫn. 2d
Raphael

Tôi không biết liệu bạn có được đưa ra các đường dẫn theo một quy trình không xác định hay không, nhưng có lẽ bạn có thể thực hiện một số kế toán trong khi bạn đang tính toán các đường dẫn quan tâm. Ý tưởng nhanh: đặt là đồ thị máy chủ và đặt trọng số của mỗi cạnh bằng không. Khi bạn tìm thấy một con đường quan tâm , tăng trọng lượng của mỗi cạnh trong có nghĩa là trong . Cuối cùng, trọng lượng cạnh cho biết cạnh đó xuất hiện bao nhiêu đường. Có lẽ bây giờ bạn có thể tính toán một cây bao trùm tối thiểu của và thả tất cả các cạnh có trọng số bằng 0, hoặc đại loại như thế. P G P GGPGPG
Juho

Chà, ngay cả sự kết hợp của hai đường dẫn đơn giản tách rời nhau cũng có thể tạo ra một chu kỳ, do đó, tính toán MST sẽ khiến bạn mất một trong những đường dẫn tôi đoán. Nhưng ở trên có thể cung cấp cho bạn một số ý tưởng.
Juho

2
Bạn có thể muốn xem bài viết của Eppstein trên con đường ngắn nhất và các tài liệu liên quan. Họ đối phó với các đại diện nhỏ gọn là tốt. k
Juho

có một số khả năng sử dụng các FSM để biểu diễn các đường dẫn và sau đó người ta có thể thực hiện các hoạt động cơ bản như đoàn thể, giao lộ, phép trừ, v.v. và cả hoạt động "nén" để giảm thiểu các FSM được hiểu rõ / tối ưu và hiệu quả. havent đã thấy điều này được thực hiện trong một bài báo nhưng đề xuất nó về một vấn đề tương tự khác ...
vzn

Câu trả lời:


4

Một Trie có thể thực hiện mánh khóe: http://en.wikipedia.org/wiki/Trie

Dán nhãn cho mỗi cạnh của biểu đồ của bạn bằng một chữ cái. Sau đó thêm các chuỗi đại diện cho các đường dẫn qua biểu đồ của bạn vào bộ ba. Để thực hiện yêu cầu "không có đường dẫn nào khác ngoài các đường dẫn được chọn", bạn có thể để trống tất cả các đỉnh của trie và gắn nhãn các cạnh, ngoại trừ khi các cạnh dẫn từ gốc đến đỉnh đại diện cho một trong các đường dẫn của bạn, sau đó nhãn đỉnh với một cái gì đó. Một bool, số lượng đường dẫn theo một số thứ tự, vv

Khi bạn đã xây dựng bộ ba của mình, có các thuật toán để nén nó xuống một đại diện tối ưu (hoặc gần tối ưu). (xem bài viết Wikipedia được liên kết.)


Hấp dẫn. Tuy nhiên, một bộ ba đi kèm với một bộ thông số kỹ thuật lớn hơn nhiều mà tôi không thực sự quan tâm (tra cứu nhanh, liên kết với khóa, v.v.) vì vậy tôi tự hỏi liệu có điều gì tốt hơn có thể không ...
Opt

2

Có lẽ bạn nên có một cái nhìn về cấu trúc dữ liệu cô đọng . Chúng là các cấu trúc dữ liệu cố gắng lưu trữ thông tin trong không gian gần với giới hạn dưới lý thuyết thông tin trong khi vẫn bảo tồn khả năng thực hiện các thao tác trên chúng.

Có những cấu trúc như vậy cho cây, từ điển, v.v. Tôi không nhớ bất kỳ thứ gì sẽ làm chính xác những gì bạn muốn nhưng có lẽ một số kết hợp hoặc sửa đổi chúng sẽ giúp bạn.


1

Tùy thuộc vào độ phức tạp và xử lý trước / sau cần thiết cho thuật toán của bạn, có lẽ tùy chọn đơn giản nhất là cách. Bạn có thể biểu diễn chúng một cách tầm thường dưới dạng mảng và lưu chúng được nén trong HDF5. Thư viện này được trang bị một số thuật toán nén nhanh, do đó việc đọc và ghi dữ liệu nén có thể còn nhanh hơn cả không nén.

Dưới đây là một số lô đất:

Thời gian truy cập tuần tự cho mỗi phần tử cho EArray 15 GB và các khối khác nhau: http://pytables.github.io/_images/seq-chunksize-15GB.png

Tốc độ giải nén bằng Blosc trên PyTables: nhập mô tả hình ảnh ở đây

Và, nếu chúng bị giới hạn về chiều dài, bạn có thể lưu trữ chúng trong một bảng, và do đó có thể có thêm một chút không gian. Và khi lấy chúng từ bộ nhớ, bạn đã có chúng ở dạng rất thuận tiện để áp dụng thuật toán của bạn.

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.