AccueilđŸ‡«đŸ‡·Chercher

Liste d'adjacence

En algorithmique, une liste d'adjacence est une structure de données utilisée pour représenter un graphe.

Pour chaque sommet, la liste d'adjacence est représentée en jaune.

Cette représentation est particuliÚrement adaptée aux graphes creux (c'est-à-dire peu denses), contrairement à la matrice d'adjacence adaptée aux graphes denses.

Définition et propriétés

La liste d'adjacence d'un graphe non orientĂ©, est la liste des voisins de chaque sommet[1]. Celle d'un graphe orientĂ© est typiquement, pour chaque sommet, la liste de nƓuds Ă  la tĂȘte de chaque arĂȘte ayant le sommet comme queue.

C'est une reprĂ©sentation relativement compacte lorsqu'il y a peu d'arĂȘtes (graphe creux), puisque la liste globale contient 2m Ă©lĂ©ments, oĂč m est le nombre d'arĂȘtes.

Implémentations

Une reprĂ©sentation par liste d'adjacence d'un graphe associe, Ă  chaque sommet du graphe, la collection de ses voisins, comme sommets ou comme arĂȘtes. Il existe de nombreuses variations de ce principe de base, qui diffĂšrent par des dĂ©tails dans la mise en Ɠuvre de l'association entre les sommets et ces collections, et de l'implĂ©mentation de ces collections elles-mĂȘmes, selon qu'elles comprennent, comme Ă©lĂ©ment de base, les deux sommets des arĂȘtes, ou les arĂȘtes comme objet, ou seulement les sommets voisins, ou encore dans le choix des types d'objets utilisĂ©s pour reprĂ©senter les sommets et la liste de arĂȘtes.

Les représentations de graphes par liste d'adjacence privilégient une approche plus centrée sur les sommets. Il existe de nombreuses implémentations possibles de listes d'adjacence :

  • L'implĂ©mentation en Python prĂ©conisĂ©e par Guido van Rossum utilise une table de hachage pour associer, Ă  chaque sommet du graphe, la table des sommets adjacents. Dans cette reprĂ©sentation, un sommet peut ĂȘtre reprĂ©sentĂ© par tout objet qui peut ĂȘtre hachĂ©. Il n'y a pas de reprĂ©sentation explicite des arĂȘtes en tant qu'objets[2].
  • Le livre de Cormen et al.[3] propose une implĂ©mentation dans laquelle les sommets sont reprĂ©sentĂ©s par les numĂ©ros d'index. Leur reprĂ©sentation utilise un tableau indexĂ© par les numĂ©ros des sommets, dans lequel la cellule du tableau correspondant pointe vers une liste chaĂźnĂ©e des sommets voisins de ce sommet. Dans cette reprĂ©sentation, les Ă©lĂ©ments de la liste chaĂźnĂ©e peuvent ĂȘtre interprĂ©tĂ©s comme des arĂȘtes; cependant, ils ne stockent pas les informations complĂštes sur chaque arĂȘte mais seulement l'autre extrĂ©mitĂ© de l’arĂȘte et, dans les graphes non orientĂ©s, il y aura deux Ă©lĂ©ments de liste chaĂźnĂ©e diffĂ©rents pour chaque arĂȘte (un dans les listes pour chacune des deux extrĂ©mitĂ©s de l'arĂȘte).
  • En programmation orientĂ©e objet, la structure dite liste d'incidence suggĂ©rĂ©e par exemple par Goodrich and Tamassia dans leur livre[4] possĂšde des classes d'objets pour les sommets et pour les arĂȘtes. Chaque objet sommet a une variable d'instance pointant vers une collection qui rĂ©pertorie les objets qui sont les arĂȘtes incidentes. À son tour, chaque arĂȘte pointe vers les deux objets sommet qui sont ses extrĂ©mitĂ©s. Cette version de la liste d'adjacence utilise plus de mĂ©moire que la version dans laquelle les sommets adjacents sont listĂ©s directement, mais l'existence d'objets arĂȘte explicites permet une flexibilitĂ© accrue, par exemple pour l'enregistrement d'informations supplĂ©mentaires sur les arĂȘtes.

Opérations

L'opĂ©ration principale effectuĂ©e par la structure de donnĂ©es de liste d'adjacence est de fournir une liste des voisins d'un sommet donnĂ©. En utilisant l'une des implĂ©mentations dĂ©crites ci-dessus, cela peut ĂȘtre effectuĂ© en temps constant par voisin. En d'autres termes, le temps total pour Ă©numĂ©rer tous les voisins d'un sommet est proportionnel au degrĂ© du sommet.

On peut Ă©galement utiliser des listes d'adjacence pour tester si une arĂȘte existe entre deux sommets donnĂ©s, mais cette reprĂ©sentation n'est pas efficace. Dans une liste d'adjacence dans laquelle les voisins de chaque sommet ne sont pas triĂ©s, le test de l'existence d'une arĂȘte peut ĂȘtre rĂ©alisĂ©e en temps proportionnel au degrĂ© de l'un des deux sommets donnĂ©s, en utilisant un parcours sĂ©quentiel des voisins de ce sommet. Si les voisins sont reprĂ©sentĂ©s comme un tableau triĂ©, une recherche dichotomique peut ĂȘtre utilisĂ©e Ă  la place, en temps proportionnel au logarithme du degrĂ©.

Compromis en espace

La principale alternative Ă  la liste d'adjacence est la matrice d'adjacence, une matrice dont les lignes et les colonnes sont indexĂ©es par les sommets et dont les cellules contiennent une valeur boolĂ©enne qui indique si une arĂȘte existe entre les sommets correspondant Ă  la ligne et la colonne de la cellule. Pour un graphe creux (un graphe qui n'a que peu d'arĂȘtes), une liste d'adjacence est beaucoup plus efficace en espace qu'une matrice d'adjacence stockĂ©e dans un tableau) : la place requise par une liste d'adjacence est proportionnelle au nombre d'arĂȘtes et de sommets du graphe, tandis que, pour une matrice d'adjacence stockĂ©es en tableau, l'espace est proportionnel au carrĂ© du nombre de sommets. Cependant, il est possible de stocker des matrices d'adjacence de maniĂšre plus efficace en espace, proche de l'espace linĂ©aire linaire pris par une liste d'adjacence, en utilisant une table de hachage indexĂ©e par paires de sommets plutĂŽt qu'un tableau. Comme chaque entrĂ©e de la matrice d'adjacence ne nĂ©cessite qu'un seul bit, elle peut ĂȘtre reprĂ©sentĂ©e d'une maniĂšre trĂšs compacte, en occupant seulement octets contigus en espace. En plus d'Ă©viter le gaspillage d'espace, cette compacitĂ© encourage le principe de localitĂ©.

Cependant, pour un graphe creux, les listes d'adjacence nĂ©cessitent moins d'espace de stockage, car elles ne reprĂ©sentent pas les arĂȘtes absentes. Ainsi, en utilisant une implĂ©mentation naĂŻve par tableau sur un ordinateur 32 bits, une liste d'adjacence pour un graphe non orientĂ© nĂ©cessite environ octets en place. Un graphe simple peut avoir au plus arĂȘtes, si on autorise des boucles. Notons la densitĂ© du graphe. La reprĂ©sentation par liste d'adjacence occupe plus d'espace que la reprĂ©sentation matricielle si , donc si . Ainsi, un graphe doit ĂȘtre creux en effet pour justifier une reprĂ©sentation par liste d'adjacence.

Outre le compromis sur l'espace, les deux structures de donnĂ©es facilitent Ă©galement diffĂ©rentes opĂ©rations. Trouver tous les sommets adjacents Ă  un sommet donnĂ© dans une liste d'adjacence est aussi simple que le parcours de la liste. Avec une matrice d'adjacence, une ligne entiĂšre doit plutĂŽt ĂȘtre parcourue, ce qui prend un temps . L'existence d'une arĂȘte entre deux sommets donnĂ©s peut ĂȘtre dĂ©terminĂ©e en temps constant dans une matrice d'adjacence, tout en exigeant un temps proportionnel au degrĂ© minimum des deux sommets de la liste d'adjacence.

Notes et références

  1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction Ă  l'algorithmique, Dunod, [dĂ©tail de l’édition]
  2. Guido van Rossum, « Python Patterns — Implementing Graphs »,
  3. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction Ă  l'algorithmique, Dunod, [dĂ©tail de l’édition], section 22.1: ReprĂ©sentation des graphes.
  4. Michael T. Goodrich et Roberto Tamassia, Algorithm Design : Foundations, Analysis, and Internet Examples, John Wiley & Sons, , 708 p. (ISBN 0-471-38365-1).

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.