Tout d'abord, notez que clairsemé signifie que vous avez très peu d'arêtes, et dense signifie plusieurs arêtes, ou un graphique presque complet. Dans un graphique complet, vous avez arêtes, où n est le nombre de nœuds.n(n−1)/2n
Maintenant, lorsque nous utilisons la représentation matricielle, nous allouons matrice pour stocker les informations de connectivité des nœuds, par exemple, M [ i ] [ j ] = 1 s'il y a un bord entre les nœuds i et j , sinon M [ i ] [ j ] = 0 .
Mais si nous utilisons la liste d'adjacence, nous avons alors un tableau de nœuds et chaque nœud pointe vers sa liste d'adjacence contenant UNIQUEMENT ses nœuds voisins .n×nM[i][j]=1ijM[i][j]=0
Maintenant, si un graphe est clairsemé et que nous utilisons une représentation matricielle, la plupart des cellules matricielles restent inutilisées, ce qui entraîne un gaspillage de mémoire. Ainsi, nous n'utilisons généralement pas de représentation matricielle pour les graphiques clairsemés. Nous préférons la liste d'adjacence.
Mais si le graphe est dense alors le nombre d'arêtes est proche de (le complet) , ou de n 2 si le graphe est dirigé avec des auto-boucles. Il n'y a alors aucun avantage à utiliser la liste d'adjacence sur la matrice.n(n−1)/2n2
En termes de complexité d'espace
Matrice d'adjacence:
Liste d'adjacence: O ( n + m )
où n est le nombre de nœuds, m est le nombre d'arêtes.O(n2)
O(n+m)
nm
Lorsque le graphique est un arbre non orienté, alors
Matrice d'adjacence:
Liste d'adjacence: O ( n + n ) est O ( n ) (mieux que n 2 )O(n2)
O(n+n)O(n)n2
Lorsque le graphique est dirigé, complet, avec auto-boucles puis
matrice d'adjacence:
Liste d'adjacence: O ( n + n 2 ) est O ( n 2 ) (pas de différence)O(n2)
O(n+n2)O(n2)
Et enfin, lorsque vous implémentez en utilisant la matrice, vérifier s'il y a un bord entre deux nœuds prend fois, alors qu'avec une liste d'adjacence, cela peut prendre un temps linéaire en n .O(1)n