Cách biểu diễn một biểu đồ có nhiều cạnh được cho phép giữa các nút và các cạnh có thể biến mất một cách chọn lọc


11

Tôi đang cố gắng tìm ra loại cấu trúc dữ liệu nào sẽ được sử dụng để mô hình hóa một số sử dụng mạng lý tưởng hóa, giả định.

Trong kịch bản của tôi, một số người dùng thù địch với nhau đều đang cố gắng hình thành các mạng máy tính nơi tất cả các kết nối tiềm năng đều được biết đến. Tuy nhiên, các máy tính mà một người dùng cần kết nối có thể không giống với các máy tính mà người dùng khác cần kết nối; người dùng 1 có thể cần kết nối máy tính A, B và D trong khi người dùng 2 có thể cần kết nối máy tính B, C và E.

nhập mô tả hình ảnh ở đây

Hình ảnh được tạo với sự trợ giúp của NCTM Graph Creator

Tôi nghĩ cốt lõi của điều này sẽ là một biểu đồ tuần hoàn không bị ngăn chặn, với các nút đại diện cho máy tính và các cạnh đại diện cho cáp Ethernet. Tuy nhiên, do tính chất của kịch bản, có một số tính năng không phổ biến loại trừ danh sách kề và ma trận kề (ít nhất là không có sửa đổi không tầm thường):

  1. các cạnh có thể bị hạn chế sử dụng; nghĩa là, nếu một người dùng có được một kết nối mạng nhất định, không người dùng nào khác có thể sử dụng kết nối đó
    • trong ví dụ này, người dùng màu xanh lá cây có thể kết nối với máy tính A, nhưng người dùng màu đỏ đã kết nối B với E mặc dù không có liên kết trực tiếp giữa họ
  2. trong một số trường hợp, một cặp nút cho trước sẽ được kết nối bởi nhiều hơn một cạnh
    • trong ví dụ này, có hai cáp độc lập chạy từ D đến E, vì vậy người dùng xanh và xanh đều có thể kết nối trực tiếp các máy đó; tuy nhiên, màu đỏ không còn có thể tạo ra một kết nối như vậy
  3. nếu hai máy tính được kết nối bởi nhiều hơn một cáp, mỗi người dùng có thể sở hữu không quá một trong các cáp đó

Tôi sẽ cần thực hiện một số thao tác trên biểu đồ này, chẳng hạn như:

  • xác định xem có bất kỳ cặp máy tính cụ thể nào được kết nối cho một người dùng nhất định không
  • xác định đường dẫn tối ưu cho một người dùng nhất định để kết nối các máy tính mục tiêu
  • xác định kết nối máy tính có độ trễ cao nhất cho một người dùng nhất định (nghĩa là đường dẫn dài nhất mà không phân nhánh)

Suy nghĩ đầu tiên của tôi chỉ đơn giản là tạo ra một bộ sưu tập tất cả các cạnh, nhưng điều đó thật tồi tệ để tìm kiếm. Điều tốt nhất tôi có thể nghĩ phải làm bây giờ là sửa đổi danh sách kề để mỗi mục trong danh sách không chỉ chứa chiều dài cạnh mà còn cả chi phí và chủ sở hữu hiện tại. Đây có phải là một cách tiếp cận hợp lý? Giả sử không gian không phải là một mối quan tâm, liệu có hợp lý khi tạo nhiều bản sao của biểu đồ (một cho mỗi người dùng) thay vì một biểu đồ không?


Điều này bằng cách nào đó có vẻ có liên quan. youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck

Tôi thực sự không thấy làm thế nào điều đó sẽ giúp ở đây.
Pops

