đối tượng và con trỏ
Đây chỉ là những cấu trúc dữ liệu cơ bản như hammar đã nói trong câu trả lời khác, trong Java
bạn sẽ biểu diễn điều này bằng các lớp như cạnh và đỉnh. Ví dụ, một cạnh nối hai đỉnh và có thể được định hướng hoặc vô hướng và nó có thể chứa một trọng số. Một đỉnh có thể có một ID, tên, v.v. Hầu hết cả hai đều có các thuộc tính bổ sung. Vì vậy, bạn có thể xây dựng biểu đồ của mình với chúng như
Vertex a = new Vertex(1);
Vertex b = new Vertex(2);
Edge edge = new Edge(a,b, 30); // init an edge between ab and be with weight 30
Cách tiếp cận này thường được sử dụng cho các triển khai hướng đối tượng, vì nó dễ đọc và thuận tiện hơn cho người dùng hướng đối tượng;).
ma trận
Ma trận chỉ là một mảng 2 chiều đơn giản. Giả sử bạn có ID đỉnh có thể được biểu diễn dưới dạng một mảng int như sau:
int[][] adjacencyMatrix = new int[SIZE][SIZE]; // SIZE is the number of vertices in our graph
adjacencyMatrix[0][1] = 30; // sets the weight of a vertex 0 that is adjacent to vertex 1
Điều này thường được sử dụng cho các đồ thị dày đặc nơi cần truy cập chỉ mục. Bạn có thể đại diện cho một cấu trúc không / có hướng và có trọng số với điều này.
danh sách gần kề
Đây chỉ là một hỗn hợp cấu trúc dữ liệu đơn giản, tôi thường thực hiện điều này bằng cách sử dụng a HashMap<Vertex, List<Vertex>>
. Tương tự có thể được sử dụng HashMultimap
trong Ổi.
Cách tiếp cận này rất hay, bởi vì bạn có tra cứu đỉnh O (1) (phân bổ) và nó trả về cho tôi danh sách tất cả các đỉnh liền kề với đỉnh cụ thể mà tôi yêu cầu này.
ArrayList<Vertex> list = new ArrayList<>();
list.add(new Vertex(2));
list.add(new Vertex(3));
map.put(new Vertex(1), list); // vertex 1 is adjacent to 2 and 3
Điều này được sử dụng để biểu diễn các đồ thị thưa thớt, nếu bạn đang nộp đơn tại Google, bạn nên biết rằng các đồ thị thưa thớt. Bạn có thể đối phó với chúng theo cách có thể mở rộng hơn bằng cách sử dụng BigTable .
Ồ và BTW, đây là một bản tóm tắt rất hay về bài đăng này với những hình ảnh lạ mắt;)