об'єкти та покажчики
Це лише основні структури даних, як Hammar, сказане в іншій відповіді, і Java
ви б представляли це за допомогою таких класів, як ребра та вершини. Наприклад, ребро з'єднує дві вершини і може бути направленим або ненаправленим, і воно може містити вагу. Вершина може мати ідентифікатор, назву тощо. В основному обидві вони мають додаткові властивості. Таким чином, ви можете побудувати свій графік з ними, як
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
Цей підхід зазвичай використовується для об'єктно-орієнтованих реалізацій, оскільки він є більш читабельним та зручним для об'єктно-орієнтованих користувачів;).
матриця
Матриця - це просто простий двовимірний масив. Припускаючи, що у вас є ідентифікатори вершин, які можна представити у вигляді масиву int, як це:
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
Це зазвичай використовується для щільних графіків, де необхідний доступ до індексу. За допомогою цього ви можете представити ненаправлену та зважену структуру.
список суміжності
Це просто простий мікс структури даних, я зазвичай реалізую це, використовуючи HashMap<Vertex, List<Vertex>>
. Подібним використовується HashMultimap
в Гуаві.
Цей підхід класний, тому що у вас є O (1) (амортизований) пошук вершин, і він повертає мені список усіх сусідніх вершин до цієї конкретної вершини, яку я вимагав.
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
Це використовується для представлення розріджених графіків. Якщо ви подаєте заявку в Google, ви повинні знати, що веб-графіка розріджена. Ви можете мати справу з ними більш масштабовано, використовуючи BigTable .
О, і до речі, ось дуже хороший підсумок цього допису із вигадливими малюнками;)