On m'a dit que nous utiliserions une liste si le graphique est clairsemé et une matrice si le graphique est dense . Pour moi, c'est juste une définition brute. Je ne vois pas grand-chose au-delà. Pouvez-vous préciser quand serait-ce le choix naturel à faire?
Merci d'avance!
graphs
data-structures
lists
adjacency-matrix
user21312
la source
la source
Réponses:
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)/2 n
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×n M[i][j]=1 i j M[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)/2 n2
En termes de complexité d'espaceO(n2)
O(n+m)
n m
Matrice d'adjacence: Liste d'adjacence: O ( n + m ) où n est le nombre de nœuds, m est le nombre d'arêtes.
Lorsque le graphique est un arbre non orienté, alorsO(n2)
O(n+n) O(n) n2
Matrice d'adjacence: Liste d'adjacence: O ( n + n ) est O ( n ) (mieux que n 2 )
Lorsque le graphique est dirigé, complet, avec auto-boucles puisO(n2)
O(n+n2) O(n2)
matrice d'adjacence: Liste d'adjacence: O ( n + n 2 ) est O ( n 2 ) (pas de différence)
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
la source
Pour répondre en fournissant une analogie simple. Si vous deviez stocker 6 onces d'eau, le feriez-vous (en général) avec un récipient de 5 gallons ou une tasse de 8 onces?
Maintenant, revenons à votre question. Si la majorité de votre matrice est vide, alors pourquoi l'utiliser? Inscrivez simplement chaque valeur à la place. Cependant, si votre liste est vraiment longue, pourquoi ne pas simplement utiliser une matrice pour la condenser?
Le raisonnement derrière la liste vs la matrice est vraiment aussi simple dans ce cas.
PS une liste est vraiment juste une matrice à une seule colonne !!! (en essayant de vous montrer à quel point cette décision / scénario est arbitraire)
la source
Considérons un graphique avec nœuds et E arêtes. En ignorant les termes d'ordre bas, une matrice de bits pour un graphe utilise N 2 bits quel que soit le nombre de fronts.N E N2
De combien de bits avez-vous réellement besoin?
En supposant que les arêtes sont indépendantes, le nombre de graphiques avec nœuds et E arêtes est ( N 2N E (N2E) log2(N2E)
If you consider thatlog2N is the size of an integer which can represent a node index, the optimal representation is an array of 2E node ids, that is, an array of pairs of node indexes.
Having said that, a good measure of sparsity is the entropy, which is also the number of bits per edge of the optimal representation. Ifp=EN2 is the probability that an edge is present, the entropy is −log2p(1−p) . For p≈12 , the entropy is 2 (i.e. two bits per edge in the optimal representation), and the graph is dense. If the entropy is significantly greater than 2, and in particular if it's close to the size of a pointer, the graph is sparse.
la source