ebooksgratis.com

See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Dijkstrův algoritmus - Wikipedie, otevřená encyklopedie

Dijkstrův algoritmus

Z Wikipedie, otevřené encyklopedie

Běh Dijkstrova algoritmu na malém grafu při němž dojde ke dvěma relaxacím
Běh Dijkstrova algoritmu na malém grafu při němž dojde ke dvěma relaxacím

Dijkstrův algoritmus je algoritmus sloužící k nalezení nejkratší cesty v grafu. Je konečný (pro jakýkoliv konečný vstup algoritmus skončí), protože v každém průchodu cyklu se do množiny navštívených uzlů přidá právě jeden uzel, průchodů cyklem je tedy nejvýše tolik, kolik má graf vrcholů. Funguje nad hranově kladně ohodnoceným grafem (neohodnocený graf lze však na ohodnocený snadno převést). Pro grafy s hranami se záporným ohodnocením se obvykle používá pomalejší Bellman-Fordův algoritmus.

Algoritmus poprvé popsal nizozemský informatik Edsger Dijkstra.

Obsah

[editovat] Popis algoritmu

Mějme graf G, v němž hledáme nejkratší cestu. Řekněme, že V je množina všech vrcholů grafu G a množina E obsahuje všechny hrany grafu G. Algoritmus pracuje tak, že si pro každý vrchol v z V pamatuje délku nejkratší cesty, kterou se k němu dá dostat. Označme tuto hodnotu jako d[v]. Na začátku mají všechny vrcholy v hodnotu d[v]=∞, kromě počátečního vrcholu s, který má d[s]=0. Nekonečno symbolizuje, že neznáme cestu k vrcholu.

Dále si algoritmus udržuje množiny Z a N, kde Z obsahuje už navštívené vrcholy a N dosud nenavštívené. Algoritmus pracuje v cyklu tak dlouho, dokud N není prázdná. V každém průchodu cyklu se přidá jeden vrchol vmin z N do Z, a to takový, který má nejmenší hodnotu d[v] ze všech vrcholů v z N.

Pro každý vrchol u, do kterého vede hrana (označme její délku jako l(vmin,u)) z vmin, se provede následující operace: pokud (d[vmin] + l(vmin,u)) < d[u], pak do d[u] přiřaď hodnotu d[vmin] + l(vmin,u), jinak neprováděj nic.

Až algoritmus skončí, potom pro každý vrchol v z V je délka jeho nejkratší cesty od počátečního vrcholu s uložena v d[v].

[editovat] Pseudokód

 1  function Dijkstra(E, V, s):
 2     for each vertex v in E:           // Inicializace
 3         d[v] := infinity              // Zatím neznámá vzdálenost z s do v
 4         p[v] := undefined
 5     d[s] := 0                         // Vzdálenost z s do s
 6     N := E                            // Všechny dosud nenavštívené vrcholy
 7     while N is not empty:             // Samotný algoritmus
 8         u := extract_min(N)           // Vezměme "nejlepší" vrchol                          
 9         for each neighbor v of u:
10             alt = d[u] + l(u, v)
11             if alt < d[v]              
12                 d[v] := alt
13                 p[v] := u

V případě, že nás zajímá pouze nejkratší cesta mezi zdrojovým a cílovým vrcholem, můžeme ukončit hledání na řádce 9 if u = target. Cestu ze zdroje do cíle pak zjistíme cyklem:

1 S := empty sequence 
2 u := target
3 while defined p[u]
4     insert u at the beginning of S
5     u := p[u]

Obecnější problém je nalezení nejkratších cest mezi zdrojovým vrcholem a všemi ostatními (případně nějakou jejich podmnožinou). V tomto případě je nutné v poli p[] ukládat všechny vrcholy splňující relaxační podmínku.

[editovat] Efektivita algoritmu

Nejjednodušší implementace Dijkstrova algoritmu používá pro uložení prioritní fronty pole a operace Extract-Min(Q) je lineární prohledávání všech vrcholů v Q. V tomto případě je asymptotická časová složitost O(|V|2+|E|), kde |V| je počet vrcholů a |E| počet hran.

Pro řídké grafy (grafy s počtem hran mnohem menším než |V|2) může být Dijkstrův algoritmus implementován mnohem efektivněji tím, že se graf ukládá pomocí seznamu sousedů a funkce Extract-Min se implementuje pomocí binární nebo Fibonacciho haldy. Poté algoritmus běží v čase O(( | E | + | V | )log | V | ), Fibonacciho halda čas zlepší na O( | E | + | V | log | V | ).

[editovat] Související články

[editovat] Reference

  • E. W. Dijkstra: A note on two problems in connexion with graphs. In: Numerische Mathematik. 1 (1959), S. 269–271
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, a Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Sekce 24.3: Dijkstra's algorithm, pp.595–601.
  • Jakub Černý: Nejkratší cesta v grafu, in: Základní grafové algoritmy (PDF)

[editovat] Externí odkazy


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -