web-dev-qa-db-fra.com

Comprendre le calcul de la complexité temporelle pour l'algorithme de Dijkstra

Selon ma compréhension, j’ai calculé la complexité temporelle de l’algorithme de Dijkstra sous forme de notation big-O en utilisant la liste de contiguïté donnée ci-dessous. Cela ne s'est pas passé comme prévu et cela m'a amené à le comprendre pas à pas.

  1. Chaque sommet peut être connecté à (V-1) sommets, d'où le nombre d'arêtes adjacentes à chaque sommet est V - 1. Supposons que E représente V-1 arêtes connectées à chaque sommet.
  2. La recherche et la mise à jour du poids minimum de chaque sommet adjacent est O(log(V)) + O(1) ou O(log(V)).
  3. Par conséquent, à partir des étapes 1 et 2 ci-dessus, la complexité temporelle de la mise à jour de tous les sommets adjacents d'un sommet est E * (logV). ou E*logV.
  4. Par conséquent, la complexité temporelle de tous les sommets V est V * (E * logV), c'est-à-dire O(VElogV).

Mais la complexité temporelle de l'algorithme de Dijkstra est O (ElogV). Pourquoi?

45
Meena Chaudhary

L'algorithme de chemin le plus court de Dijkstra est O(ElogV) où:

  • V est le nombre de sommets
  • E est le nombre total d'arêtes

Votre analyse est correcte, mais vos symboles ont des significations différentes! Vous dites que l'algorithme est O(VElogV) où:

  • V est le nombre de sommets
  • E est le nombre maximal d'arêtes attachées à un seul nœud.

Renommons votre E en N. Donc, une analyse dit O(ElogV) et une autre indique O(VNlogV). Les deux sont corrects et en fait E = O(VN). La différence est que ElogV est une estimation plus précise.

60
Shahbaz

soit n le nombre de sommets et m le nombre d'arêtes.

Depuis, avec l'algorithme de Dijkstra, vous avez O(n) delete-min s et O(m) touche_diminuée s, chaque coûtant O (logn), le temps total d’exécution à l’aide de tas binaires sera de O (log (n) (m + n)). Il est tout à fait possible d’amortir le coût de signe de diminution jusqu’à O(1) en utilisant des tas de Fibonacci, ce qui donne un temps total d’exécution de O (nlogn + m) mais, dans la pratique, cela n’est souvent pas fait car les pénalités à facteur constant des FH sont assez lourdes et sur des graphes aléatoires, la quantité de signe_diminuée s est bien inférieure à sa limite supérieure respective (plus dans la plage de O (n * log (m/n), ce qui est bien mieux sur des graphes clairsemés où m = O (n)). Soyez donc toujours conscient du fait que le temps d’exécution total dépend à la fois de vos structures de données et de la classe d’entrée.

1
timtody