Bueno, si lo único que le importa es la eficiencia del espacio, lo mejor sería una estructura de datos comprimidos, pero, por supuesto, esto no es muy eficiente para acceder o actualizar ...
Si su gráfico tiene un número relativamente pequeño de nodos y es bastante denso (digamos que existe al menos el 5% de todas las conexiones posibles), entonces puede encontrar que es más eficiente en el espacio crear una matriz de adyacencia en lugar de usar listas de bordes. Esto requeriría solo un bit por conexión posible (dirigida), y un total de n * n bits donde tiene n nodos.
De lo contrario, si necesita usar enlaces contiguos, entonces no puede hacer mejor que una referencia por enlace, ya que este es el contenido mínimo de información que necesita almacenar. Si desea vínculos de retroceso, necesitará el doble de enlaces.
Hay algunos trucos que puedes probar además de esto. Por ejemplo, podría intentar compartir subconjuntos de enlaces (si A y B se refieren a cada uno de C, D, E, entonces solo almacene la lista de enlaces C, D, E una vez .....). Sin embargo, esto se volverá complejo bastante rápido y dudo que valga la pena el esfuerzo en la mayoría de los casos.
Otro truco: suponiendo que su gráfico tenga un número razonable de nodos, sin duda ahorrará espacio indexando, por ejemplo, utilizando un número de índice de nodo de 16 bits en lugar de un puntero / referencia completo.