Vì vậy, tôi nghĩ về điều này trong một thời gian. Trong hầu hết các thuật toán cho đồ thị, bạn chủ yếu có hai việc cần làm: liệt kê hàng xóm hoặc tìm trọng số của một cạnh. Các câu hỏi bạn liệt kê tất cả chỉ liên quan đến một người dùng. Đối với một người dùng, việc liệt kê hàng xóm hoặc tìm trọng số của cạnh có thể được trả lời trong thời gian không đổi (nếu số lượng người dùng bị ràng buộc) hoặc trong nhật ký N bằng cách đơn giản phản ánh danh sách kề hoặc ma trận có "quyền sở hữu". Cuối cùng, tôi nghĩ một trong hai có thể được mở rộng dễ dàng và nên được lựa chọn dựa trên các thế mạnh truyền thống, thay vì bị phân tâm bởi phần người dùng.
J Trana

Câu trả lời:


6

Giả sử không gian không phải là một mối quan tâm, liệu có hợp lý khi tạo nhiều bản sao của biểu đồ (một cho mỗi người dùng) thay vì một biểu đồ không?

Dường như với tôi rằng bạn nên sử dụng những gì chúng ta có thể gắn nhãn cho các biểu đồ xếp lớp của Google, tức là thêm một tổ hợp cho các biểu đồ, giả sử @:

  • Nếu A và B là đồ thị thì A @ B cũng là đồ thị (tức là có thể được cung cấp cho các thuật toán của thư viện đồ thị của bạn).
  • Tập hợp các đỉnh trong A @ B là tập hợp các đỉnh trong A và B.
  • Tập hợp các cạnh trong A @ B là sự kết hợp của các cạnh trong A và B.
  • Cấu trúc A @ B không sở hữu bất kỳ đỉnh hoặc cạnh nào, mà sử dụng A và B làm vùng chứa dữ liệu.

Với các biểu đồ được xếp lớp như vậy, bạn có thể định nghĩa K là thông tin có sẵn kommon và R, G, B mỗi thông tin riêng tư để mỗi người chơi thực sự nhìn thấy R @ K, G @ K, B @ K.

Để thực sự thực hiện điều này, bạn có thể tìm kiếm một thư viện biểu đồ triển khai các thuật toán một cách tổng quát, nghĩa là thuật toán đường dẫn dài nhất, v.v. được tham số hóa bằng biểu diễn thực tế của biểu đồ của bạn. Vì vậy, nếu thư viện của bạn nói

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

bạn có thể dễ dàng thay thế nó bằng

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

nơi bạn đang cung cấp LayeredGraphsvà mượn phần còn lại từ thư viện.


Rất tiếc, bỏ qua nhận xét trước đây của tôi, tôi đọc sai câu trả lời của bạn một chút. Về cơ bản, đây là những gì tôi đang làm, mặc dù tôi đã không tận dụng được các thư viện đồ thị hiện có, vì tôi dại dột không nghĩ liệu có tồn tại không.
Pops

1

Những gì bạn cần được gọi là "biểu đồ quy". Trong một biểu đồ được quy cho, thông tin (thuộc tính) được gắn vào các cung. Một đồ thị có trọng số là một trong những đồ thị được quy cho đơn giản nhất.

Để biểu thị một biểu đồ được quy cho, bạn có thể sử dụng danh sách kề bằng cách thêm các cột bổ sung hoặc ma trận kề bằng cách thêm nhiều thông tin vào mỗi ô. Hầu hết các thuật toán cho các đồ thị không được gán sẽ hoạt động nếu bạn lọc các cung, dựa trên các thuộc tính. Nhiều thuật toán đã được phát triển cho các biểu đồ được quy cho, vì vậy tôi sẽ không mô tả chúng ở đây.


1
chắc chắn một ma trận kề thường không thể biểu thị nhiều hơn 1 cạnh giữa mỗi cặp nút
jk.

1
@jk, bình thường bạn đúng. Nhưng thông tin được đính kèm trong ma trận kề có thể có số lượng cung và thuộc tính riêng cho mỗi cung. Nhưng trong hầu hết các trường hợp, tôi sẽ sử dụng một danh sách kề vì nó sẽ đơn giản hơn.
walrii

1
nếu bạn đang đính kèm thông tin cho mọi cạnh vào ô, dù sao bạn cũng có một danh sách kề, bạn sẽ mất đi lợi ích mà ma trận mang lại cho bạn đối với các biểu đồ dày đặc
jk.
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.