Tôi đang cố gắng xây dựng một đồ thị theo danh sách kề, nghĩa là tôi cần một danh sách cho tất cả các nút, và bên trong mọi nút nút, tôi cũng cần cấu trúc dữ liệu để giữ tất cả các nút liền kề. Chỉ cần tự hỏi cấu trúc tốt nhất sẽ làm gì (tìm kiếm nhanh cho lớp nút đích). Một mảng có hoạt động không?Danh sách kề và đồ thị
9
A
Trả lời
23
Đây là một cách để xây dựng biểu đồ được hướng dẫn trong Ruby, trong đó mỗi nút duy trì tham chiếu đến người kế thừa của nó, nhưng các nút có thể được tham chiếu theo tên. Trước tiên, chúng tôi cần lớp học cho các nút:
class Node
attr_reader :name
def initialize(name)
@name = name
@successors = []
end
def add_edge(successor)
@successors << successor
end
def to_s
"#{@name} -> [#{@successors.map(&:name).join(' ')}]"
end
end
Mỗi nút duy trì tham chiếu đến người kế nhiệm. Không biết bạn cần loại hoạt động nào, tôi chưa xác định bất kỳ thao tác nào thực sự thực hiện truyền tải đồ thị, nhưng mỗi nút có tham chiếu đến người kế thừa của nó khiến việc duyệt qua biểu đồ tầm thường.
Bây giờ chúng ta sẽ tạo một lớp học để đại diện cho toàn bộ đồ thị:
class Graph
def initialize
@nodes = {}
end
def add_node(node)
@nodes[node.name] = node
end
def add_edge(predecessor_name, successor_name)
@nodes[predecessor_name].add_edge(@nodes[successor_name])
end
def [](name)
@nodes[name]
end
end
Lớp này giữ một hash của các nút của nó, keyed theo tên. Điều này làm cho việc thu hồi một nút cụ thể dễ dàng.
Dưới đây là một ví dụ về một đồ thị có chứa một chu kỳ:
graph = Graph.new
graph.add_node(Node.new(:a))
graph.add_node(Node.new(:b))
graph.add_node(Node.new(:c))
graph.add_edge(:a, :b)
graph.add_edge(:b, :c)
graph.add_edge(:c, :a)
puts graph[:a] #=> a -> [b]
puts graph[:b] #=> b -> [c]
puts graph[:c] #=> c -> [a]
Các vấn đề liên quan
- 1. Thực hiện biểu đồ biểu đồ danh sách kề
- 2. Tạo danh sách kề từ một data.frame
- 3. giảm yêu cầu bộ nhớ cho danh sách kề
- 4. So sánh đối tượng đồ thị đại diện cho danh sách kề và ma trận đại diện
- 5. Hiển thị bản đồ khối xếp kề AS3 (với 1000 ô xếp kề)
- 6. Tối ưu hóa mã vectơ cho đồ thị kề
- 7. Xây dựng toàn bộ cây từ mối quan hệ danh sách kề kề SQLAlchemy
- 8. Làm thế nào để tạo danh sách kề/ma trận trọng số từ danh sách cạnh?
- 9. Đồ thị sử dụng Danh sách Adjacency trong C++
- 10. Đồ thị - Hình vuông của đồ thị có hướng
- 11. Cách hiệu quả để chuyển đổi ma trận kề kề lớn sang các danh sách cạnh trong MATLAB?
- 12. Python Bản đồ Danh sách Strings để Integer Danh sách
- 13. Liên kết các thanh cuộn trên các hộp danh sách liền kề với nhau
- 14. (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
- 15. Angularjs nhấp và hiển thị từ danh sách
- 16. Danh sách 3 chiều hoặc Bản đồ
- 17. Danh sách bản đồ vào từ điển
- 18. Thuật toán đệ quy để chọn tăng dần các số không liền kề từ danh sách
- 19. JAXB marshaling Bản đồ Danh sách
- 20. Cách hiệu quả nhất để tạo cây từ danh sách kề
- 21. Làm phẳng danh sách các chuỗi và danh sách các chuỗi và danh sách bằng Python
- 22. Biểu đồ và đồ thị Responsive Bootstrap
- 23. Tiêu đề danh sách không hiển thị
- 24. Hiển thị danh sách tệp trong ListView
- 25. Hiển thị danh sách lớn trong HTML
- 26. Hiển thị Danh sách cảm biến Android
- 27. Đường dẫn ngắn nhất Dijkstra với VertexList = Danh sách trong đồ thị tăng cường
- 28. Tôi có thể "chuyển đổi" danh sách bản đồ thành bản đồ danh sách trong Clojure không?
- 29. Danh sách mã lỗi API biểu đồ Facebook
- 30. Tách danh sách và kiếm tiền từ danh sách con?
Các ngôn ngữ Ruby được biết đến với việc sử dụng nặng nề của băm và mảng cho hầu hết các trường hợp thay vì cấu trúc dữ liệu chuyên ngành. Ruby ưu tiên năng suất lập trình, do đó, các mảng và mảng có khả năng phong phú để các nhà phát triển sử dụng chúng mọi lúc. Trong trường hợp của bạn, tôi nghĩ rằng mảng sẽ là tốt. – Valentin
Trong một ngôn ngữ OOP như Ruby, hãy xem xét biểu diễn mỗi nút trong biểu đồ dưới dạng đối tượng duy trì các cạnh của nó làm tham chiếu đến các đối tượng khác cùng loại. –