objetos y punteros
Estas son solo estructuras de datos básicas como Hammar dijo en la otra respuesta, en las Java
que representaría esto con clases como bordes y vértices. Por ejemplo, un borde conecta dos vértices y puede estar dirigido o no dirigido y puede contener un peso. Un vértice puede tener una ID, un nombre, etc. En su mayoría, ambos tienen propiedades adicionales. Entonces puedes construir tu gráfico con ellos como
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
Este enfoque se usa comúnmente para implementaciones orientadas a objetos, ya que es más legible y conveniente para usuarios orientados a objetos;).
matriz
Una matriz es simplemente una matriz bidimensional simple. Suponiendo que tiene ID de vértice que se pueden representar como una matriz int como esta:
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
Esto se usa comúnmente para gráficos densos donde es necesario el acceso al índice. Puede representar una estructura ponderada y no dirigida con esto.
lista de adyacencia
Esta es solo una combinación de estructura de datos simple, generalmente la implemento usando un archivo HashMap<Vertex, List<Vertex>>
. Similar utilizado puede ser el HashMultimap
de Guayaba.
Este enfoque es genial, porque tiene una búsqueda de vértices O (1) (amortizada) y me devuelve una lista de todos los vértices adyacentes a este vértice en particular que exigí.
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
Esto se utiliza para representar gráficos dispersos, si está postulando en Google, debe saber que el webgraph es escaso. Puede tratar con ellos de una manera más escalable utilizando BigTable .
Ah, y por cierto, aquí hay un muy buen resumen de esta publicación con imágenes elegantes;)