Prima di tutto nota che sparso significa che hai pochissimi spigoli e denso significa molti spigoli o grafico quasi completo. In un grafico completo hai bordi, dove n è il numero di nodi.n(n−1)/2n
Ora, quando utilizziamo la rappresentazione matrice, allochiamo la matrice per memorizzare le informazioni sulla connettività del nodo, ad esempio M [ i ] [ j ] = 1 se c'è un bordo tra i nodi i e j , altrimenti M [ i ] [ j ] = 0 .
Ma se utilizziamo l'elenco di adiacenza allora abbiamo una matrice di nodi e ogni nodo punta al suo elenco di adiacenza contenente SOLO i suoi nodi vicini .n×nM[i][j]=1ijM[i][j]=0
Ora se un grafico è scarso e utilizziamo la rappresentazione matrice, la maggior parte delle celle della matrice rimane inutilizzata, il che porta allo spreco di memoria. Pertanto, di solito non utilizziamo la rappresentazione matriciale per grafici sparsi. Preferiamo l'elenco di adiacenza.
Ma se il grafico è denso, il numero di spigoli è vicino a (il completo) , oppure a n 2 se il grafico è diretto con auto-loop. Quindi non vi è alcun vantaggio nell'utilizzare l'elenco di adiacenza su matrice.n(n−1)/2n2
In termini di complessità dello spazio
Matrice di adiacenza:
Elenco di adiacenza: O ( n + m )
dove n è il numero di nodi, m è il numero di spigoli.O(n2)
O(n+m)
nm
Quando il grafico è un albero non
orientato, allora Matrice di adiacenza:
Elenco di adiacenza: O ( n + n ) è O ( n ) (migliore di n 2 )O(n2)
O(n+n)O(n)n2
Quando il grafico è diretto, completo, con auto-loop quindi
matrice di adiacenza:
Elenco di adiacenza: O ( n + n 2 ) è O ( n 2 ) (nessuna differenza)O(n2)
O(n+n2)O(n2)
Infine, quando si implementa utilizzando la matrice, il controllo della presenza di uno spigolo tra due nodi richiede volte, mentre con un elenco di adiacenza, potrebbe essere necessario un tempo lineare in n .O(1)n