Eh bien, si l'efficacité de l'espace est tout ce dont vous vous souciez, une structure de données compressée serait la meilleure - mais bien sûr, ce n'est pas très efficace pour l'accès ou la mise à jour .....
Si votre graphique a un nombre relativement petit de nœuds et est assez dense (disons qu'au moins 5% de toutes les connexions possibles existent), vous constaterez peut-être que l'espace est plus efficace pour créer une matrice d'adjacence plutôt que d'utiliser des listes de bords. Cela nécessiterait un seul bit par connexion possible (dirigée) et un total de n * n bits lorsque vous avez n nœuds.
Sinon, si vous devez utiliser des liens voisins, vous ne pouvez pas facilement faire mieux qu'une référence par lien, car il s'agit du contenu d'informations minimum que vous devez stocker. Si vous voulez des back-links, vous aurez besoin de deux fois plus de liens.
Il y a quelques astuces que vous pouvez essayer en plus de cela. Par exemple, vous pouvez essayer de partager des sous-ensembles de liens (si A et B font référence à chacun de C, D, E, puis ne stocker la liste des liens C, D, E qu'une seule fois .....). Cependant, cela deviendra complexe assez rapidement et je doute que cela en vaille la peine dans la plupart des cas.
Une autre astuce - en supposant que votre graphique a un nombre raisonnable de nœuds, vous économiserez certainement de l'espace en indexant - par exemple en utilisant un numéro d'index de nœud 16 bits plutôt qu'un pointeur / référence complet.