2015-11-05 2 views
0

J'ai lu des sites Web en ligne et tout le monde dit que l'utilisation d'une file d'attente prioritaire le rendra bien, mais je ne comprends pas ce qui est utilisé comme "priorité" ici.Comment l'algorithme de plus court chemin de Dijkstra fonctionne-t-il avec les files d'attente prioritaires?

Au tout début, le premier élément de la file d'attente prioritaire est-il toujours le nœud de point de départ? Si oui, lorsque nous extrayons le nœud de départ avec la distance 0, comment obtient-on ses voisins de la file d'attente prioritaire?

Répondre

2

Une file d'attente prioritaire Q stocke un ensemble d'éléments distincts. Chaque élément x a une clé associée x.key

Lorsque Dijkstra est basé sur une file d'attente prioritaire. Ensuite, nous stockons les sommets dans la file d'attente dont les distances par rapport à la source doivent encore être réglées, en fonction de leur distance actuelle par rapport à la source. Jetez un oeil à ce pdf où l'algorithme est basé sur la structure de données abstraite appelée une file d'attente prioritaire, qui peut être mise en œuvre en utilisant un tas binaire.

http://www.cs.bris.ac.uk/~montanar/teaching/dsa/dijkstra-handout.pdf

0

Lors de l'implémentation de l'algorithme de Dijkstra, vous utilisez une file d'attente prioritaire pour déterminer l'ordre dans lequel vous visitez nœuds.

La file d'attente de priorité contient tous les nœuds non visités, et vous permet de supprimer (puis de traiter) celle qui a la plus petite distance assignée. La file d'attente prioritaire est d'une importance critique, car elle garantit qu'un nœud n'est jamais visité jusqu'à ce que sa distance assignée soit précise et que le chemin le plus court connu soit effectivement le plus court. Cela signifie que vous n'aurez jamais à visiter et à traiter un nœud deux fois!

REMARQUE, cependant, l'algorithme de Dijkstra peut réduire la distance assignée d'un nœud plusieurs fois avant qu'il ne soit visité. Cela signifie que la file d'attente prioritaire doit prendre en charge dynamiquement la priorité croissante des nœuds. Les files d'attente de priorité standard fournies en Java et C++ ne supportent PAS cette opération et ne peuvent pas être utilisées dans l'algorithme de Dijkstra. A la place, vous devez implémenter vous-même votre file d'attente prioritaire en utilisant un tas dans une ArrayList ou un std :: vector.