объекты и указатели
Это просто базовые структуры данных, такие как 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 .
Да и кстати, вот очень хорошее резюме этого поста с модными картинками;)