Algoritme de Dijkstra
El algoritme de Dijkstra, també cridat algoritme de camins mínims, és un algoritme per a la determinació del camí més curt, donat un vèrtiç orige, cap al restant dels vèrtiços en un grafo que té pesos en cada aresta. El seu nom aludix a Edsger Dijkstra, científic de la computació dels Països Baixos que ho va concebre en 1956 i ho va publicar per primera volta en 1959.[1][2]
L'idea subjacent en este algoritme consistix en anar explorant tots els camins més curts que partixen del vèrtiç orige i que duen a tots els demés vèrtiços; quan s'obté el camí més curt des del vèrtiç orige fins al restant dels vèrtiços que componen el grafo, l'algoritme es deté. Es tracta d'una especialisació de la busca de cost uniforme i, com a tal, no funciona en grafos en arestes de cost negatiu (en elegir sempre el nodo en distància menor, poden quedar exclosos de la busca nodos que en pròximes iteraciones baixarien el cost general del camí en passar per una aresta en cost negatiu).[3]
Algoritme
[editar | editar còdic]Tenint un grafo dirigit ponderat de nodos no aïllats, siga el nodo inicial. Un vector de tamany guardarà al final de l'algoritme les distàncies des de fins al restant dels nodos.
- Inicializar totes les distàncies en en un valor infinit relatiu, ya que són desconegudes al principi, exceptuant la de , que es deu colocar en , degut a que la distància de a seria .
- Siga (Es pren com a nodo actual).
- Es recorren tots els nodos adjacents de a, llevat els nodos marcats. Se'ls cridarà nodos no marcats vi.
- Per al nodo actual, es calcula la distancia tentativa des de dit nodo fins als seus veïns en la següent fòrmula: dt(vi) = Da + d(a,vi). És dir, la distancia tentativa del nodo ‘vi’ és la distància que actualment té el nodo en el vector D més la distància des de dit nodo ‘a’ (l'actual) fins al nodo vi. Si la distancia tentativa és menor que la distància almagasenada en el vector, llavors s'actualisa el vector en esta distancia tentativa. És dir, si dt(vi) < Dvaig vore → Dvaig vore = dt(vi)
- Es marca com a complet el nodo a.
- Es pren com a pròxim nodo actual el de menor valor en D (pot fer-se almagasenant els valors en una coa de prioritat) i es retorna al pas 3, mentres existixquen nodos no marcats.
Una volta terminat a l'algoritme, estarà completament ple.
Complexitat
[editar | editar còdic]Orde de complexitat de l'algoritme:
- O(|V|²+|A|) = O(|V|²), sense utilisar coa de prioritat, :O((|A|+|V|) log |V|) = O(|A| log |V|) utilisant coa de prioritat (per eixemple, un montícul binario o un arbre binario balancejat). Per un atre costat, si s'utilisa un montícul de Fibonacci, seria O(|V| log |V|+|A|).
La complexitat computacional de l'algoritme de Dijkstra es pot calcular contant les operacions realisades:
- l'algoritme consistix en n-1 iteraciones, com a màxim. En cada iteración, s'afig un vèrtiç al conjunt distinguit.
- En cada iteración, s'identifica el vèrtiç en la menor etiqueta entre els que no estan en Sk. El número d'estes operacions està acotat per n-1.
- Ademés, es realisen una suma i una comparació per a actualisar l'etiqueta de cada u dels vèrtiços que no estan en Sk.
Després, en cada iteración es realisen com a molt 2(n-1) operacions.
Llavors:
Teorema: L'algoritme de lpz realisa O(n²) operacions (sumes i comparacions) per a determinar la llongitut del camí més curt entre dos vèrtiços d'un grafo ponderat simple, conexo i no dirigit en n vèrtiços.
En general:
- Temps d'eixecució = O(|A|.𝑻_𝒅𝒌+|v|.𝑻_𝒅𝒎)
- |A|: Número d'arestes
- 𝑻_𝒅𝒌: Complexitat de disminuir clau
- |V|: Número de vèrtiços
- 𝑻_𝒅𝒎: Complexitat d'extraure mínim
Vore també
[editar | editar còdic]Referències
[editar | editar còdic]
Referències
[editar | editar còdic]
- Este artícul conté una traducció derivada de «Algoritmo de Dijkstra» de Wikipedia en castellà publicada baix la Llicència de documentació lliure de GNU i la Llicència Creative Commons Reconeiximent-CompartirIgual 4.0 Internacional.