Cấu trúc dữ liệu để lưu trữ các cạnh của đồ thị


8

Tôi hiện đang làm việc trên luận án thạc sĩ của mình, và đó là về việc phân cụm trên biểu đồ. Tôi đang làm việc với một ý tưởng sử dụng kiến ​​để giải quyết vấn đề. Tôi hiện đang làm việc về việc triển khai và đang tự hỏi chính xác cách thể hiện các cạnh của biểu đồ.

Mỗi cạnh được tăng thêm một số thông tin nhất định như giá trị pheromone của nó và số lần một con kiến ​​đã ghé thăm cạnh đó. Tôi sẽ làm việc với các đồ thị vô hướng, có thể cuối cùng là khá lớn (hơn một triệu đỉnh) và tôi tự hỏi đâu là cách hiệu quả nhất để tôi lưu trữ các cạnh và tìm kiếm chúng? Tôi đã nghĩ đến việc gắn bó với một quy ước và lưu trữ các điểm cuối theo một điểm có id đỉnh thấp hơn cho và điểm cao hơn cho v 2 ( v 1v 2 là điểm cuối của cạnh trong cấu trúc dữ liệu). Nhưng tôi tự hỏi làm thế nào tôi sẽ thực hiện tìm kiếm trong trường hợp này?v1v2v1v2

Có một ánh xạ mà tôi đã đưa ra từ ma trận kề tới mảng cạnh, nhưng nó chỉ hoạt động nếu đồ thị bên dưới là một đồ thị hoàn chỉnh. Vì vậy, tôi đã đến đây để có một số gợi ý về cách tôi nên tiến hành bởi vì tôi cần việc tra cứu của mình hiệu quả trong khi đồng thời tôi không muốn làm nổ tung không gian lưu trữ cho các cạnh vì đồ thị sẽ rất lớn.


1
Là đồ thị của bạn thưa thớt hoặc dày đặc? Bởi vì câu trả lời dựa vào đó.
Bartosz Przybylski

Ồ tôi nên đã đề cập rằng, vâng, chúng chủ yếu là đồ thị thưa thớt. Về cơ bản các biểu đồ tôi sẽ làm việc với các mạng đại diện trong thế giới thực thường thưa thớt. :)
bùn

Sắp xếp danh sách kề?
Raphael

Câu trả lời:


5

Nếu biểu đồ của bạn thưa thớt thì bạn nên lưu trữ nó bằng cách sử dụng "danh sách" kề, mặc dù bạn có thể muốn một cái gì đó hiệu quả hơn một danh sách (hoặc có lẽ bạn không, tùy thuộc vào cách sử dụng). Thật đơn giản nếu bạn lưu trữ mỗi cạnh ở cả hai điểm cuối. Điều này có thể được thực hiện theo nhiều cách, ví dụ bạn có thể lưu trữ tất cả dữ liệu trong một số mảng lớn và chỉ lưu trữ các con trỏ trong "danh sách" kề.


Cho đến nay tôi đã sử dụng một cách tiếp cận danh sách kề, trong đó đối với mỗi đỉnh tôi có một mảng các lân cận của nó (mỗi đỉnh là một đối tượng). Cách này giúp vì mỗi con kiến ​​biết hàng xóm của mọi đỉnh. Nhưng tôi cần chọn cạnh nào để đi qua, dựa trên thông tin về pheromone và một số dữ liệu khác mà tôi sẽ tính toán. Tôi không muốn giới thiệu sự trùng lặp vì vậy tôi đã tự hỏi liệu có cách nào để đại diện cho từng cạnh riêng lẻ không nhưng có thể lập chỉ mục chúng một cách hiệu quả cùng một lúc, vì tôi sẽ cần rất nhiều tìm kiếm cho mỗi cạnh trong mỗi lần lặp .
bùn

Ví dụ, đây là ánh xạ có thể tới các chỉ số của mảng cạnh nếu đồ thị đã hoàn thành. Trong trường hợp này, chúng ta đã biết kích thước của mảng cạnh sẽ là n (n-1), trong đó n là số đỉnh. Vì vậy, để dịch ma trận kề [x] [y] thành chỉ mục mảng (idx) có thể như sau: if x <= y thì idx = n * x - x * (x + 1) / 2 + (y - x - 1) khác idx = n * y - y * (y + 1) / 2 + (x - y - 1) Vì vậy, nói cạnh (5,11) hoặc (11,5) cả hai sẽ dịch sang cùng một chỉ mục mảng. Nhưng vì tôi không làm việc với các biểu đồ hoàn chỉnh, tôi không thể nghĩ ra một ánh xạ.
bùn

2
G[x][y]
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.