Sunteți pe pagina 1din 6

Optimizări practice și grafice infinite

În prezentările comune ale algoritmului Dijkstra, inițial toate nodurile sunt introduse în coada prioritară.
Totuși, acest lucru nu este necesar: algoritmul poate începe cu o coadă prioritară care conține un singur
element și poate insera elemente noi așa cum sunt descoperite ( în loc să facă o cheie de scădere,
verificați dacă cheia este în coadă; dacă este, reduceți cheia, altfel introduceți-o ).[ 7 ]: 198 Această
variantă are aceleași limite cele mai grave ca varianta comună, dar menține în practică o coadă prioritară
mai mică, grăbind operațiunile cozii.[ 11 ]

Mai mult decât atât, neinserarea tuturor nodurilor într-un grafic face posibilă extinderea algoritmului
pentru a găsi cea mai scurtă cale de la o singură sursă la cea mai apropiată de un set de noduri țintă pe
grafice infinite sau cele prea mari pentru a fi reprezentate în memorie. Algoritmul rezultat se numește
căutare cu costuri uniforme (UCS) în literatura de inteligență artificială[11][21][22] și poate fi exprimată
în pseudocod ca

procedură uniform_cost_căutare(start) este

node ← start

frontieră ← coada de prioritate care conține numai nod

set gol extins ←

face

dacă frontiera este goală apoi

întoarcere eșec

nod ← frontier.pop()

dacă nodul este o stare de obiectiv apoi

întoarcere soluție ( nod )

expand.add ( nod )

pentru fiecare a vecinilor nodului n face

dacă n nu este în extindere și nu este la frontieră apoi

frontier.add (n)

altfel dacă n este în frontieră cu costuri mai mari


înlocuiți nodul existent cu n

Complexitatea acestui algoritm poate fi exprimată într-un mod alternativ pentru grafice foarte mari: când
C* este lungimea celei mai scurte căi de la nodul de start la orice nod care satisface predicatul "obiectiv",
fiecare margine a costat cel puțin şi, Şi numărul de vecini pe nod este limitat de b, În cele din urmă,
complexitatea timpului și a spațiului celui mai rău caz al algoritmului sunt ambele O(b1+⌊C* ⁄ şi⌋).[21]

Optimizările suplimentare ale algoritmului Dijkstra pentru cazul cu o singură țintă includ bidirecțional
variante, variante direcționate spre obiective, cum ar fi Algoritmul A* (vezi § Probleme și algoritmi),
tăierea grafurilor pentru a determina care noduri sunt susceptibile de a forma segmentul de mijloc al
căilor cele mai scurte (rutare bazată pe atingere) și descompunerea ierarhică a grafului de intrare care se
reduce s–t rutare la conectare s și t la lor "noduri de tranzit" urmată de calculul celei mai scurte căi între
aceste noduri de tranzit folosind o "autostradă".[23] Pot fi necesare combinații de astfel de tehnici
pentru o performanță practică optimă în probleme specifice.[24]

Variante specializate

Atunci când greutățile arcului sunt numere întregi mici (mărginite de un parametru

{\displaystyle C}), cozile specializate care profită de acest fapt pot fi folosite pentru a accelera algoritmul
lui Dijkstra. Primul algoritm de acest tip a fost Algoritmul lui dial (Dial 1969) pentru grafuri cu greutăți de
margine întregi pozitive, care utilizează o coada găleții pentru a obține un timp de funcționare

|
)

{\displaystyle O(||+V|C)|. Utilizarea unui Arborele Van Emde Boas pe măsură ce coada de prioritate
aduce complexitatea la

jurnal

ŞI ŞAPTEZE

jurnal

ŞI ŞAPTEZE

{\displaystyle O(|E|\log \log C)} (Ahuja și colab. 1990). O altă variantă interesantă bazată pe o
combinație a unui nou heap radix și bine-cunoscuta grămadă Fibonacci se execută în timp

jurnal
ŞI ŞAPTEZE

{\displaystyle O(||+V|\sqrt |\log C{{)} (Ahuja și colab. 1990). În cele din urmă, cei mai buni algoritmi în
acest caz special sunt următorii. Algoritmul dat de (Thorup 2000) rulează în

jurnal

ŞI ŞAPTEZE

jurnal

ŞI ŞAPTEZE

{\displaystyle O(|E|\log \log |V|)} timpul și algoritmul dat de (Raman 1997) rulează în

|
|

min

jurnal

ŞI ŞAPTEZE

şi

,în

jurnal

ŞI ŞAPTEZE

4
+

şi

{\displaystyle O(|E|V+\min\|(\log |V{)^|1/3|\varepsilon {,(\log C)^+1/4}\varepsilon {\+)}timp.

S-ar putea să vă placă și