Creo que su primer ejemplo es un poco ambiguo: los nodos como objetos y los bordes como punteros. Puede realizar un seguimiento de estos almacenando solo un puntero a algún nodo raíz, en cuyo caso acceder a un nodo determinado puede ser ineficiente (digamos que desea el nodo 4; si no se proporciona el objeto de nodo, es posible que deba buscarlo) . En este caso, también perdería partes del gráfico a las que no se puede acceder desde el nodo raíz. Creo que este es el caso que asume f64 rainbow cuando dice que la complejidad de tiempo para acceder a un nodo dado es O (n).
De lo contrario, también podría mantener una matriz (o hashmap) llena de punteros a cada nodo. Esto permite el acceso O (1) a un nodo determinado, pero aumenta un poco el uso de memoria. Si n es el número de nodos ye es el número de bordes, la complejidad espacial de este enfoque sería O (n + e).
La complejidad del espacio para el enfoque matricial estaría en las líneas de O (n ^ 2) (asumiendo que los bordes son unidireccionales). Si su gráfico es escaso, tendrá muchas celdas vacías en su matriz. Pero si su gráfico está completamente conectado (e = n ^ 2), esto se compara favorablemente con el primer enfoque. Como dice RG, también puede tener menos fallas de caché con este enfoque si asigna la matriz como una porción de memoria, lo que podría acelerar el seguimiento de muchos bordes alrededor del gráfico.
El tercer enfoque es probablemente el más eficiente en términos de espacio para la mayoría de los casos, O (e), pero haría que encontrar todos los bordes de un nodo dado fuera una tarea O (e). No puedo pensar en un caso en el que esto sea muy útil.