объекты и указатели
Это просто базовые структуры данных, как сказал Хаммар в другом ответе, в 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
Этот подход обычно используется для объектно-ориентированных реализаций, так как он более читабелен и удобен для объектно-ориентированных пользователей;).
matrix
Матрица - это простой двумерный массив.Предполагая, что у вас есть идентификаторы вершин, которые можно представить в виде массива типа 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 .
Oh и BTW, здесь - очень хорошее резюме этого поста с причудливыми картинками;)