\input ../sgr.tex
-\prednaska{13}{NejkratĹÄ\84Ä\82 cesty}{}
+\prednaska{13}{Nejkratšà cesty}{}
\def\ppsp{1-1}
\def\sssp{1-$n$}
\def\apsp{$n$-$n$}
\def\astar{A\kern-0.15em *}
-ProblĂŠm hledĂĄnĂ nejkratĹĄĂ cesty v~(obvykle ohodnocenĂŠm orientovanĂŠm) grafu
-provÄ\82Ä\84zÄ\82 teorii grafovÄ\82Ë\9dch algoritmĹŻ od~samÄ\82Ë\9dch poÃ\84Â\8dÄ\82Ä\84tkĹŻ. ZÄ\82Ä\84kladnÄ\82 algoritmy
-pro hledÄ\82Ä\84nÄ\82 cest jsou nedÄ\82Âlnou souÃ\84Â\8dÄ\82Ä\84stÄ\82 zÄ\82Ä\84kladnÄ\82Âch kursĹŻ programovÄ\82Ä\84nÄ\82Â
-a algoritmĹŻ, my se budeme vÃ\84Â\9bnovat zejmÄ\82Å na rĹŻznÄ\82Ë\9dm jejich vylepĹÄ\84enÄ\82Âm.
+Problém hledání nejkratší cesty v~(obvykle ohodnoceném orientovaném) grafu
+provázà teorii grafových algoritmů od~samých poÄ\8dátků. Základnà algoritmy
+pro hledánà cest jsou nedÃlnou souÄ\8dástà základnÃch kursů programovánÃ
+a algoritmů, my se budeme vÄ\9bnovat zejména různým jejich vylepÅ¡enÃm.
-UvaĹžujme tedy nÃ\84Â\9bjakÄ\82Ë\9d orientovanÄ\82Ë\9d graf, jehoĹž kaĹždÄ\82Ä\84 hrana~$e$ je opatĹÂ\99ena
-{\I dÄ\82Å lkou} $\ell(e)\in{\bb R}$. MnoĹžinÃ\84Â\9b hran (tĹÂ\99eba sledu nebo cestÃ\84Â\9b)
-pak pĹ\99iĹ\99adĂme dĂŠlku rovnou souÄ\8dtu dĂŠlek jednotlivĂ˝ch hran.
+Uvažujme tedy nÄ\9bjaký orientovaný graf, jehož každá hrana~$e$ je opatÅ\99ena
+{\I délkou} $\ell(e)\in{\bb R}$. MnožinÄ\9b hran (tÅ\99eba sledu nebo cestÄ\9b)
+pak přiřadíme délku rovnou součtu délek jednotlivých hran.
-Pro vrcholy $u,v$ definujeme jejich {\I vzdÄ\82Ä\84lenost} $d(u,v)$ jako nejmenĹÄ\84Ä\82Â
-moĹžnou dÄ\82Å lku cesty z~$u$ do~$v$ (jelikoĹž cest je v~grafu koneÃ\84Â\8dnÃ\84Â\9b mnoho,
-minimum vĹždy existuje). Pokud z~$u$ do~$v$ ĹžÄ\82Ä\84dnÄ\82Ä\84 cesta nevede, poloĹžÄ\82Âme
+Pro vrcholy $u,v$ definujeme jejich {\I vzdálenost} $d(u,v)$ jako nejmenÅ¡Ã
+možnou délku cesty z~$u$ do~$v$ (jelikož cest je v~grafu koneÄ\8dnÄ\9b mnoho,
+minimum vždy existuje). Pokud z~$u$ do~$v$ žádná cesta nevede, položÃme
$d(u,v) := \infty$.
-Obvykle se studujĂ nĂĄsledujĂcĂ tĹ\99i problĂŠmy:
+Obvykle se studují následující tři problémy:
\itemize\ibull
-\:{\bo 1-1} neboli {\bo P2PSP} (Point to Point Shortest Path) -- chceme nalÄ\82Å zt nejkratĹÄ\84Ä\82Â
- cestu z~danÄ\82Å ho vrcholu~$u$ do~danÄ\82Å ho vrcholu~$v$. (Pokud je nejkratĹÄ\84Ä\82Âch cest
- vÄ\82Âce, tak libovolnou z~nich.)
-\:{\bo 1-n} neboli {\bo SSSP} (Single Source Shortest Paths) -- pro danĂ˝ vrchol~$u$ chceme
- nalĂŠzt nejkratĹĄĂ cesty do~vĹĄech ostatnĂch vrcholĹŻ.
-\:{\bo n-n} neboli {\bo APSP} (All Pairs Shortest Paths) -- zajÄ\82ÂmajÄ\82 nÄ\82Ä\84s nejkratĹÄ\84Ä\82 cesty
- mezi vĹĄemi dvojicemi vrcholĹŻ.
+\:{\bo 1-1} neboli {\bo P2PSP} (Point to Point Shortest Path) -- chceme nalézt nejkratÅ¡Ã
+ cestu z~daného vrcholu~$u$ do~daného vrcholu~$v$. (Pokud je nejkratÅ¡Ãch cest
+ vÃce, tak libovolnou z~nich.)
+\:{\bo 1-n} neboli {\bo SSSP} (Single Source Shortest Paths) -- pro daný vrchol~$u$ chceme
+ nalézt nejkratší cesty do~všech ostatních vrcholů.
+\:{\bo n-n} neboli {\bo APSP} (All Pairs Shortest Paths) -- zajÃmajà nás nejkratÅ¡Ã cesty
+ mezi všemi dvojicemi vrcholů.
\endlist
-PĹÂ\99ekvapivÃ\84Â\9b, tak obecnÃ\84Â\9b, jak jsme si uvedenÄ\82Å problÄ\82Å my definovali, je neumÄ\82Âme
-Ĺ\99eĹĄit v~polynomiĂĄlnĂm Ä\8dase: pro grafy, kterĂŠ mohou obsahovat hrany zĂĄpornĂ˝ch
-dĂŠlek bez jakĂ˝chkoliv omezenĂ, je totiĹž hledĂĄnĂ nejkratĹĄĂ cesty NP-tÄ\9bĹžkĂŠ
-(lze na~nÄ\9bj snadno pĹ\99evĂŠst existenci hamiltonovskĂŠ cesty). VĹĄechny znĂĄmĂŠ
-polynomiÄ\82Ä\84lnÄ\82 algoritmy totiĹž mÄ\82Âsto nejkratĹÄ\84Ä\82 cesty hledajÄ\82 nejkratĹÄ\84Ä\82 sled
--- nijak nekontrolujĂ, zda cesta neprojde jednĂm vrcholem vĂcekrĂĄt.
-
-NaĹĄtÄ\9bstĂ pro nĂĄs je to v~grafech bez cyklĹŻ zĂĄpornĂŠ dĂŠlky totĂŠĹž: pokud se
-v~nalezenÄ\82Å m sledu vyskytne cyklus, mĹŻĹžeme jej \uv{vystĹÂ\99ihnout} a tÄ\82Âm zÄ\82Âskat
-sled, kterÄ\82Ë\9d nenÄ\82 delĹÄ\84Ä\82 a~kterÄ\82Ë\9d mÄ\82Ä\84 mÄ\82Å nÃ\84Â\9b hran. KaĹždÄ\82Ë\9d nejkratĹÄ\84Ä\82 sled tak
-mĹŻĹžeme upravit na~stejnÃ\84Â\9b dlouhou cestu.
-V~grafech bez zåporných cyklů je tedy jedno, zda hledåme sled nebo cestu;
-naopak vyskytne-li se zÄ\82Ä\84pornÄ\82Ë\9d cyklus dosaĹžitelnÄ\82Ë\9d z~poÃ\84Â\8dÄ\82Ä\84teÃ\84Â\8dnÄ\82Âho vrcholu,
-nejkratĹÄ\84Ä\82 sled ani neexistuje.
-
-NavÄ\82Âc se nÄ\82Ä\84m bude hodit, Ĺže kaĹždÄ\82Ë\9d prefix nejkratĹÄ\84Ä\82 cesty je opÃ\84Â\9bt nejkratĹÄ\84Ä\82Â
-cesta. JinÄ\82Ë\9dmi slovy pokud nÃ\84Â\9bkterÄ\82Ä\84 z~nejkratĹÄ\84Ä\82Âch cest z~$u$ do~$v$ vede
-pĹÂ\99es nÃ\84Â\9bjakÄ\82Ë\9d vrchol~$w$, pak jejÄ\82 Ã\84Â\8dÄ\82Ä\84st z~$u$ do~$w$ je jednou z~nejkratĹÄ\84Ä\82Âch
-cest z~$u$ do~$w$. (V~opaÃ\84Â\8dnÄ\82Å m pĹÂ\99Ä\82ÂpadÃ\84Â\9b bychom mohli Ä\82Å\9fsek $u\ldots w$ vymÃ\84Â\9bnit za~kratĹÄ\84Ä\82Â.)
-
-DĂky tĂŠto {\I prefixovĂŠ vlastnosti} mĹŻĹžeme pro kaĹždĂ˝ vrchol~$u$ sestrojit jeho {\I strom
-nejkratĹĄĂch cest}~${\cal T}(u)$. To je nÄ\9bjakĂ˝ podgraf grafu~$G$, kterĂ˝ mĂĄ tvar
-stromu zakoĹ\99enÄ\9bnĂŠho v~$u$ a orientovanĂŠho smÄ\9brem od~koĹ\99ene, a~platĂ pro nÄ\9bj, Ĺže
-pro kaĹždĂ˝ vrchol~$v$ je (jedinĂĄ) cesta z~$u$ do~$v$ v~tomto stromu jednou
-z~nejkratĹÄ\84Ä\82Âch cest z~$u$ do~$v$ v~pĹŻvodnÄ\82Âm grafu.
-
-\s{PozorovĂĄnĂ:} Strom nejkratĹĄĂch cest vĹždy existuje.
+PÅ\99ekvapivÄ\9b, tak obecnÄ\9b, jak jsme si uvedené problémy definovali, je neumÃme
+řešit v~polynomiálním čase: pro grafy, které mohou obsahovat hrany záporných
+délek bez jakýchkoliv omezení, je totiž hledání nejkratší cesty NP-těžké
+(lze na~něj snadno převést existenci hamiltonovské cesty). Všechny známé
+polynomiálnà algoritmy totiž mÃsto nejkratÅ¡Ã cesty hledajà nejkratÅ¡Ã sled
+-- nijak nekontrolují, zda cesta neprojde jedním vrcholem vícekrát.
+
+Naštěstí pro nás je to v~grafech bez cyklů záporné délky totéž: pokud se
+v~nalezeném sledu vyskytne cyklus, můžeme jej \uv{vystÅ\99ihnout} a tÃm zÃskat
+sled, který nenà delÅ¡Ã a~který má ménÄ\9b hran. Každý nejkratÅ¡Ã sled tak
+můžeme upravit na~stejnÄ\9b dlouhou cestu.
+V~grafech bez záporných cyklů je tedy jedno, zda hledáme sled nebo cestu;
+naopak vyskytne-li se záporný cyklus dosažitelný z~poÄ\8dáteÄ\8dnÃho vrcholu,
+nejkratšà sled ani neexistuje.
+
+NavÃc se nám bude hodit, že každý prefix nejkratÅ¡Ã cesty je opÄ\9bt nejkratÅ¡Ã
+cesta. Jinými slovy pokud nÄ\9bkterá z~nejkratÅ¡Ãch cest z~$u$ do~$v$ vede
+pÅ\99es nÄ\9bjaký vrchol~$w$, pak jejà Ä\8dást z~$u$ do~$w$ je jednou z~nejkratÅ¡Ãch
+cest z~$u$ do~$w$. (V~opaÄ\8dném pÅ\99ÃpadÄ\9b bychom mohli úsek $u\ldots w$ vymÄ\9bnit za~kratÅ¡Ã.)
+
+Díky této {\I prefixové vlastnosti} můžeme pro každý vrchol~$u$ sestrojit jeho {\I strom
+nejkratších cest}~${\cal T}(u)$. To je nějaký podgraf grafu~$G$, který má tvar
+stromu zakořeněného v~$u$ a orientovaného směrem od~kořene, a~platí pro něj, že
+pro každý vrchol~$v$ je (jediná) cesta z~$u$ do~$v$ v~tomto stromu jednou
+z~nejkratÅ¡Ãch cest z~$u$ do~$v$ v~původnÃm grafu.
+
+\s{Pozorování:} Strom nejkratších cest vždy existuje.
\proof
-NechĹĽ $u=v_1,\ldots,v_n$ jsou vĹÄ\84echny vrcholy grafu~$G$. IndukcÄ\82 budeme
-dokazovat, Ĺže pro kaĹždÄ\82Å ~$i$ existuje strom~${\cal T}_i$, v~nÃ\84Â\9bmĹž se nachÄ\82Ä\84zejÄ\82 nejkratĹÄ\84Ä\82Â
-cesty z~vrcholu~$u$ do vrcholĹŻ $v_1,\ldots,v_i$. Pro $i=1$ staÄ\8dĂ uvĂĄĹžit
-strom obsahujÄ\82ÂcÄ\82Â jedinÄ\82Ë\9d vrchol~$u$. Ze~stromu ${\cal T}_{i-1}$ pak vyrobÄ\82Âme
-strom ${\cal T}_i$ takto: Nalezneme v~$G$ nejkratĹÄ\84Ä\82 cestu z~$u$ do~$v_i$
-a oznaÃ\84Â\8dÄ\82Âme~$z$ poslednÄ\82 vrchol na~tÄ\82Å to cestÃ\84Â\9b, kterÄ\82Ë\9d se jeĹÄ\84tÃ\84Â\9b vyskytuje v~${\cal T}_{i-1}$.
-Ă\9asek nejkratĹĄĂ cesty od~$z$ do~$v_i$ pak pĹ\99idĂĄme do~${\cal T}_{i-1}$
-a dĂky prefixovĂŠ vlastnosti bude i cesta z~$u$ do~$v_i$ v~novĂŠm stromu
-nejkratĹÄ\84Ä\82Â.
+Nechť $u=v_1,\ldots,v_n$ jsou všechny vrcholy grafu~$G$. Indukcà budeme
+dokazovat, že pro každé~$i$ existuje strom~${\cal T}_i$, v~nÄ\9bmž se nacházejà nejkratÅ¡Ã
+cesty z~vrcholu~$u$ do vrcholů $v_1,\ldots,v_i$. Pro $i=1$ stačí uvážit
+strom obsahujÃcà jediný vrchol~$u$. Ze~stromu ${\cal T}_{i-1}$ pak vyrobÃme
+strom ${\cal T}_i$ takto: Nalezneme v~$G$ nejkratšà cestu z~$u$ do~$v_i$
+a oznaÄ\8dÃme~$z$ poslednà vrchol na~této cestÄ\9b, který se jeÅ¡tÄ\9b vyskytuje v~${\cal T}_{i-1}$.
+Úsek nejkratší cesty od~$z$ do~$v_i$ pak přidáme do~${\cal T}_{i-1}$
+a díky prefixové vlastnosti bude i cesta z~$u$ do~$v_i$ v~novém stromu
+nejkratÅ¡Ã.
\qed
-Zbývå se dohodnout, v~jakÊm tvaru majà naťe algoritmy vydåvat výsledek.
-U~problÊmů typu \ppsp{} je nejjednoduťťà vypsat celou cestu, u~\sssp{} můŞeme jako výstup
-vydat strom nejkratĹÄ\84Ä\82Âch cest z~danÄ\82Å ho poÃ\84Â\8dÄ\82Ä\84tku (vĹÄ\84imnÃ\84Â\9bte si, Ĺže staÃ\84Â\8dÄ\82Â
-uvÄ\82Å st pĹÂ\99edchĹŻdce kaĹždÄ\82Å ho vrcholu), u~\apsp{} vydÄ\82Ä\84me strom nejkratĹÄ\84Ä\82Âch cest
-pro kaŞdý ze~zdrojových vrcholů.
+Zbývá se dohodnout, v~jakém tvaru mají naše algoritmy vydávat výsledek.
+U~problémů typu \ppsp{} je nejjednodušší vypsat celou cestu, u~\sssp{} můžeme jako výstup
+vydat strom nejkratÅ¡Ãch cest z~daného poÄ\8dátku (vÅ¡imnÄ\9bte si, že staÄ\8dÃ
+uvést pÅ\99edchůdce každého vrcholu), u~\apsp{} vydáme strom nejkratÅ¡Ãch cest
+pro každý ze~zdrojových vrcholů.
-Ä\8casto se ovĹĄem ukĂĄĹže, Ĺže podstatnĂĄ Ä\8dĂĄst problĂŠmu se skrĂ˝vĂĄ v~samotnĂŠm
-vÄ\82Ë\9dpoÃ\84Â\8dtu vzdÄ\82Ä\84lenostÄ\82 a sestrojenÄ\82 pĹÂ\99edchĹŻdcĹŻ je triviÄ\82Ä\84lnÄ\82Âm rozĹÄ\84Ä\82ÂĹÂ\99enÄ\82Âm algoritmu.
-Budeme tedy obvykle jen poÄ\8dĂtat vzdĂĄlenosti a samotnou rekonstrukci cest
-ponechÄ\82Ä\84me Ã\84Â\8dtenÄ\82Ä\84ĹÂ\99i jako snadnÄ\82Å cviÃ\84Â\8denÄ\82Â.
+Často se ovšem ukáže, že podstatná část problému se skrývá v~samotném
+výpoÄ\8dtu vzdálenostà a sestrojenà pÅ\99edchůdců je triviálnÃm rozÅ¡ÃÅ\99enÃm algoritmu.
+Budeme tedy obvykle jen počítat vzdálenosti a samotnou rekonstrukci cest
+ponecháme Ä\8dtenáÅ\99i jako snadné cviÄ\8denÃ.
-\h{RelaxaÃ\84Â\8dnÄ\82Â algoritmus}
+\h{RelaxaÄ\8dnà algoritmus}
-ZaÄ\8dnÄ\9bme problĂŠmem \sssp{} a oznaÄ\8dme~$u$ vĂ˝chozĂ vrchol. VÄ\9btĹĄina znĂĄmĂ˝ch
-algoritmĹŻ funguje tak, Ĺže pro kaĹždÄ\82Ë\9d vrchol~$v$ udrĹžujÄ\82 ohodnocenÄ\82 $h(v)$,
-kterÄ\82Å v~kaĹždÄ\82Å m okamĹžiku odpovÄ\82ÂdÄ\82Ä\84 dÄ\82Å lce nÃ\84Â\9bjakÄ\82Å ho sledu z~$u$ do~$v$. PostupnÃ\84Â\9b
-toto ohodnocenĂ upravujĂ, aĹž se z~nÄ\9bj stane vzdĂĄlenost $d(u,v)$ a algoritmus
-se mĹŻĹže zastavit.
+Začněme problémem \sssp{} a označme~$u$ výchozí vrchol. Většina známých
+algoritmů funguje tak, že pro každý vrchol~$v$ udržujà ohodnocenà $h(v)$,
+které v~každém okamžiku odpovÃdá délce nÄ\9bjakého sledu z~$u$ do~$v$. PostupnÄ\9b
+toto ohodnocení upravují, až se z~něj stane vzdálenost $d(u,v)$ a algoritmus
+se může zastavit.
-Vhodnou operacĂ pro vylepĹĄovĂĄnĂ ohodnocenĂ je takzvanĂĄ {\I relaxace.}
-Vybereme si nÄ\9bjakĂ˝ vrchol~$v$ a pro vĹĄechny jeho sousedy~$w$ spoÄ\8dĂtĂĄme
-$h(v) + \ell(v,w)$, tedy dÄ\82Å lku sledu, kterÄ\82Ë\9d vznikne rozĹÄ\84Ä\82ÂĹÂ\99enÄ\82Âm aktuÄ\82Ä\84lnÄ\82Âho
-sledu do~$v$ o~hranu $(v,w)$. Pokud je tato hodnota menĹĄĂ neĹž~$h(w)$,
-tak jĂ $h(w)$ pĹ\99epĂĹĄeme.
+Vhodnou operací pro vylepšování ohodnocení je takzvaná {\I relaxace.}
+Vybereme si nějaký vrchol~$v$ a pro všechny jeho sousedy~$w$ spočítáme
+$h(v) + \ell(v,w)$, tedy délku sledu, který vznikne rozÅ¡ÃÅ\99enÃm aktuálnÃho
+sledu do~$v$ o~hranu $(v,w)$. Pokud je tato hodnota menší než~$h(w)$,
+tak jí $h(w)$ přepíšeme.
-Abychom zabrÄ\82Ä\84nili opakovanÄ\82Ë\9dm relaxacÄ\82Âm tÄ\82Å hoĹž vrcholu, kterÄ\82Å nic nezmÃ\84Â\9bnÄ\82Â,
-budeme rozliĹÄ\84ovat tĹÂ\99i stavy vrcholĹŻ: {\I nevidÃ\84Â\9bn} (jeĹÄ\84tÃ\84Â\9b jsme ho nenavĹÄ\84tÄ\82Âvili),
-{\I otevĹÂ\99en} (zmÃ\84Â\9bnilo se ohodnocenÄ\82Â, Ã\84Â\8dasem chceme relaxovat) a {\I uzavĹÂ\99en}
-(uĹž jsme relaxovali a nenÄ\82 potĹÂ\99eba znovu).
+Abychom zabránili opakovaným relaxacÃm téhož vrcholu, které nic nezmÄ\9bnÃ,
+budeme rozliÅ¡ovat tÅ\99i stavy vrcholů: {\I nevidÄ\9bn} (jeÅ¡tÄ\9b jsme ho nenavÅ¡tÃvili),
+{\I otevÅ\99en} (zmÄ\9bnilo se ohodnocenÃ, Ä\8dasem chceme relaxovat) a {\I uzavÅ\99en}
+(už jsme relaxovali a nenà potÅ\99eba znovu).
-NÄ\82Ä\84ĹÄ\84 algoritmus bude fungovat nÄ\82Ä\84sledovnÃ\84Â\9b:
+Náš algoritmus bude fungovat následovnÄ\9b:
\algo
\:$h(*)\leftarrow \infty$, $h(u)\leftarrow 0$.
-\:$\<stav>(*)\leftarrow\<nevidÃ\84Â\9bn>$, $\<stav>(u)\leftarrow\<otevĹÂ\99en>$.
-\:Dokud existujĂ otevĹ\99enĂŠ vrcholy, opakujeme:
-\::$v\leftarrow\hbox{libovolnĂ˝ otevĹ\99enĂ˝ vrchol}$.
-\::$\<stav>(v)\leftarrow\<uzavĹÂ\99en>$.
+\:$\<stav>(*)\leftarrow\<nevidÄ\9bn>$, $\<stav>(u)\leftarrow\<otevÅ\99en>$.
+\:Dokud existují otevřené vrcholy, opakujeme:
+\::$v\leftarrow\hbox{libovolný otevřený vrchol}$.
+\::$\<stav>(v)\leftarrow\<uzavÅ\99en>$.
\::Relaxujeme~$v$:
-\:::Pro vĹĄechny hrany $vw$ opakujeme:
+\:::Pro všechny hrany $vw$ opakujeme:
\::::Je-li $h(w) > h(v) + \ell(v,w)$:
\:::::$h(w)\leftarrow h(v) + \ell(v,w)$.
-\:::::$\<stav>(w)\leftarrow\<otevĹÂ\99en>$.
-\:VrĂĄtĂme vĂ˝sledek $d(u,v)=h(v)$ pro vĹĄechna~$v$.
+\:::::$\<stav>(w)\leftarrow\<otevÅ\99en>$.
+\:Vrátíme výsledek $d(u,v)=h(v)$ pro všechna~$v$.
\endalgo
-PodobnÄ\9b jako u~minimĂĄlnĂch koster, i zde se jednĂĄ o~meta-algoritmus, protoĹže
-v~kroku~4 nespecifikuje, kterÄ\82Ë\9d z~otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ vybÄ\82ÂrÄ\82Ä\84. PĹÂ\99esto
-ale mĹŻĹžeme dokĂĄzat nÄ\9bkolik zajĂmavĂ˝ch tvrzenĂ, kterĂĄ na~konkrĂŠtnĂm zpĹŻsobu
-vÄ\82Ë\9dbÃ\84Â\9bru nezÄ\82Ä\84visejÄ\82Â.
+Podobně jako u~minimálních koster, i zde se jedná o~meta-algoritmus, protože
+v~kroku~4 nespecifikuje, který z~otevÅ\99ených vrcholů vybÃrá. PÅ\99esto
+ale můžeme dokázat několik zajímavých tvrzení, která na~konkrétním způsobu
+výbÄ\9bru nezávisejÃ.
-\s{VÄ\9bta:} SpustĂme-li meta-algoritmus na graf bez zĂĄpornĂ˝ch cyklĹŻ, pak:
+\s{Věta:} Spustíme-li meta-algoritmus na graf bez záporných cyklů, pak:
\numlist\nparen
-\:OhodnocenĂ $h(v)$ vĹždy odpovĂdĂĄ dĂŠlce nÄ\9bjakĂŠho sledu z~$u$ do~$v$.
-\:$h(v)$ dokonce odpovĂdĂĄ dĂŠlce nÄ\9bjakĂŠ cesty z~$u$ do~$v$.
-\:Algoritmus se vĹždy zastavÄ\82Â.
-\:Po zastavenĂ jsou oznaÄ\8deny jako uzavĹ\99enĂŠ prĂĄvÄ\9b ty vrcholy, kterĂŠ jsou dosaĹžitelnĂŠ z~$u$.
-\:Po zastavenĂ majĂ koneÄ\8dnĂŠ~$h(v)$ prĂĄvÄ\9b vĹĄechny uzavĹ\99enĂŠ vrcholy.
-\:Pro kaĹždĂ˝ dosaĹžitelnĂ˝ vrchol je na~konci $h(v)$ rovno $d(u,v)$.
+\:Ohodnocení $h(v)$ vždy odpovídá délce nějakého sledu z~$u$ do~$v$.
+\:$h(v)$ dokonce odpovídá délce nějaké cesty z~$u$ do~$v$.
+\:Algoritmus se vždy zastavÃ.
+\:Po zastavení jsou označeny jako uzavřené právě ty vrcholy, které jsou dosažitelné z~$u$.
+\:Po zastavení mají konečné~$h(v)$ právě všechny uzavřené vrcholy.
+\:Pro každý dosažitelný vrchol je na~konci $h(v)$ rovno $d(u,v)$.
\endlist
\proof
\numlist\nparen
-\:DokĂĄĹžeme indukcĂ podle poÄ\8dtu krokĹŻ algoritmu.
-\:StaÄ\8dĂ rozmyslet, v~jakĂŠ situaci by vytvoĹ\99enĂ˝ sled mohl obsahovat cyklus.
-\:Cest, a~tÄ\82Âm pÄ\82Ä\84dem i moĹžnÄ\82Ë\9dch hodnot~$h(v)$ pro kaĹždÄ\82Ë\9d~$v$, je koneÃ\84Â\8dnÃ\84Â\9b mnoho.
-\:Implikace $\Rightarrow$ je triviĂĄlnĂ, pro $\Leftarrow$ staÄ\8dĂ uvĂĄĹžit neuzavĹ\99enĂ˝ vrchol,
- kterÄ\82Ë\9d je dosaĹžitelnÄ\82Ë\9d z~$u$ cestou o~co nejmenĹÄ\84Ä\82Âm poÃ\84Â\8dtu hran.
-\:$h(v)$ nastavujeme na~koneÄ\8dnou hodnotu prĂĄvÄ\9b v~okamĹžicĂch, kdy se vrchol stĂĄvĂĄ otevĹ\99enĂ˝m.
- KaĹždÄ\82Ë\9d otevĹÂ\99enÄ\82Ë\9d vrchol je Ã\84Â\8dasem uzavĹÂ\99en.
+\:Dokážeme indukcí podle počtu kroků algoritmu.
+\:Stačí rozmyslet, v~jaké situaci by vytvořený sled mohl obsahovat cyklus.
+\:Cest, a~tÃm pádem i možných hodnot~$h(v)$ pro každý~$v$, je koneÄ\8dnÄ\9b mnoho.
+\:Implikace $\Rightarrow$ je triviální, pro $\Leftarrow$ stačí uvážit neuzavřený vrchol,
+ který je dosažitelný z~$u$ cestou o~co nejmenÅ¡Ãm poÄ\8dtu hran.
+\:$h(v)$ nastavujeme na~konečnou hodnotu právě v~okamžicích, kdy se vrchol stává otevřeným.
+ Každý otevÅ\99ený vrchol je Ä\8dasem uzavÅ\99en.
\:Kdyby tomu tak nebylo,
- vyberme si ze~\uv{ĹÄ\84patnÄ\82Ë\9dch} vrcholĹŻ~$v$ takovÄ\82Ë\9d, pro nÃ\84Â\9bjĹž obsahuje nejkratĹÄ\84Ä\82 cesta z~$u$ do~$v$
- nejmenĹĄĂ moĹžnĂ˝ poÄ\8det hran. Vrchol~$v$ je zajistĂŠ rĹŻznĂ˝ od~$u$, takĹže mĂĄ na~tĂŠto cestÄ\9b nÄ\9bjakĂŠho
- pĹÂ\99edchĹŻdce~$w$. PĹÂ\99itom~$w$ uĹž musÄ\82 bÄ\82Ë\9dt ohodnocen sprÄ\82Ä\84vnÃ\84Â\9b a relaxace, kterÄ\82Ä\84 mu toto ohodnocenÄ\82Â
- nastavila, ho musela prohlÄ\82Ä\84sit za~otevĹÂ\99enÄ\82Ë\9d. JenĹže kaĹždÄ\82Ë\9d otevĹÂ\99enÄ\82Ë\9d vrchol je pozdÃ\84Â\9bji uzavĹÂ\99en,
- takĹže~$w$ potĂŠ musel bĂ˝t jeĹĄtÄ\9b alespoĹ\88 jednou relaxovĂĄn, coĹž muselo snĂĹžit~$h(v)$ na sprĂĄvnou
- vzdĂĄlenost.
+ vyberme si ze~\uv{Å¡patných} vrcholů~$v$ takový, pro nÄ\9bjž obsahuje nejkratÅ¡Ã cesta z~$u$ do~$v$
+ nejmenší možný počet hran. Vrchol~$v$ je zajisté různý od~$u$, takže má na~této cestě nějakého
+ pÅ\99edchůdce~$w$. PÅ\99itom~$w$ už musà být ohodnocen správnÄ\9b a relaxace, která mu toto ohodnocenÃ
+ nastavila, ho musela prohlásit za~otevÅ\99ený. Jenže každý otevÅ\99ený vrchol je pozdÄ\9bji uzavÅ\99en,
+ takže~$w$ poté musel být ještě alespoň jednou relaxován, což muselo snížit~$h(v)$ na správnou
+ vzdálenost.
\qeditem
\endlist
-\>DokĂĄzali jsme tedy, Ĺže meta-algoritmus pro libovolnou implementaci kroku~4
-spoÄ\8dĂtĂĄ sprĂĄvnĂŠ vzdĂĄlenosti.
+\>Dokázali jsme tedy, že meta-algoritmus pro libovolnou implementaci kroku~4
+spočítá správné vzdálenosti.
\medskip
-\s{CviÃ\84Â\8denÄ\82Â:}
+\s{CviÄ\8denÃ:}
\itemize\ibull
-\:NechĹĽ do algoritmu doplnĂme udrĹžovĂĄnĂ pĹ\99edchĹŻdcĹŻ tak, Ĺže v~kroku~9
- pĹ\99enastavĂme pĹ\99edchĹŻdce vrcholu~$w$ na vrchol~$v$. DokaĹžte, Ĺže pĹ\99edchĹŻdci
- dosaĹžitelnĂ˝ch vrcholĹŻ budou tvoĹ\99it strom a Ĺže tento strom bude stromem
- nejkratĹÄ\84Ä\82Âch cest z~vrcholu~$u$.
-\:DokaĹžte, Ĺže pro graf, v~nÄ\9bmĹž je alespoĹ\88 jeden zĂĄpornĂ˝ cyklus dosaĹžitelnĂ˝
- z~poÄ\8dĂĄteÄ\8dnĂho vrcholu, se algoritmus nezastavĂ a ohodnocenĂ vĹĄech vrcholĹŻ
- na cyklu postupnÄ\9b klesnou libovolnÄ\9b hluboko. NedosaĹžitelnĂŠ zĂĄpornĂŠ cykly
- chod algoritmu samozĹÂ\99ejmÃ\84Â\9b nijak neovlivnÄ\82Â.
+\:Nechť do algoritmu doplníme udržování předchůdců tak, že v~kroku~9
+ přenastavíme předchůdce vrcholu~$w$ na vrchol~$v$. Dokažte, že předchůdci
+ dosažitelných vrcholů budou tvořit strom a že tento strom bude stromem
+ nejkratÅ¡Ãch cest z~vrcholu~$u$.
+\:Dokažte, že pro graf, v~němž je alespoň jeden záporný cyklus dosažitelný
+ z~počátečního vrcholu, se algoritmus nezastaví a ohodnocení všech vrcholů
+ na cyklu postupně klesnou libovolně hluboko. Nedosažitelné záporné cykly
+ chod algoritmu samozÅ\99ejmÄ\9b nijak neovlivnÃ.
\endlist
-\h{BellmanĹŻv-FordĹŻv-MooreĹŻv algoritmus}
+\h{Bellmanův-Fordův-Mooreův algoritmus}
-Bellman \cite{bellman:bfm}, Ford \cite{ford:bfm} a Moore objevili nezÄ\82Ä\84visle na sobÃ\84Â\9b algoritmus (ĹÂ\99Ä\82Âkejme mu BFM),
-kterĂ˝ lze v~Ĺ\99eÄ\8di naĹĄeho meta-algoritmu formulovat takto: OtevĹ\99enĂŠ vrcholy
-udrĹžujeme ve~frontÄ\9b (vĹždy relaxujeme vrchol na poÄ\8dĂĄtku fronty, novÄ\9b otevĂranĂŠ
-zaĹÂ\99azujeme na~konec). Co toto pravidlo zpĹŻsobÄ\82Â?
+Bellman \cite{bellman:bfm}, Ford \cite{ford:bfm} a Moore objevili nezávisle na sobÄ\9b algoritmus (Å\99Ãkejme mu BFM),
+který lze v~řeči našeho meta-algoritmu formulovat takto: Otevřené vrcholy
+udržujeme ve~frontě (vždy relaxujeme vrchol na počátku fronty, nově otevírané
+zaÅ\99azujeme na~konec). Co toto pravidlo způsobÃ?
-\s{VÃ\84Â\9bta:} Ã\84Â\8casovÄ\82Ä\84 sloĹžitost algoritmu~BFM Ã\84Â\8dinÄ\82 $\O(nm)$.
+\s{VÄ\9bta:} Ä\8casová složitost algoritmu~BFM Ä\8dinà $\O(nm)$.
\proof
-BÃ\84Â\9bh algoritmu rozdÃ\84Â\9blÄ\82Âme na~fÄ\82Ä\84ze. NultÄ\82Ä\84 fÄ\82Ä\84ze sestÄ\82Ä\84vÄ\82Ä\84 z~vloĹženÄ\82 vrcholu~$u$
-do~fronty. V~$(i+1)$-nĂ fĂĄzi relaxujeme ty vrcholy, kterĂŠ byly do~fronty
-uloĹženy bÄ\9bhem $i$-tĂŠ fĂĄze.
-
-JelikoĹž relaxace vrcholu trvĂĄ lineĂĄrnÄ\9b se stupnÄ\9bm vrcholu a kaĹždĂ˝ vrchol
-se danĂŠ fĂĄze ĂşÄ\8dastnĂ nejvýťe jednou, trvĂĄ jedna fĂĄze $\O(m)$. ZbĂ˝vĂĄ ukĂĄzat,
-Şe fåzà provedeme nejvýťe~$n$.
-
-IndukcÄ\82 dokÄ\82Ä\84Ĺžeme, Ĺže na konci $i$-tÄ\82Å fÄ\82Ä\84ze je kaĹždÄ\82Å ohodnocenÄ\82 $h(v)$ shora omezeno
-dÄ\82Å lkou nejkratĹÄ\84Ä\82Âho z~$uv$-sledĹŻ o~nejvÄ\82Ë\9dĹÄ\84e~$i$ hranÄ\82Ä\84ch. Pro $i=0$ to triviÄ\82Ä\84lnÃ\84Â\9b
-platÄ\82Â. UvaĹžujme nynÄ\82 vrchol~$v$ na konci $(i+1)$-nÄ\82 fÄ\82Ä\84ze a nÃ\84Â\9bjakÄ\82Ë\9d nejkratĹÄ\84Ä\82 $uv$-sled~$P$
-o~$i+1$ hranĂĄch. OznaÄ\8dme $wv$ poslednĂ hranu tohoto sledu a $P'$ sled bez tĂŠto hrany,
-kterĂ˝ tedy mĂĄ dĂŠlku~$i$. Podle indukÄ\8dnĂho pĹ\99edpokladu je na konci $i$-tĂŠ fĂĄze
-$h(w)\le \ell(P')$. Tuto hodnotu zÄ\82Âskalo $h(w)$ nejpozdÃ\84Â\9bji v~$i$-tÄ\82Å fÄ\82Ä\84zi, pĹÂ\99i tom jsme
-vrchol~$w$ otevĹÂ\99eli, takĹže jsme ho nejpozdÃ\84Â\9bji v~$(i+1)$-nÄ\82 fÄ\82Ä\84zi zavĹÂ\99eli a relaxovali.
-Po tĂŠto relaxaci je ovĹĄem $h(v)\le h(w)+\ell(w,v)\le \ell(P') + \ell(w,v) = \ell(P)$.
+BÄ\9bh algoritmu rozdÄ\9blÃme na~fáze. Nultá fáze sestává z~vloženà vrcholu~$u$
+do~fronty. V~$(i+1)$-ní fázi relaxujeme ty vrcholy, které byly do~fronty
+uloženy během $i$-té fáze.
+
+Jelikož relaxace vrcholu trvá lineárně se stupněm vrcholu a každý vrchol
+se dané fáze účastní nejvýše jednou, trvá jedna fáze $\O(m)$. Zbývá ukázat,
+že fází provedeme nejvýše~$n$.
+
+Indukcà dokážeme, že na konci $i$-té fáze je každé ohodnocenà $h(v)$ shora omezeno
+délkou nejkratÅ¡Ãho z~$uv$-sledů o~nejvýše~$i$ hranách. Pro $i=0$ to triviálnÄ\9b
+platÃ. Uvažujme nynà vrchol~$v$ na konci $(i+1)$-nà fáze a nÄ\9bjaký nejkratÅ¡Ã $uv$-sled~$P$
+o~$i+1$ hranách. Označme $wv$ poslední hranu tohoto sledu a $P'$ sled bez této hrany,
+který tedy má délku~$i$. Podle indukčního předpokladu je na konci $i$-té fáze
+$h(w)\le \ell(P')$. Tuto hodnotu zÃskalo $h(w)$ nejpozdÄ\9bji v~$i$-té fázi, pÅ\99i tom jsme
+vrchol~$w$ otevÅ\99eli, takže jsme ho nejpozdÄ\9bji v~$(i+1)$-nà fázi zavÅ\99eli a relaxovali.
+Po této relaxaci je ovšem $h(v)\le h(w)+\ell(w,v)\le \ell(P') + \ell(w,v) = \ell(P)$.
\qed
-\s{CviÃ\84Â\8denÄ\82Â:}
+\s{CviÄ\8denÃ:}
\itemize\ibull
-\:UkaĹžte, Ĺže asymptoticky stejnĂŠ Ä\8dasovĂŠ sloĹžitosti by dosĂĄhl algoritmus,
- kterÄ\82Ë\9d by vrcholy oÃ\84Â\8dÄ\82Âsloval $v_1,\ldots,v_n$ a opakovanÃ\84Â\9b by je v~tomto
- poĹÂ\99adÄ\82 relaxoval tak dlouho, dokud by se ohodnocenÄ\82 mÃ\84Â\9bnila.
-\:Jak algoritmus upravit, aby v~$i$-tĂŠ fĂĄzi spoÄ\8dĂtal minimĂĄlnĂ dĂŠlky sledĹŻ
- o~prĂĄvÄ\9b~$i$ hranĂĄch?
-\:Jak lze algoritmus BFM vyuĹžĂt k~nalezenĂ zĂĄpornĂŠho cyklu?
+\:Ukažte, že asymptoticky stejné časové složitosti by dosáhl algoritmus,
+ který by vrcholy oÄ\8dÃsloval $v_1,\ldots,v_n$ a opakovanÄ\9b by je v~tomto
+ poÅ\99adà relaxoval tak dlouho, dokud by se ohodnocenà mÄ\9bnila.
+\:Jak algoritmus upravit, aby v~$i$-té fázi spočítal minimální délky sledů
+ o~právě~$i$ hranách?
+\:Jak lze algoritmus BFM využít k~nalezení záporného cyklu?
\endlist
-\h{DijkstrĹŻv algoritmus}
+\h{Dijkstrův algoritmus}
-Pokud jsou vĹÄ\84echny dÄ\82Å lky hran nezÄ\82Ä\84pornÄ\82Å , mĹŻĹžeme pouĹžÄ\82Ât efektivnÃ\84Â\9bjĹÄ\84Ä\82 pravidlo
-pro vĂ˝bÄ\9br vrcholu navrĹženĂŠ Dijkstrou \cite{dijkstra:mstandpath}. To Ĺ\99ĂkĂĄ, Ĺže vĹždy relaxujeme ten z~otevĹ\99enĂ˝ch
-vrcholĹŻ, jehoĹž ohodnocenÄ\82 je nejmenĹÄ\84Ä\82Â.
+Pokud jsou vÅ¡echny délky hran nezáporné, můžeme použÃt efektivnÄ\9bjÅ¡Ã pravidlo
+pro výběr vrcholu navržené Dijkstrou \cite{dijkstra:mstandpath}. To říká, že vždy relaxujeme ten z~otevřených
+vrcholů, jehož ohodnocenà je nejmenÅ¡Ã.
-\s{VÃ\84Â\9bta:} DijkstrĹŻv algoritmus uzavÄ\82ÂrÄ\82Ä\84 vrcholy v~poĹÂ\99adÄ\82 podle neklesajÄ\82ÂcÄ\82Â
-vzdÄ\82Ä\84lenosti od~$u$ a kaĹždÄ\82Ë\9d dosaĹžitelnÄ\82Ë\9d vrchol uzavĹÂ\99e prÄ\82Ä\84vÃ\84Â\9b jednou.
+\s{VÄ\9bta:} Dijkstrův algoritmus uzavÃrá vrcholy v~poÅ\99adà podle neklesajÃcÃ
+vzdálenosti od~$u$ a každý dosažitelný vrchol uzavÅ\99e právÄ\9b jednou.
\proof
-IndukcÄ\82 dokÄ\82Ä\84Ĺžeme, Ĺže v~kaĹždÄ\82Å m okamĹžiku majÄ\82 vĹÄ\84echny uzavĹÂ\99enÄ\82Å vrcholy ohodnocenÄ\82Â
-menĹÄ\84Ä\82 nebo rovnÄ\82Å ohodnocenÄ\82Âm vĹÄ\84ech otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ. Na~poÃ\84Â\8dÄ\82Ä\84tku to jistÃ\84Â\9b platÄ\82Â.
-NechĹĽ nynÄ\82 uzavÄ\82ÂrÄ\82Ä\84me vrchol~$v$ s~minimÄ\82Ä\84lnÄ\82Âm $h(v)$ mezi otevĹÂ\99enÄ\82Ë\9dmi. BÃ\84Â\9bhem jeho
-relaxace nemĹŻĹžeme Şådnou hodnotu snĂĹžit pod~$h(v)$, jelikoĹž v~grafu s~nezĂĄpornĂ˝mi
-hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbĂ˝vajĂcĂch otevĹ\99enĂ˝ch vrcholĹŻ
-tedy neklesne pod hodnotu tohoto novÄ\9b uzavĹ\99enĂŠho. Hodnoty dĹ\99Ăve uzavĹ\99enĂ˝ch vrcholĹŻ
-se nemohou nijak zmÃ\84Â\9bnit.
+Indukcà dokážeme, že v~každém okamžiku majà vÅ¡echny uzavÅ\99ené vrcholy ohodnocenÃ
+menÅ¡Ã nebo rovné ohodnocenÃm vÅ¡ech otevÅ\99ených vrcholů. Na~poÄ\8dátku to jistÄ\9b platÃ.
+NechÅ¥ nynà uzavÃráme vrchol~$v$ s~minimálnÃm $h(v)$ mezi otevÅ\99enými. BÄ\9bhem jeho
+relaxace nemůžeme žádnou hodnotu snížit pod~$h(v)$, jelikož v~grafu s~nezápornými
+hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbývajících otevřených vrcholů
+tedy neklesne pod hodnotu tohoto nově uzavřeného. Hodnoty dříve uzavřených vrcholů
+se nemohou nijak zmÄ\9bnit.
\qed
-PĹÂ\99Ä\82ÂmoÃ\84Â\8darÄ\82Ä\84 implementace Dijkstrova algoritmu by tedy pokaĹždÄ\82Å v~Ã\84Â\8dase $\O(n)$
-vybrala otevĹÂ\99enÄ\82Ë\9d vrchol s~nejmenĹÄ\84Ä\82Âm ohodnocenÄ\82Âm, v~Ã\84Â\8dase $\O(n)$ ho relaxovala
-a toto by se opakovalo nejvÄ\82Ë\9dĹÄ\84e $n$-krÄ\82Ä\84t. Algoritmus by tudÄ\82ÂĹž dobÃ\84Â\9bhl v~Ã\84Â\8dase $\O(n^2)$,
-coĹž je pro hustÄ\82Å grafy zajistÄ\82Å optimÄ\82Ä\84lnÄ\82Â. ZkusÄ\82Âme nynÄ\82 zrychlit vÄ\82Ë\9dpoÃ\84Â\8det
-na~Ĺ\99ĂdkĂ˝ch grafech.
-
-Vťechny relaxace trvajà dohromady $\O(\sum_v \deg(v)) = \O(m)$, takŞe úzkým hrdlem je
-vybĂrĂĄnĂ minima. PouĹžijeme pro nÄ\9bj vhodnou datovou strukturu, v~nĂĹž budeme udrĹžovat
-mnoĹžinu vĹĄech otevĹ\99enĂ˝ch vrcholĹŻ spolu s~jejich ohodnocenĂmi. Od~datovĂŠ struktury
-potĹÂ\99ebujeme, aby umÃ\84Â\9bla operace \<Insert> (vloĹženÄ\82 vrcholu), \<ExtractMin> (nalezenÄ\82Â
-a smazÄ\82Ä\84nÄ\82 minima) a \<Decrease> (snÄ\82ÂĹženÄ\82 hodnoty vrcholu). PrvnÄ\82 dvÃ\84Â\9b operace pĹÂ\99itom
-volåme nejvýťe $n$-kråt a operaci \<Decrease> nejvýťe $m$-kråt. Celý algoritmus
-tedy dobÃ\84Â\9bhne v~Ã\84Â\8dase
+PÅ\99ÃmoÄ\8dará implementace Dijkstrova algoritmu by tedy pokaždé v~Ä\8dase $\O(n)$
+vybrala otevÅ\99ený vrchol s~nejmenÅ¡Ãm ohodnocenÃm, v~Ä\8dase $\O(n)$ ho relaxovala
+a toto by se opakovalo nejvýše $n$-krát. Algoritmus by tudÞ dobÄ\9bhl v~Ä\8dase $\O(n^2)$,
+což je pro husté grafy zajisté optimálnÃ. ZkusÃme nynà zrychlit výpoÄ\8det
+na~řídkých grafech.
+
+Všechny relaxace trvají dohromady $\O(\sum_v \deg(v)) = \O(m)$, takže úzkým hrdlem je
+vybírání minima. Použijeme pro něj vhodnou datovou strukturu, v~níž budeme udržovat
+množinu všech otevřených vrcholů spolu s~jejich ohodnoceními. Od~datové struktury
+potÅ\99ebujeme, aby umÄ\9bla operace \<Insert> (vloženà vrcholu), \<ExtractMin> (nalezenÃ
+a smazánà minima) a \<Decrease> (snÞenà hodnoty vrcholu). Prvnà dvÄ\9b operace pÅ\99itom
+voláme nejvýše $n$-krát a operaci \<Decrease> nejvýše $m$-krát. Celý algoritmus
+tedy dobÄ\9bhne v~Ä\8dase
$$\O(nT_I(n) + nT_E(n) + mT_D(n)),$$
-kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou Ã\84Â\8dasovÄ\82Å sloĹžitosti jednotlivÄ\82Ë\9dch operacÄ\82Â
-na~struktuĹÂ\99e o~nejvÄ\82Ë\9dĹÄ\84e~$n$ prvcÄ\82Âch (staÃ\84Â\8dÄ\82 amortizovanÃ\84Â\9b).
+kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou Ä\8dasové složitosti jednotlivých operacÃ
+na~struktuÅ\99e o~nejvýše~$n$ prvcÃch (staÄ\8dà amortizovanÄ\9b).
-\>JakĂŠ moĹžnosti mĂĄme pro volbu struktury?
+\>Jaké možnosti máme pro volbu struktury?
\itemize\ibull
-\:{\I pole} -- \<Insert> a \<Decrease> stojĂ konstantu, \<ExtractMin> trvĂĄ $\O(n)$,
+\:{\I pole} -- \<Insert> a \<Decrease> stojí konstantu, \<ExtractMin> trvá $\O(n)$,
celkem tedy $\O(n^2)$.
-\:{\I (binĂĄrnĂ) halda} -- vĹĄechny tĹ\99i operace umĂme provĂŠst v~Ä\8dase $\O(\log n)$, takĹže celkem
- $\O(m\log n)$. To je pro hustÄ\82Å grafy horĹÄ\84Ä\82Â, pro ĹÂ\99Ä\82ÂdkÄ\82Å lepĹÄ\84Ä\82Â.
-\:{\I $k$-regulĂĄrnĂ halda} -- pokud haldu upravĂme tak, Ĺže kaĹždĂ˝ prvek bude mĂt aĹž $k$ synĹŻ,
- hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublÄ\82Ä\84vajÄ\82ÂcÄ\82Â} prvky smÃ\84Â\9brem nahoru,
- coĹž je \<Insert> a \<Decrease>, se zrychlÄ\82 na~$\O(\log_k n)$. OvĹÄ\84em \<ExtractMin> potĹÂ\99ebuje
- zkoumat vĹÄ\84echny syny kaĹždÄ\82Å ho navĹÄ\84tÄ\82ÂvenÄ\82Å ho prvku, takĹže se zpomalÄ\82 na $\O(k\log_k n)$.
-
- CelkovÄ\82Ä\84 sloĹžitost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba Ã\84Â\8dleny se vyrovnajÄ\82Â
- pro $k=m/n$, Ã\84Â\8dÄ\82ÂmĹž zÄ\82ÂskÄ\82Ä\84me $\O(m\log_{m/n} n)$. Ã\84Â\8clen $\log_{m/n} n$ je pĹÂ\99itom $\O(1)$,
- kdykoliv je $m\ge n^{1+\varepsilon}$ pro nÃ\84Â\9bjakÄ\82Å ~$\varepsilon>0$, takĹže pro dostateÃ\84Â\8dnÃ\84Â\9b
- hustÄ\82Å grafy jsme zÄ\82Âskali lineÄ\82Ä\84rnÄ\82Â algoritmus.
-
- (VĹĄimnÄ\9bte si, Ĺže pro $m\approx n^2$ algoritmus zvolĂ $k\approx n$, takĹže halda degeneruje
- na jedinÊ patro, tedy na pole, kterÊ se opravdu ukåzalo být optimålnà volbou pro hustÊ grafy.)
-\:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojĂ $\O(1)$, \<ExtractMin> mĂĄ sloĹžitost
- $\O(\log n)$ [vĹÄ\84e amortizovanÃ\84Â\9b]. DijkstrĹŻv algoritmus proto dobÃ\84Â\9bhne v~Ã\84Â\8dase $\O(m + n\log n)$.
- To je lineÄ\82Ä\84rnÄ\82 pro grafy s~hustotou $\Omega(\log n)$. TÄ\82ŠĹže sloĹžitosti operacÄ\82 dosahujÄ\82Â
- i jinĂŠ, mĂŠnÄ\9b znĂĄmĂŠ haldy \cite{haeupler:rankph,elmasry:violheap}, kterĂŠ mohou bĂ˝t v~praxi
- vÄ\82Ë\9draznÃ\84Â\9b rychlejĹÄ\84Ä\82Â.
-\:{\I MonotĂłnnĂ haldy} -- mĹŻĹžeme pouĹžĂt nÄ\9bjakou jinou haldu, kterĂĄ vyuĹžĂvĂĄ toho,
- Ĺže posloupnost odebĂranĂ˝ch prvkĹŻ je neklesajĂcĂ. Pro celĂĄ Ä\8dĂsla na~\hbox{RAMu} to mĹŻĹže
- bÄ\82Ë\9dt napĹÂ\99Ä\82Âklad Thorupova halda \cite{thorup:queue} se sloĹžitostÄ\82 $\O(\log\log n)$ u~operace \<ExtractMin>
- a $\O(1)$ u~ostatnÄ\82Âch operacÄ\82Â. Dijkstra tedy bÃ\84Â\9bĹžÄ\82 v~$\O(m + n\log\log n)$.
-\:{\I DatovÄ\82Å struktury pro omezenÄ\82Å universum} -- prozkoumÄ\82Ä\84me vzÄ\82Ä\84pÃ\84Â\9btÄ\82Â.
+\:{\I (binární) halda} -- všechny tři operace umíme provést v~čase $\O(\log n)$, takže celkem
+ $\O(m\log n)$. To je pro husté grafy horÅ¡Ã, pro Å\99Ãdké lepÅ¡Ã.
+\:{\I $k$-regulární halda} -- pokud haldu upravíme tak, že každý prvek bude mít až $k$ synů,
+ hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublávajÃcÃ} prvky smÄ\9brem nahoru,
+ což je \<Insert> a \<Decrease>, se zrychlà na~$\O(\log_k n)$. OvÅ¡em \<ExtractMin> potÅ\99ebuje
+ zkoumat vÅ¡echny syny každého navÅ¡tÃveného prvku, takže se zpomalà na $\O(k\log_k n)$.
+
+ Celková složitost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba Ä\8dleny se vyrovnajÃ
+ pro $k=m/n$, Ä\8dÃmž zÃskáme $\O(m\log_{m/n} n)$. Ä\8clen $\log_{m/n} n$ je pÅ\99itom $\O(1)$,
+ kdykoliv je $m\ge n^{1+\varepsilon}$ pro nÄ\9bjaké~$\varepsilon>0$, takže pro dostateÄ\8dnÄ\9b
+ husté grafy jsme zÃskali lineárnà algoritmus.
+
+ (Všimněte si, že pro $m\approx n^2$ algoritmus zvolí $k\approx n$, takže halda degeneruje
+ na jediné patro, tedy na pole, které se opravdu ukázalo být optimální volbou pro husté grafy.)
+\:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má složitost
+ $\O(\log n)$ [vÅ¡e amortizovanÄ\9b]. Dijkstrův algoritmus proto dobÄ\9bhne v~Ä\8dase $\O(m + n\log n)$.
+ To je lineárnà pro grafy s~hustotou $\Omega(\log n)$. Téže složitosti operacà dosahujÃ
+ i jiné, méně známé haldy \cite{haeupler:rankph,elmasry:violheap}, které mohou být v~praxi
+ výraznÄ\9b rychlejÅ¡Ã.
+\:{\I Monotónní haldy} -- můžeme použít nějakou jinou haldu, která využívá toho,
+ že posloupnost odebíraných prvků je neklesající. Pro celá čísla na~\hbox{RAMu} to může
+ být napÅ\99Ãklad Thorupova halda \cite{thorup:queue} se složitostà $\O(\log\log n)$ u~operace \<ExtractMin>
+ a $\O(1)$ u~ostatnÃch operacÃ. Dijkstra tedy bÄ\9bžà v~$\O(m + n\log\log n)$.
+\:{\I Datové struktury pro omezené universum} -- prozkoumáme vzápÄ\9btÃ.
\endlist
-\s{CviÃ\84Â\8denÄ\82Â:}
+\s{CviÄ\8denÃ:}
\itemize\ibull
-\:NajdÄ\9bte pĹ\99Ăklad grafu se zĂĄpornĂ˝mi hranami (ale bez zĂĄpornĂ˝ch cyklĹŻ),
- na~kterĂŠm DijkstrĹŻv algoritmus selĹže.
-\:Rozmyslete si, Ĺže pokud nevyuĹžijeme nÃ\84Â\9bjakÄ\82Å speciÄ\82Ä\84lnÄ\82 vlastnosti Ã\84Â\8dÄ\82Âsel (celoÃ\84Â\8dÄ\82Âselnost,
- omezený rozsah), je mez $\O(m+n\log n)$ nejlepťà moŞnå, protoŞe Dijkstrovým algoritmem
- mĹŻĹžeme tĹÂ\99Ä\82Âdit $n$-tici Ã\84Â\8dÄ\82Âsel. Thorup dokonce dokÄ\82Ä\84zal \cite{thorup:equiv}, Ĺže z~kaĹždÄ\82Å ho tĹÂ\99Ä\82ÂdÄ\82ÂcÄ\82Âho algoritmu
- se sloĹžitostÄ\82 $\O(nT(n))$ mĹŻĹžeme odvodit haldu se sloĹžitostÄ\82 mazÄ\82Ä\84nÄ\82 $\O(T(n))$.
-\:Jsou-li dÄ\82Å lky hran celoÃ\84Â\8dÄ\82ÂselnÄ\82Å , mĹŻĹžeme se na DijkstrĹŻv algoritmus dÄ\82Âvat i takto:
- PĹ\99edstavme si, Ĺže kaĹždou hranu nahradĂme cestou tvoĹ\99enou pĹ\99ĂsluĹĄnĂ˝m poÄ\8dtem hran jednotkovĂŠ dĂŠlky
- a na vzniklĂ˝ neohodnocenĂ˝ graf spustĂme prohledĂĄvĂĄnĂ do~ĹĄĂĹ\99ky. To samozĹ\99ejmÄ\9b vydĂĄ
- sprÄ\82Ä\84vnÄ\82Ë\9d vÄ\82Ë\9dsledek, ale pomÃ\84Â\9brnÃ\84Â\9b pomalu, protoĹže bude vÃ\84Â\9btĹÄ\84inu Ã\84Â\8dasu trÄ\82Ä\84vit posouvÄ\82Ä\84nÄ\82Âm
- vlny \uv{uvnitĹÂ\99} pĹŻvodnÄ\82Âch hran. MĹŻĹžeme si tedy pro kaĹždou pĹŻvodnÄ\82 hranu naĹÂ\99Ä\82Âdit
- \uv{budÄ\82Âk}, kterÄ\82Ë\9d nÄ\82Ä\84m ĹÂ\99ekne, za~kolik posunutÄ\82 vlny dospÃ\84Â\9bjeme na~jejÄ\82 konec.
- DokaŞte, Şe tento algoritmus je ekvivalentnà s~Dijkstrovým.
+\:Najděte příklad grafu se zápornými hranami (ale bez záporných cyklů),
+ na~kterém Dijkstrův algoritmus selže.
+\:Rozmyslete si, že pokud nevyužijeme nÄ\9bjaké speciálnà vlastnosti Ä\8dÃsel (celoÄ\8dÃselnost,
+ omezený rozsah), je mez $\O(m+n\log n)$ nejlepší možná, protože Dijkstrovým algoritmem
+ můžeme tÅ\99Ãdit $n$-tici Ä\8dÃsel. Thorup dokonce dokázal \cite{thorup:equiv}, že z~každého tÅ\99ÃdÃcÃho algoritmu
+ se složitostà $\O(nT(n))$ můžeme odvodit haldu se složitostà mazánà $\O(T(n))$.
+\:Jsou-li délky hran celoÄ\8dÃselné, můžeme se na Dijkstrův algoritmus dÃvat i takto:
+ Představme si, že každou hranu nahradíme cestou tvořenou příslušným počtem hran jednotkové délky
+ a na vzniklý neohodnocený graf spustíme prohledávání do~šířky. To samozřejmě vydá
+ správný výsledek, ale pomÄ\9brnÄ\9b pomalu, protože bude vÄ\9btÅ¡inu Ä\8dasu trávit posouvánÃm
+ vlny \uv{uvnitÅ\99} původnÃch hran. Můžeme si tedy pro každou původnà hranu naÅ\99Ãdit
+ \uv{budÃk}, který nám Å\99ekne, za~kolik posunutà vlny dospÄ\9bjeme na~jejà konec.
+ Dokažte, že tento algoritmus je ekvivalentní s~Dijkstrovým.
\endlist
-\h{CeloÄ\8dĂselnĂŠ dĂŠlky}
-
-UvaĹžujme nynĂ grafy, v~nichĹž jsou vĹĄechny dĂŠlky hran nezĂĄpornĂĄ celĂĄ Ä\8dĂsla omezenĂĄ
-nÄ\9bjakou konstantou~$L$. VĹĄechny vzdĂĄlenosti jsou tedy omezeny Ä\8dĂslem~$nL$, takĹže
-nÄ\82Ä\84m staÃ\84Â\8dÄ\82Â datovÄ\82Ä\84 struktura schopnÄ\82Ä\84 uchovÄ\82Ä\84vat takto omezenÄ\82Ä\84 celÄ\82Ä\84 Ã\84Â\8dÄ\82Âsla.
-
-PouĹžijeme jednoduchou pĹ\99ihrĂĄdkovou strukturu: pole indexovanĂŠ hodnotami od~0 do~$nL$,
-jeho $i$-tÄ\82Ë\9d prvek bude obsahovat seznam vrcholĹŻ, jejichĹž ohodnocenÄ\82 je rovno~$i$.
-Operace \<Insert> a \<Decrease> zvlĂĄdneme v~konstantnĂm Ä\8dase, budeme-li si u~kaĹždĂŠho
-prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potĹÂ\99ebuje najÄ\82Ât prvnÄ\82Â
-neprÄ\82Ä\84zdnou pĹÂ\99ihrÄ\82Ä\84dku, ale jelikoĹž vÄ\82Âme, Ĺže posloupnost odebÄ\82ÂranÄ\82Ë\9dch minim je monotÄ\82Å\82nnÄ\82Â,
-staÄ\8dĂ hledat od mĂsta, kde se hledĂĄnĂ zastavilo minule. VĹĄechna hledĂĄnĂ pĹ\99ihrĂĄdek
-tedy zaberou dohromady $\O(nL)$ a celĂ˝ DijkstrĹŻv algoritmus bude trvat $\O(nL + m)$.
-
-Prostorovå sloŞitost $\O(nL+m)$ je nevalnå, ale můŞeme ji jednoduchým trikem
-snÄ\82ÂĹžit: VĹÄ\84imneme si, Ĺže vĹÄ\84echna koneÃ\84Â\8dnÄ\82Ä\84 ohodnocenÄ\82 vrcholĹŻ nemohou bÄ\82Ë\9dt vÃ\84Â\9btĹÄ\84Ä\82Â
-neĹž aktuĂĄlnĂ minimum zvÄ\9btĹĄenĂŠ o~$L$. JinĂ˝mi slovy vĹĄechny neprĂĄzdnĂŠ pĹ\99ihrĂĄdky
-se nachÄ\82Ä\84zejÄ\82 v~Ä\82Å\9fseku pole dlouhÄ\82Å m~$L+1$, takĹže staÃ\84Â\8dÄ\82 indexovat modulo~$L+1$.
-Pouze si musÄ\82Âme dÄ\82Ä\84vat pozor, abychom sprÄ\82Ä\84vnÃ\84Â\9b poznali, kdy se struktura
-vyprÄ\82Ä\84zdnila, coĹž zjistÄ\82Âme napĹÂ\99Ä\82Âklad pomocÄ\82 poÃ\84Â\8dÄ\82Âtadla otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ. Ã\84Â\8cas si
-asymptoticky nezhorĹÄ\84Ä\82Âme, prostor klesne na~$\O(L+m)$.
-
-PodobnÄ\82Ë\9d trik mĹŻĹžeme pouĹžÄ\82Ât i pro libovolnou jinou datovou strukturu: rozsah Ã\84Â\8dÄ\82Âsel
-rozdÃ\84Â\9blÄ\82Âme na~\uv{okna} velikosti~$L$ (v~$i$-tÄ\82Å m oknÃ\84Â\9b jsou Ã\84Â\8dÄ\82Âsla $iL,iL+1,\ldots,(i+1)L-1$).
-V~libovolnĂŠ chvĂli mohou tedy bĂ˝t neprĂĄzdnĂĄ nejvýťe dvÄ\9b okna. StaÄ\8dĂ nĂĄm proto
-poĹÂ\99Ä\82Âdit si dvÃ\84Â\9b struktury pro uklÄ\82Ä\84dÄ\82Ä\84nÄ\82 Ã\84Â\8dÄ\82Âsel v~rozsahu $0,\ldots,L-1$ -- jedna
-z~nich bude reprezentovat aktuĂĄlnĂ okno (to, v~nÄ\9bmĹž leĹželo minulĂŠ minimum),
-druhÄ\82Ä\84 okno bezprostĹÂ\99ednÃ\84Â\9b nÄ\82Ä\84sledujÄ\82ÂcÄ\82Â. Minimum maĹžeme z~prvnÄ\82 struktury; pokud
-uĹž je prÄ\82Ä\84zdnÄ\82Ä\84, obÃ\84Â\9b struktury prohodÄ\82Âme. Operace \<Insert> podle hodnoty urÃ\84Â\8dÄ\82Â,
-do~kterÄ\82Å struktury se mÄ\82Ä\84 vklÄ\82Ä\84dat. S~operacÄ\82 \<Decrease> je to sloĹžitÃ\84Â\9bjĹÄ\84Ä\82 --
-hodnota z~vyĹÄ\84ĹÄ\84Ä\82 struktury mĹŻĹže pĹÂ\99eskoÃ\84Â\8dit do tÄ\82Å niĹžĹÄ\84Ä\82Â, ale v~takovÄ\82Å m pĹÂ\99Ä\82ÂpadÃ\84Â\9b
-ji ve~vyĹĄĹĄĂ struktuĹ\99e vymaĹžeme (to je \<Decrease> na $-\infty$ nĂĄsledovanĂ˝
-\<ExtractMin>em) a do~tĂŠ niŞťà vloĹžĂme. To se kaĹždĂŠmu prvku mĹŻĹže pĹ\99ihodit nejvýťe
-jednou, takĹže stÄ\82Ä\84le platÄ\82Â, Ĺže se kaĹždÄ\82Ë\9d prvek Ä\82Å\9fÃ\84Â\8dastnÄ\82 $\O(1)$ vloĹženÄ\82 a $\O(1)$
-extrakcÄ\82Â minima.
-
-UkÄ\82Ä\84zali jsme tedy, Ĺže pro naĹÄ\84e potĹÂ\99eby postaÃ\84Â\8duje struktura schopnÄ\82Ä\84 uchovÄ\82Ä\84vÄ\82Ä\84nÄ\82Â
-Ä\8dĂsel menĹĄĂch nebo rovnĂ˝ch~$L$.
-
-NabÄ\82ÂzÄ\82 se pouĹžÄ\82Ât van Emde-BoasĹŻv strom z~kapitoly o~vÄ\82Ë\9dpoÃ\84Â\8detnÄ\82Âch modelech.
-Ten dosahuje sloĹžitosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
-operaci \<Decrease> musĂme pĹ\99eklĂĄdat na \<Delete> a \<Insert>. CelkovĂĄ
-sloĹžitost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pĹÂ\99iÃ\84Â\8demĹž Ã\84Â\8das~$L$
-spotĹÂ\99ebujeme na inicializaci struktury (tÄ\82Å se lze za jistÄ\82Ë\9dch podmÄ\82Ânek vyhnout,
-viz zmĂnÄ\9bnĂĄ kapitola).
-
-VraĹĽme se ale jeĹĄtÄ\9b k~vyuĹžitĂ pĹ\99ihrĂĄdek\dots
-
-\h{VĂceĂşrovĹ\88ovĂŠ pĹ\99ihrĂĄdky}
-
-PodobnÄ\9b jako u~tĹ\99ĂdÄ\9bnĂ Ä\8dĂsel, i~zde se vyplĂĄcĂ stavÄ\9bt pĹ\99ihrĂĄdkovĂŠ struktury
-vĂceĂşrovĹ\88ovÄ\9b (pĹŻvodnÄ\9b popsĂĄno Goldbergem a Silversteinem \cite{goldberg:mlb}).
-JednotlivĂŠ hodnoty budeme zapisovat v~soustavÄ\9b o~zĂĄkladu~$B$,
-kterÄ\82Ë\9d zvolÄ\82Âme jako nÃ\84Â\9bjakou mocninu dvojky, abychom mohli s~Ã\84Â\8dÄ\82Âslicemi tohoto
-zĂĄpisu snadno zachĂĄzet pomocĂ bitovĂ˝ch operacĂ. KaĹždĂŠ Ä\8dĂslo tedy zabere nejvýťe
-$d=1+\lfloor\log_B L\rfloor$ Ã\84Â\8dÄ\82Âslic; pokud bude kratĹÄ\84Ä\82Â, doplnÄ\82Âme ho zleva nulami.
-
-NejvyĹĄĹĄĂ patro struktury bude tvoĹ\99eno polem $B$~pĹ\99ihrĂĄdek, v~$i$-tĂŠ z~nich
-budou uloĹžena ta Ã\84Â\8dÄ\82Âsla, jejichĹž Ã\84Â\8dÄ\82Âslice nejvyĹÄ\84ĹÄ\84Ä\82Âho ĹÂ\99Ä\82Ä\84du je rovna~$i$. Za~{\I aktivnÄ\82Â}
-prohlÄ\82Ä\84sÄ\82Âme tu pĹÂ\99ihrÄ\82Ä\84dku, kterÄ\82Ä\84 obsahuje aktuÄ\82Ä\84lnÄ\82 minimum. PĹÂ\99ihrÄ\82Ä\84dky s~menĹÄ\84Ä\82Âmi
-indexy jsou prĂĄzdnĂŠ a zĹŻstanou takovĂŠ aĹž do~konce vĂ˝poÄ\8dtu, protoĹže halda
-je monotĂłnnĂ. Pokud v~pĹ\99ihrĂĄdce obsahujĂcĂ minimum bude vĂce prvkĹŻ, budeme
-ji rozklĂĄdat podle druhĂŠho nejvyĹĄĹĄĂho Ĺ\99ĂĄdu na dalĹĄĂch~$B$ pĹ\99ihrĂĄdek atd.
-Celkem tak vznikne aĹž~$d$ Ä\82Å\9frovnÄ\82Â.
-
-\>Struktura bude obsahovat nÄ\82Ä\84sledujÄ\82ÂcÄ\82Â data:
+\h{Celočíselné délky}
+
+Uvažujme nyní grafy, v~nichž jsou všechny délky hran nezáporná celá čísla omezená
+nějakou konstantou~$L$. Všechny vzdálenosti jsou tedy omezeny číslem~$nL$, takže
+nám staÄ\8dà datová struktura schopná uchovávat takto omezená celá Ä\8dÃsla.
+
+Použijeme jednoduchou přihrádkovou strukturu: pole indexované hodnotami od~0 do~$nL$,
+jeho $i$-tý prvek bude obsahovat seznam vrcholů, jejichž ohodnocenà je rovno~$i$.
+Operace \<Insert> a \<Decrease> zvládneme v~konstantním čase, budeme-li si u~každého
+prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potÅ\99ebuje najÃt prvnÃ
+neprázdnou pÅ\99ihrádku, ale jelikož vÃme, že posloupnost odebÃraných minim je monotónnÃ,
+stačí hledat od místa, kde se hledání zastavilo minule. Všechna hledání přihrádek
+tedy zaberou dohromady $\O(nL)$ a celý Dijkstrův algoritmus bude trvat $\O(nL + m)$.
+
+Prostorová složitost $\O(nL+m)$ je nevalná, ale můžeme ji jednoduchým trikem
+snÞit: VÅ¡imneme si, že vÅ¡echna koneÄ\8dná ohodnocenà vrcholů nemohou být vÄ\9btÅ¡Ã
+než aktuální minimum zvětšené o~$L$. Jinými slovy všechny neprázdné přihrádky
+se nacházejà v~úseku pole dlouhém~$L+1$, takže staÄ\8dà indexovat modulo~$L+1$.
+Pouze si musÃme dávat pozor, abychom správnÄ\9b poznali, kdy se struktura
+vyprázdnila, což zjistÃme napÅ\99Ãklad pomocà poÄ\8dÃtadla otevÅ\99ených vrcholů. Ä\8cas si
+asymptoticky nezhorÅ¡Ãme, prostor klesne na~$\O(L+m)$.
+
+Podobný trik můžeme použÃt i pro libovolnou jinou datovou strukturu: rozsah Ä\8dÃsel
+rozdÄ\9blÃme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknÄ\9b jsou Ä\8dÃsla $iL,iL+1,\ldots,(i+1)L-1$).
+V~libovolné chvíli mohou tedy být neprázdná nejvýše dvě okna. Stačí nám proto
+poÅ\99Ãdit si dvÄ\9b struktury pro ukládánà Ä\8dÃsel v~rozsahu $0,\ldots,L-1$ -- jedna
+z~nich bude reprezentovat aktuální okno (to, v~němž leželo minulé minimum),
+druhá okno bezprostÅ\99ednÄ\9b následujÃcÃ. Minimum mažeme z~prvnà struktury; pokud
+už je prázdná, obÄ\9b struktury prohodÃme. Operace \<Insert> podle hodnoty urÄ\8dÃ,
+do~které struktury se má vkládat. S~operacà \<Decrease> je to složitÄ\9bjÅ¡Ã --
+hodnota z~vyÅ¡Å¡Ã struktury může pÅ\99eskoÄ\8dit do té nižšÃ, ale v~takovém pÅ\99ÃpadÄ\9b
+ji ve~vyšší struktuře vymažeme (to je \<Decrease> na $-\infty$ následovaný
+\<ExtractMin>em) a do~té nižší vložíme. To se každému prvku může přihodit nejvýše
+jednou, takže stále platÃ, že se každý prvek úÄ\8dastnà $\O(1)$ vloženà a $\O(1)$
+extrakcà minima.
+
+Ukázali jsme tedy, že pro naÅ¡e potÅ\99eby postaÄ\8duje struktura schopná uchovávánÃ
+čísel menších nebo rovných~$L$.
+
+NabÃzà se použÃt van Emde-Boasův strom z~kapitoly o~výpoÄ\8detnÃch modelech.
+Ten dosahuje složitosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
+operaci \<Decrease> musíme překládat na \<Delete> a \<Insert>. Celková
+složitost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pÅ\99iÄ\8demž Ä\8das~$L$
+spotÅ\99ebujeme na inicializaci struktury (té se lze za jistých podmÃnek vyhnout,
+viz zmíněná kapitola).
+
+Vraťme se ale ještě k~využití přihrádek\dots
+
+\h{Víceúrovňové přihrádky}
+
+Podobně jako u~třídění čísel, i~zde se vyplácí stavět přihrádkové struktury
+víceúrovňově (původně popsáno Goldbergem a Silversteinem \cite{goldberg:mlb}).
+Jednotlivé hodnoty budeme zapisovat v~soustavě o~základu~$B$,
+který zvolÃme jako nÄ\9bjakou mocninu dvojky, abychom mohli s~Ä\8dÃslicemi tohoto
+zápisu snadno zacházet pomocí bitových operací. Každé číslo tedy zabere nejvýše
+$d=1+\lfloor\log_B L\rfloor$ Ä\8dÃslic; pokud bude kratÅ¡Ã, doplnÃme ho zleva nulami.
+
+Nejvyšší patro struktury bude tvořeno polem $B$~přihrádek, v~$i$-té z~nich
+budou uložena ta Ä\8dÃsla, jejichž Ä\8dÃslice nejvyÅ¡Å¡Ãho Å\99ádu je rovna~$i$. Za~{\I aktivnÃ}
+prohlásÃme tu pÅ\99ihrádku, která obsahuje aktuálnà minimum. PÅ\99ihrádky s~menÅ¡Ãmi
+indexy jsou prázdné a zůstanou takové až do~konce výpočtu, protože halda
+je monotónní. Pokud v~přihrádce obsahující minimum bude více prvků, budeme
+ji rozkládat podle druhého nejvyššího řádu na dalších~$B$ přihrádek atd.
+Celkem tak vznikne až~$d$ úrovnÃ.
+
+\>Struktura bude obsahovat následujÃcà data:
\itemize\ibull
\:Parametry $L$, $B$ a~$d$.
-\:Pole ĂşrovnĂ (nejvyĹĄĹĄĂ mĂĄ Ä\8dĂslo~$d-1$, nejniŞťĂ~0), kaĹždĂĄ ĂşroveĹ\88 je buÄ\8fto prĂĄzdnĂĄ
- (a pak jsou prĂĄzdnĂŠ i~vĹĄechny niŞťĂ), nebo obsahuje pole~$U_i$ o~$B$ pĹ\99ihrĂĄdkĂĄch
- a v~kaĹždĂŠ z~nich seznam prvkĹŻ. Pole ĂşrovnĂ pouĹžĂvĂĄme jako zĂĄsobnĂk, udrĹžujeme
- si Ã\84Â\8dÄ\82Âslo nejniĹžĹÄ\84Ä\82 neprÄ\82Ä\84zdnÄ\82Å Ä\82Å\9frovnÃ\84Â\9b.
-\:Hodnotu~$\mu$ pĹ\99edchozĂho odebranĂŠho minima.
+\:Pole úrovní (nejvyšší má číslo~$d-1$, nejnižší~0), každá úroveň je buďto prázdná
+ (a pak jsou prázdné i~všechny nižší), nebo obsahuje pole~$U_i$ o~$B$ přihrádkách
+ a v~každé z~nich seznam prvků. Pole úrovní používáme jako zásobník, udržujeme
+ si Ä\8dÃslo nejnižšà neprázdné úrovnÄ\9b.
+\:Hodnotu~$\mu$ předchozího odebraného minima.
\endlist
-Operace \<Insert> vloŞà hodnotu do~nejhlubĹĄĂ moĹžnĂŠ pĹ\99ihrĂĄdky. PodĂvĂĄ se tedy
-na~nejvyĹÄ\84ĹÄ\84Ä\82 Ä\82Å\9froveĹÂ\88: pokud hodnota patĹÂ\99Ä\82 do pĹÂ\99ihrÄ\82Ä\84dky, kterÄ\82Ä\84 nenÄ\82 aktivnÄ\82Â, vloĹžÄ\82Â
-ji pĹ\99Ămo. Jinak pĹ\99ejde o~ĂşroveĹ\88 nĂĹže a zopakuje stejnĂ˝ postup. To vĹĄe lze provĂŠst
-v~konstantnĂm Ä\8dase: staÄ\8dĂ se podĂvat, jakĂ˝ je nejvyĹĄĹĄĂ jedniÄ\8dkovĂ˝ bit ve~{\sc xor}u
-novÄ\82Å hodnoty s~Ã\84Â\8dÄ\82Âslem~$\mu$ (opÃ\84Â\9bt viz kapitola o~vÄ\82Ë\9dpoÃ\84Â\8detnÄ\82Âch modelech), a tÄ\82Âm zjistit
-Ã\84Â\8dÄ\82Âslo Ä\82Å\9frovnÃ\84Â\9b, kam hodnota patĹÂ\99Ä\82Â.
+Operace \<Insert> vloží hodnotu do~nejhlubší možné přihrádky. Podívá se tedy
+na~nejvyššà úroveÅ\88: pokud hodnota patÅ\99à do pÅ\99ihrádky, která nenà aktivnÃ, vložÃ
+ji přímo. Jinak přejde o~úroveň níže a zopakuje stejný postup. To vše lze provést
+v~konstantním čase: stačí se podívat, jaký je nejvyšší jedničkový bit ve~{\sc xor}u
+nové hodnoty s~Ä\8dÃslem~$\mu$ (opÄ\9bt viz kapitola o~výpoÄ\8detnÃch modelech), a tÃm zjistit
+Ä\8dÃslo úrovnÄ\9b, kam hodnota patÅ\99Ã.
-Pokud chceme provĂŠst \<Decrease>, odstranĂme hodnotu z~pĹ\99ihrĂĄdky, ve~kterĂŠ se
-prĂĄvÄ\9b nachĂĄzĂ (polohu si mĹŻĹžeme u~kaĹždĂŠ hodnoty pamatovat zvlĂĄĹĄĹĽ), a znovu ji
-vloĹžÄ\82Âme.
+Pokud chceme provést \<Decrease>, odstraníme hodnotu z~přihrádky, ve~které se
+právě nachází (polohu si můžeme u~každé hodnoty pamatovat zvlášť), a znovu ji
+vložÃme.
-VÄ\9btĹĄinu prĂĄce samozĹ\99ejmÄ\9b pĹ\99enechĂĄme funkci \<ExtractMin>. Ta zaÄ\8dne prohledĂĄvat
-nejniŞťà obsazenou ĂşroveĹ\88 od~aktivnĂ pĹ\99ihrĂĄdky dĂĄl (to, kterĂĄ pĹ\99ihrĂĄdka je na
-kterĂŠ Ăşrovni aktivnĂ, poznĂĄme z~Ä\8dĂslic hodnoty~$\mu$). Pokud pĹ\99ihrĂĄdky na~tĂŠto
-Ăşrovni dojdou, prĂĄzdnou ĂşroveĹ\88 zruĹĄĂme a pokraÄ\8dujeme o~patro výťe.
+Většinu práce samozřejmě přenecháme funkci \<ExtractMin>. Ta začne prohledávat
+nejnižší obsazenou úroveň od~aktivní přihrádky dál (to, která přihrádka je na
+které úrovni aktivní, poznáme z~číslic hodnoty~$\mu$). Pokud přihrádky na~této
+úrovni dojdou, prázdnou úroveň zrušíme a pokračujeme o~patro výše.
-Jakmile najdeme neprĂĄzdnou pĹ\99ihrĂĄdku, nalezneme v~nĂ minimum a to se stane novĂ˝m~$\mu$.
-Pokud v~pĹÂ\99ihrÄ\82Ä\84dce nebyly ĹžÄ\82Ä\84dnÄ\82Å dalĹÄ\84Ä\82 prvky, skonÃ\84Â\8dÄ\82Âme. V~opaÃ\84Â\8dnÄ\82Å m pĹÂ\99Ä\82ÂpadÃ\84Â\9b zbÄ\82Ë\9dvajÄ\82ÂcÄ\82Â
-prvky rozprostĹÂ\99eme do~pĹÂ\99ihrÄ\82Ä\84dek na~bezprostĹÂ\99ednÃ\84Â\9b niĹžĹÄ\84Ä\82 Ä\82Å\9frovni, kterou tÄ\82Âm zaloĹžÄ\82Âme.
+Jakmile najdeme neprázdnou přihrádku, nalezneme v~ní minimum a to se stane novým~$\mu$.
+Pokud v~pÅ\99ihrádce nebyly žádné dalÅ¡Ã prvky, skonÄ\8dÃme. V~opaÄ\8dném pÅ\99ÃpadÄ\9b zbývajÃcÃ
+prvky rozprostÅ\99eme do~pÅ\99ihrádek na~bezprostÅ\99ednÄ\9b nižšà úrovni, kterou tÃm založÃme.
-Ã\84Â\8cas strÄ\82Ä\84venÄ\82Ë\9d hledÄ\82Ä\84nÄ\82Âm minima mĹŻĹžeme rozdÃ\84Â\9blit na~nÃ\84Â\9bkolik Ã\84Â\8dÄ\82Ä\84stÄ\82Â:
+Ä\8cas strávený hledánÃm minima můžeme rozdÄ\9blit na~nÄ\9bkolik Ä\8dástÃ:
\itemize\ibull
-\:$\O(B)$ na inicializaci novĂŠ ĂşrovnÄ\9b -- to naĂşÄ\8dtujeme prvku, kterĂ˝ jsme
- prÄ\82Ä\84vÃ\84Â\9b mazali;
-\:hledĂĄnĂ neprĂĄzdnĂ˝ch pĹ\99ihrĂĄdek -- prozkoumĂĄnĂ kaĹždĂŠ prĂĄzdnĂŠ pĹ\99ihrĂĄdky
- naÄ\82Å\9fÃ\84Â\8dtujeme jejÄ\82Âmu vytvoĹÂ\99enÄ\82Â, coĹž se rozpustÄ\82 v~$\O(B)$ na inicializaci
- Ä\82Å\9frovnÃ\84Â\9b;
-\:zruĹÄ\84enÄ\82 Ä\82Å\9frovnÃ\84Â\9b -- opÃ\84Â\9bt naÄ\82Å\9fÃ\84Â\8dtujeme jejÄ\82Âmu vzniku;
-\:rozhazovĂĄnĂ prvkĹŻ do pĹ\99ihrĂĄdek -- jelikoĹž prvky v~hierarchii pĹ\99ihrĂĄdek
- putujÄ\82 bÃ\84Â\9bhem operacÄ\82 pouze doleva a dolĹŻ (jejich hodnoty se nikdy nezvÃ\84Â\9btĹÄ\84ujÄ\82Â),
- klesne kaĹždÄ\82Ë\9d prvek nejvÄ\82Ë\9dĹÄ\84e~$d$-krÄ\82Ä\84t, takĹže staÃ\84Â\8dÄ\82Â, kdyĹž na vĹÄ\84echna rozhazovÄ\82Ä\84nÄ\82Â
- pĹÂ\99ispÃ\84Â\9bje Ã\84Â\8dasem $\O(d)$.
+\:$\O(B)$ na inicializaci nové úrovně -- to naúčtujeme prvku, který jsme
+ právÄ\9b mazali;
+\:hledání neprázdných přihrádek -- prozkoumání každé prázdné přihrádky
+ naúÄ\8dtujeme jejÃmu vytvoÅ\99enÃ, což se rozpustà v~$\O(B)$ na inicializaci
+ úrovnÄ\9b;
+\:zruÅ¡enà úrovnÄ\9b -- opÄ\9bt naúÄ\8dtujeme jejÃmu vzniku;
+\:rozhazování prvků do přihrádek -- jelikož prvky v~hierarchii přihrádek
+ putujà bÄ\9bhem operacà pouze doleva a dolů (jejich hodnoty se nikdy nezvÄ\9btÅ¡ujÃ),
+ klesne každý prvek nejvýše~$d$-krát, takže staÄ\8dÃ, když na vÅ¡echna rozhazovánÃ
+ pÅ\99ispÄ\9bje Ä\8dasem $\O(d)$.
\endlist
-\>StaÃ\84Â\8dÄ\82 tedy, aby kaĹždÄ\82Ë\9d prvek pĹÂ\99i \<Insert>u zaplatil Ã\84Â\8das $\O(B+d)$ a jak \<Decrease>,
-tak \<ExtractMin> budou mĂt konstantnĂ amortizovanou sloĹžitost. DijkstrĹŻv
-algoritmus pak pobÃ\84Â\9bĹžÄ\82 v~$\O(m + n(B+d))$.
+\>StaÄ\8dà tedy, aby každý prvek pÅ\99i \<Insert>u zaplatil Ä\8das $\O(B+d)$ a jak \<Decrease>,
+tak \<ExtractMin> budou mít konstantní amortizovanou složitost. Dijkstrův
+algoritmus pak pobÄ\9bžà v~$\O(m + n(B+d))$.
-Zbývå nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
-VhodnÄ\82Ä\84 volba je $B=\log L/\log\log L$. PĹÂ\99i nÄ\82 platÄ\82Â
+Zbývá nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
+Vhodná volba je $B=\log L/\log\log L$. PÅ\99i nà platÃ
$$
{\log L\over\log B} = {\log L \over \log\left(\log L/\log\log L\right) }
= {\log L\over \log\log L - \log\log\log L} = \Theta(B).
$$
-Tehdy Dijkstra vydÄ\82Ä\84 vÄ\82Ë\9dsledek v~Ã\84Â\8dase $\O(m + n\cdot{\log L\over\log\log L})$.
-
-\h{HOT Queue -- kombinace pĹ\99ihrĂĄdek s~haldou}
-
-Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si vĹĄimli, Ĺže ve~vĂceĂşrovĹ\88ovĂ˝ch pĹ\99ihrĂĄdkovĂ˝ch strukturĂĄch
-platĂme pĹ\99ĂliĹĄ mnoho za~ĂşrovnÄ\9b, ve~kterĂ˝ch se za~dobu jejich existence objevĂ jen malĂŠ
-mnoĹžstvĂ prvkĹŻ. Navrhli tedy uklĂĄdat prvky z~\uv{malĂ˝ch} ĂşrovnĂ do~spoleÄ\8dnĂŠ haldy.
-VÄ\82Ë\9dslednÄ\82Å struktuĹÂ\99e se ĹÂ\99Ä\82ÂkÄ\82Ä\84 HOT (Heap-on-Top) Queue. My si pĹÂ\99edvedeme jejÄ\82 upravenou
-variantu (v~tÄ\82Å pĹŻvodnÄ\82 se skrÄ\82Ë\9dvÄ\82Ä\84 nÃ\84Â\9bkolik chyb).
-
-PoĹÂ\99Ä\82ÂdÄ\82Âme si haldu, ĹÂ\99eknÃ\84Â\9bme Fibonacciho, a~navÄ\82Âc ke~kaĹždÄ\82Å Ä\82Å\9frovni poÃ\84Â\8dÄ\82Âtadlo udÄ\82Ä\84vajÄ\82ÂcÄ\82Â,
-kolik prvkĹŻ z~tĂŠto ĂşrovnÄ\9b jsme uloĹžili do~haldy. Dokud toto poÄ\8dĂtadlo nepĹ\99eroste nÄ\9bjakĂ˝
-parametr~$H$, pĹÂ\99ihrÄ\82Ä\84dky nebudeme zaklÄ\82Ä\84dat a prvky poputujÄ\82 do~haldy. Ã\84Â\8cas $\O(B)$ na
-zaloĹženĂ ĂşrovnÄ\9b a jejĂ prochĂĄzenĂ proto mĹŻĹžeme rozpoÄ\8dĂtat mezi~$H$ prvkĹŻ, kterĂŠ se musely
-na~danÄ\82Å Ä\82Å\9frovni objevit, neĹž byla rozpĹÂ\99ihrÄ\82Ä\84dkovÄ\82Ä\84na. (PovĹÄ\84imnÃ\84Â\9bte si, Ĺže poÃ\84Â\8dÄ\82Âtadlo nikdy
-nesniĹžujeme, pouze ho vynulujeme, kdyĹž je Ä\82Å\9froveĹÂ\88 zruĹÄ\84ena. Proto vĹŻbec nemusÄ\82 odpovÄ\82Âdat
-skuteÄ\8dnĂŠmu poÄ\8dtu prvkĹŻ z~pĹ\99ĂsluĹĄnĂŠ ĂşrovnÄ\9b, kterĂŠ jsou prĂĄvÄ\9b uloĹženy v~haldÄ\9b. To ovĹĄem
-vĹŻbec nevadĂ -- poÄ\8dĂtadlo pouze hlĂdĂĄ, aby se ĂşroveĹ\88 nevytvoĹ\99ila pĹ\99ĂliĹĄ brzy, tedy abychom
-mÃ\84Â\9bli dost prvkĹŻ k~rozÄ\82Å\9fÃ\84Â\8dtovÄ\82Ä\84nÄ\82 Ã\84Â\8dasu.)
-
-PromÄ\9bnnou~$\mu$ nechĂĄme ukazovat na~mĂsto, kde jsme se pĹ\99i hledĂĄnĂ minima v~pĹ\99ihrĂĄdkĂĄch
-zastavili. SouÃ\84Â\8dasnÄ\82Å globÄ\82Ä\84lnÄ\82 minimum struktury mĹŻĹže bÄ\82Ë\9dt niĹžĹÄ\84Ä\82Â, nachÄ\82Ä\84zÄ\82Â-li se minimum
-zrovna v~haldÄ\9b. StĂĄle je vĹĄak zaruÄ\8deno, Ĺže pĹ\99ed~$\mu$ se nenachĂĄzà ŞådnĂĄ
-neprĂĄzdnĂĄ pĹ\99ihrĂĄdka.
+Tehdy Dijkstra vydá výsledek v~Ä\8dase $\O(m + n\cdot{\log L\over\log\log L})$.
+
+\h{HOT Queue -- kombinace přihrádek s~haldou}
+
+Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si všimli, že ve~víceúrovňových přihrádkových strukturách
+platíme příliš mnoho za~úrovně, ve~kterých se za~dobu jejich existence objeví jen malé
+množství prvků. Navrhli tedy ukládat prvky z~\uv{malých} úrovní do~společné haldy.
+Výsledné struktuÅ\99e se Å\99Ãká HOT (Heap-on-Top) Queue. My si pÅ\99edvedeme jejà upravenou
+variantu (v~té původnà se skrývá nÄ\9bkolik chyb).
+
+PoÅ\99ÃdÃme si haldu, Å\99eknÄ\9bme Fibonacciho, a~navÃc ke~každé úrovni poÄ\8dÃtadlo udávajÃcÃ,
+kolik prvků z~této úrovně jsme uložili do~haldy. Dokud toto počítadlo nepřeroste nějaký
+parametr~$H$, pÅ\99ihrádky nebudeme zakládat a prvky poputujà do~haldy. Ä\8cas $\O(B)$ na
+založení úrovně a její procházení proto můžeme rozpočítat mezi~$H$ prvků, které se musely
+na~dané úrovni objevit, než byla rozpÅ\99ihrádkována. (PovÅ¡imnÄ\9bte si, že poÄ\8dÃtadlo nikdy
+nesnižujeme, pouze ho vynulujeme, když je úroveÅ\88 zruÅ¡ena. Proto vůbec nemusà odpovÃdat
+skutečnému počtu prvků z~příslušné úrovně, které jsou právě uloženy v~haldě. To ovšem
+vůbec nevadí -- počítadlo pouze hlídá, aby se úroveň nevytvořila příliš brzy, tedy abychom
+mÄ\9bli dost prvků k~rozúÄ\8dtovánà Ä\8dasu.)
+
+Proměnnou~$\mu$ necháme ukazovat na~místo, kde jsme se při hledání minima v~přihrádkách
+zastavili. SouÄ\8dasné globálnà minimum struktury může být nižšÃ, nacházÃ-li se minimum
+zrovna v~haldě. Stále je však zaručeno, že před~$\mu$ se nenachází žádná
+neprázdná přihrádka.
Operace budou fungovat takto:
\>\<Insert>:
\algo
-\:SpoÄ\8dĂtĂĄme, do~kterĂŠ ĂşrovnÄ\9b~$i$ mĂĄ prvek padnout (bitovĂ˝mi operacemi).
-\:Pokud je poÃ\84Â\8dÄ\82Âtadlo tÄ\82Å to Ä\82Å\9frovnÃ\84Â\9b menĹÄ\84Ä\82 neĹž~$H$, zvÄ\82Ë\9dĹÄ\84Ä\82Âme ho, vloĹžÄ\82Âme prvek do~haldy a skoÃ\84Â\8dÄ\82Âme.
-\:Nebyly-li jeĹĄtÄ\9b pro tuto ĂşroveĹ\88 zaloĹženy pĹ\99ihrĂĄdky, vyrobĂme prĂĄzdnĂŠ.
-\:VloĹžĂme prvek do~pĹ\99ĂsluĹĄnĂŠ pĹ\99ihrĂĄdky.
+\:Spočítáme, do~které úrovně~$i$ má prvek padnout (bitovými operacemi).
+\:Pokud je poÄ\8dÃtadlo této úrovnÄ\9b menÅ¡Ã než~$H$, zvýšÃme ho, vložÃme prvek do~haldy a skoÄ\8dÃme.
+\:Nebyly-li ještě pro tuto úroveň založeny přihrádky, vyrobíme prázdné.
+\:Vložíme prvek do~příslušné přihrádky.
\endalgo
\>\<Decrease>:
\algo
-\:Pokud se prvek nachĂĄzĂ v~haldÄ\9b (to si u~kaĹždĂŠho prvku pamatujeme), provedeme
- \<Decrease> v~haldÃ\84Â\9b a skonÃ\84Â\8dÄ\82Âme.
-\:SmaĹžeme prvek z~jeho pĹ\99ihrĂĄdky a provedeme \<Insert> s~novou hodnotou.
+\:Pokud se prvek nachází v~haldě (to si u~každého prvku pamatujeme), provedeme
+ \<Decrease> v~haldÄ\9b a skonÄ\8dÃme.
+\:Smažeme prvek z~jeho přihrádky a provedeme \<Insert> s~novou hodnotou.
\endalgo
\>\<ExtractMin>:
\algo
-\:Dokud je~$\mu$ menĹÄ\84Ä\82 neĹž aktuÄ\82Ä\84lnÄ\82 minimum haldy, opakujeme:
-\::Najdeme pĹÂ\99ihrÄ\82Ä\84dku odpovÄ\82ÂdajÄ\82ÂcÄ\82 hodnotÃ\84Â\9b~$\mu$.
-\::Je-li tato pĹÂ\99ihrÄ\82Ä\84dka prÄ\82Ä\84zdnÄ\82Ä\84, pĹÂ\99ejdeme na~dalĹÄ\84Ä\82 (upravÄ\82Âme~$\mu$). Jsme-li na konci Ä\82Å\9frovnÃ\84Â\9b,
- zruĹĄĂme ji, vynulujeme jejĂ poÄ\8dĂtadlo a pokraÄ\8dujeme o~ĂşroveĹ\88 výť.
-\::NenÄ\82Â-li prÄ\82Ä\84zdnÄ\82Ä\84, rozprostĹÂ\99eme ji o~Ä\82Å\9froveĹÂ\88 nÄ\82ÂĹž (stejnÄ\82Ë\9dm zpĹŻsobem jako pĹÂ\99i \<Insert>u,
- takĹže prvnÄ\82Âch~$H$ prvkĹŻ vloĹžÄ\82Âme do~haldy).
-\:SmaĹžeme minimum z~haldy a vrĂĄtĂme ho jako vĂ˝sledek.
+\:Dokud je~$\mu$ menšà než aktuálnà minimum haldy, opakujeme:
+\::Najdeme pÅ\99ihrádku odpovÃdajÃcà hodnotÄ\9b~$\mu$.
+\::Je-li tato pÅ\99ihrádka prázdná, pÅ\99ejdeme na~dalÅ¡Ã (upravÃme~$\mu$). Jsme-li na konci úrovnÄ\9b,
+ zrušíme ji, vynulujeme její počítadlo a pokračujeme o~úroveň výš.
+\::NenÃ-li prázdná, rozprostÅ\99eme ji o~úroveÅ\88 nÞ (stejným způsobem jako pÅ\99i \<Insert>u,
+ takže prvnÃch~$H$ prvků vložÃme do~haldy).
+\:Smažeme minimum z~haldy a vrátíme ho jako výsledek.
\endalgo
-\>PustĂme se do~analĂ˝zy sloĹžitosti. Jako parametry si zvolĂme poÄ\8det hladin~$d$ (takĹže
-poÄ\8det pĹ\99ihrĂĄdek~$B$ na jednĂŠ Ăşrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
+\>Pustíme se do~analýzy složitosti. Jako parametry si zvolíme počet hladin~$d$ (takže
+počet přihrádek~$B$ na jedné úrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
-Nejprve si vĹÄ\84imneme, Ĺže neĹž poÃ\84Â\8dÄ\82Âtadlo nÃ\84Â\9bjakÄ\82Å Ä\82Å\9frovnÃ\84Â\9b vynulujeme, jsou bezpeÃ\84Â\8dnÃ\84Â\9b
-z~haldy pryÃ\84Â\8d vĹÄ\84echny prvky patĹÂ\99Ä\82ÂcÄ\82 do~tÄ\82Å to Ä\82Å\9frovnÃ\84Â\9b. Celkem se tedy v~haldÃ\84Â\9b
-vyskytuje nejvýťe $\O(dH)$ prvkĹŻ. \<ExtractMin> v~haldÄ\9b proto trvĂĄ $\O(\log(dH))$,
-ostatnĂ haldovĂŠ operace $\O(1)$.
+Nejprve si vÅ¡imneme, že než poÄ\8dÃtadlo nÄ\9bjaké úrovnÄ\9b vynulujeme, jsou bezpeÄ\8dnÄ\9b
+z~haldy pryÄ\8d vÅ¡echny prvky patÅ\99Ãcà do~této úrovnÄ\9b. Celkem se tedy v~haldÄ\9b
+vyskytuje nejvýše $\O(dH)$ prvků. \<ExtractMin> v~haldě proto trvá $\O(\log(dH))$,
+ostatní haldové operace $\O(1)$.
-NynÄ\82 rozÄ\82Å\9fÃ\84Â\8dtujeme Ã\84Â\8das operacÄ\82 mezi jednotlivÄ\82Å prvky (opÃ\84Â\9bt si vĹÄ\84e pĹÂ\99edplatÄ\82Âme
-v~\<Insert>u a ostatnÄ\82 operace pobÃ\84Â\9bĹžÄ\82 v~amortizovanÃ\84Â\9b konstantnÄ\82Âm Ã\84Â\8dase):
+Nynà rozúÄ\8dtujeme Ä\8das operacà mezi jednotlivé prvky (opÄ\9bt si vÅ¡e pÅ\99edplatÃme
+v~\<Insert>u a ostatnà operace pobÄ\9bžà v~amortizovanÄ\9b konstantnÃm Ä\8dase):
\itemize\ibull
-\:KaŞdý prvek můŞe být nejvýťe jednou za~dobu svÊho Şivota vloŞen do~haldy
- a nejvÄ\82Ë\9dĹÄ\84e jednou z~nÄ\82 vyjmut. Na~obojÄ\82 dohromady pĹÂ\99ispÃ\84Â\9bje $\O(\log dH)$.
-\:Prvek se Ä\82Å\9fÃ\84Â\8dastnÄ\82 nejvÄ\82Ë\9dĹÄ\84e~$d$ pĹÂ\99ehozenÄ\82 do~niĹžĹÄ\84Ä\82 Ä\82Å\9frovnÃ\84Â\9b. Pokud byl pĹÂ\99ihozen
- do~haldy, uĹž tam setrvĂĄ, jinak pokaĹždĂŠ zaplatĂ $\O(1)$ za~zaĹ\99azenĂ do~pĹ\99ihrĂĄdky,
+\:Každý prvek může být nejvýše jednou za~dobu svého života vložen do~haldy
+ a nejvýše jednou z~nà vyjmut. Na~obojà dohromady pÅ\99ispÄ\9bje $\O(\log dH)$.
+\:Prvek se úÄ\8dastnà nejvýše~$d$ pÅ\99ehozenà do~nižšà úrovnÄ\9b. Pokud byl pÅ\99ihozen
+ do~haldy, už tam setrvá, jinak pokaždé zaplatí $\O(1)$ za~zařazení do~přihrádky,
celkem tedy $\O(d)$ na prvek.
-\:VytvoĹ\99enĂ, projitĂ a smazĂĄnĂ pĹ\99ihrĂĄdek na~jednĂŠ Ăşrovni nastane aĹž tehdy, co bylo
- $H$~prvkĹŻ patĹ\99ĂcĂch do~tĂŠto ĂşrovnÄ\9b vloĹženo do~haldy. StaÄ\8dĂ tedy, aby kaĹždĂ˝
- prvek pĹÂ\99ispÃ\84Â\9bl Ã\84Â\8dasem $\O(B/H) = \O(L^{1/d}/H)$.
+\:Vytvoření, projití a smazání přihrádek na~jedné úrovni nastane až tehdy, co bylo
+ $H$~prvků patřících do~této úrovně vloženo do~haldy. Stačí tedy, aby každý
+ prvek pÅ\99ispÄ\9bl Ä\8dasem $\O(B/H) = \O(L^{1/d}/H)$.
\endlist
-\>KaĹždÄ\82Ë\9d prvek tedy platÄ\82 $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
-PojÄ\8fme najĂt nastavenĂ parametrĹŻ, kterĂŠ tento vĂ˝raz minimalizuje.
+\>Každý prvek tedy platà $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
+Pojďme najít nastavení parametrů, které tento výraz minimalizuje.
Nejprve zvolme~$H$ tak, aby se~$d$ vyrovnalo s~$L^{1/d}/H$. Tedy $H = L^{1/d}/d$.
-CelÄ\82Ë\9d vÄ\82Ë\9draz tÄ\82Âm zjednoduĹÄ\84Ä\82Âme na $\O(d + \log\,(L^{1/d}/d))$ =
-$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sÃ\84Â\8dÄ\82Âtance volbou
-$d=\sqrt{\log L}$ vyrovnĂĄme.
+Celý výraz tÃm zjednoduÅ¡Ãme na $\O(d + \log\,(L^{1/d}/d))$ =
+$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sÄ\8dÃtance volbou
+$d=\sqrt{\log L}$ vyrovnáme.
-HOT Queue tedy zvlÄ\82Ä\84dne \<Insert> s~amortizovanou Ã\84Â\8dasovou sloĹžitostÄ\82 $\O(\sqrt{\log L})$
-a ostatnĂ operace v~Ä\8dase amortizovanÄ\9b konstantnĂm. PouĹžijeme-li tuto strukturu
-v~DijkstrovÃ\84Â\9b algoritmu, spoÃ\84Â\8dte vzdÄ\82Ä\84lenosti v~Ã\84Â\8dase $\O(m + n\sqrt{\log L})$.
+HOT Queue tedy zvládne \<Insert> s~amortizovanou Ä\8dasovou složitostà $\O(\sqrt{\log L})$
+a ostatní operace v~čase amortizovaně konstantním. Použijeme-li tuto strukturu
+v~DijkstrovÄ\9b algoritmu, spoÄ\8dte vzdálenosti v~Ä\8dase $\O(m + n\sqrt{\log L})$.
-\h{DinicĹŻv algoritmus}
+\h{Dinicův algoritmus}
-ZajĂmavĂŠ vylepĹĄenĂ Dijkstrova algoritmu navrhl Dinic. VĹĄiml si, Ĺže pokud
-je kaĹždÄ\82Ä\84 hrana dlouhÄ\82Ä\84 alespoĹÂ\88~$\delta$, mĹŻĹžeme uzavÄ\82Ârat nejen
-vrchol s~minimÄ\82Ä\84lnÄ\82Âm ohodnocenÄ\82Âm~$\mu$, ale i vĹÄ\84echny s~ohodnocenÄ\82Âm
-menĹĄĂm neĹž $\mu+\delta$.
+Zajímavé vylepšení Dijkstrova algoritmu navrhl Dinic. Všiml si, že pokud
+je každá hrana dlouhá alespoÅ\88~$\delta$, můžeme uzavÃrat nejen
+vrchol s~minimálnÃm ohodnocenÃm~$\mu$, ale i vÅ¡echny s~ohodnocenÃm
+menším než $\mu+\delta$.
-Pro takto upravenÄ\82Ë\9d DijkstrĹŻv algoritmus bude stÄ\82Ä\84le platit, Ĺže pĹÂ\99i uzavÄ\82ÂrÄ\82Ä\84nÄ\82Â
-vrcholu odpovĂdĂĄ ohodnocenĂ skuteÄ\8dnĂŠ vzdĂĄlenosti, takĹže uzavĹ\99enĂŠ vrcholy jiĹž
-nejsou znovu otevĂrĂĄny.
+Pro takto upravený Dijkstrův algoritmus bude stále platit, že pÅ\99i uzavÃránÃ
+vrcholu odpovídá ohodnocení skutečné vzdálenosti, takže uzavřené vrcholy již
+nejsou znovu otevírány.
-O~monotonii vzdÄ\82Ä\84lenostÄ\82 jsme sice pĹÂ\99iĹÄ\84li, ale v~pĹÂ\99ihrÄ\82Ä\84dkovÄ\82Å struktuĹÂ\99e nebo
-haldÃ\84Â\9b mĹŻĹžeme klÄ\82ÂÃ\84Â\8de nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
-Tyto hodnoty se totiĹž chovajĂ monotĂłnnÄ\9b a vrcholy se stejnĂ˝m $h'(v)$ mĹŻĹžeme
-libovolnÃ\84Â\9b zamÃ\84Â\9bĹÂ\88ovat.
+O~monotonii vzdálenostà jsme sice pÅ\99iÅ¡li, ale v~pÅ\99ihrádkové struktuÅ\99e nebo
+haldÄ\9b můžeme klÃÄ\8de nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
+Tyto hodnoty se totiž chovají monotónně a vrcholy se stejným $h'(v)$ můžeme
+libovolnÄ\9b zamÄ\9bÅ\88ovat.
-Kteroukoli z~popsanÄ\82Ë\9dch pĹÂ\99ihrÄ\82Ä\84dkovÄ\82Ë\9dch struktur mĹŻĹžeme tedy pouĹžÄ\82Ât, pouze
-v~rozboru Ã\84Â\8dasovÄ\82Å sloĹžitosti nahradÄ\82Âme~$L$ vÄ\82Ë\9drazem $L/\delta$. Tento pĹÂ\99Ä\82Âstup
-pĹÂ\99itom funguje i pro neceloÃ\84Â\8dÄ\82ÂselnÄ\82Å dÄ\82Å lky hran, pouze potĹÂ\99ebujeme mÄ\82Ât pĹÂ\99edem
-k~dispozici netriviĂĄlnĂ dolnĂ odhad na~vĹĄechny dĂŠlky.
+Kteroukoli z~popsaných pÅ\99ihrádkových struktur můžeme tedy použÃt, pouze
+v~rozboru Ä\8dasové složitosti nahradÃme~$L$ výrazem $L/\delta$. Tento pÅ\99Ãstup
+pÅ\99itom funguje i pro neceloÄ\8dÃselné délky hran, pouze potÅ\99ebujeme mÃt pÅ\99edem
+k~dispozici netriviální dolní odhad na~všechny délky.
-\h{PotenciĂĄly}
+\h{Potenciály}
-VidÃ\84Â\9bli jsme, Ĺže v~grafech s~nezÄ\82Ä\84pornÄ\82Ë\9dmi dÄ\82Å lkami hran se nejkratĹÄ\84Ä\82 cesty
-hledajĂ snĂĄze. NabĂzĂ se nalĂŠzt nÄ\9bjakou transformaci, kterĂĄ by
-dovedla dÄ\82Å lky hran upravit tak, aby byly nejkratĹÄ\84Ä\82 cesty zachovÄ\82Ä\84ny (samozĹÂ\99ejmÃ\84Â\9b
-ne jejich dÄ\82Å lky, ale alespoĹÂ\88 to, kterÄ\82Å cesty jsou nejkratĹÄ\84Ä\82Â). NabÄ\82ÂzÄ\82 se
-nÄ\82Ä\84sledujÄ\82ÂcÄ\82Â fyzikÄ\82Ä\84lnÄ\82Â inspirace:
+VidÄ\9bli jsme, že v~grafech s~nezápornými délkami hran se nejkratÅ¡Ã cesty
+hledají snáze. Nabízí se nalézt nějakou transformaci, která by
+dovedla délky hran upravit tak, aby byly nejkratÅ¡Ã cesty zachovány (samozÅ\99ejmÄ\9b
+ne jejich délky, ale alespoÅ\88 to, které cesty jsou nejkratÅ¡Ã). NabÃzà se
+následujÃcà fyzikálnà inspirace:
-\s{Definice:} {\I PotenciĂĄl} budeme Ĺ\99Ăkat libovolnĂŠ funkci $\psi: V\rightarrow {\bb R}$.
-Pro kaĹždĂ˝ potenciĂĄl zavedeme {\I redukovanĂŠ dĂŠlky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
-PotenciĂĄl nazveme {\I pĹ\99ĂpustnĂ˝,} pokud ŞådnĂĄ hrana nemĂĄ zĂĄpornou redukovanou dĂŠlku.
+\s{Definice:} {\I Potenciál} budeme říkat libovolné funkci $\psi: V\rightarrow {\bb R}$.
+Pro každý potenciál zavedeme {\I redukované délky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
+Potenciál nazveme {\I přípustný,} pokud žádná hrana nemá zápornou redukovanou délku.
-\s{PozorovÄ\82Ä\84nÄ\82Â:} Pro redukovanou dÄ\82Å lku libovolnÄ\82Å cesty~$P$ z~$u$ do~$v$ platÄ\82Â: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
+\s{PozorovánÃ:} Pro redukovanou délku libovolné cesty~$P$ z~$u$ do~$v$ platÃ: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
\proof
-NechĹĽ cesta~$P$ prochÄ\82Ä\84zÄ\82 pĹÂ\99es vrcholy $u=w_1,\ldots,w_k=v$. Potom:
+NechÅ¥ cesta~$P$ procházà pÅ\99es vrcholy $u=w_1,\ldots,w_k=v$. Potom:
$$
\ell_\psi(P) = \sum_i \ell_\psi(w_i,w_{i+1}) = \sum_i \left( \ell(w_i,w_{i+1}) + \psi(w_i) - \psi(w_{i+1}) \right).
$$
-Tato suma je ovĹÄ\84em teleskopickÄ\82Ä\84, takĹže z~nÄ\82 zbude
+Tato suma je ovšem teleskopická, takže z~nà zbude
$$
\sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k) = \ell(P) + \psi(u) - \psi(v).
$$
\vskip-\baselineskip
\qed
-\s{DĹŻsledek:} PotenciĂĄlovou redukcĂ se dĂŠlky vĹĄech cest mezi~$u$ a~$v$
-zmÃ\84Â\9bnÄ\82 o~tutÄ\82ŠĹž konstantu, takĹže struktura nejkratĹÄ\84Ä\82Âch cest zĹŻstane nezmÃ\84Â\9bnÃ\84Â\9bna.
+\s{Důsledek:} Potenciálovou redukcí se délky všech cest mezi~$u$ a~$v$
+zmÄ\9bnà o~tutéž konstantu, takže struktura nejkratÅ¡Ãch cest zůstane nezmÄ\9bnÄ\9bna.
-ZbÄ\82Ë\9dvÄ\82Ä\84 pĹÂ\99ijÄ\82Ât na~to, kde si obstarat nÃ\84Â\9bjakÄ\82Ë\9d pĹÂ\99Ä\82ÂpustnÄ\82Ë\9d potenciÄ\82Ä\84l. PĹÂ\99idejme do~grafu
-novĂ˝ vrchol~$z$, pĹ\99iveÄ\8fme z~nÄ\9bj hrany nulovĂŠ dĂŠlky do~vĹĄech ostatnĂch vrcholĹŻ
-a~oznaÄ\8dme~$\psi(v)$ vzdĂĄlenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciĂĄl
-pĹ\99ĂpustnĂ˝, musĂ pro kaĹždou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
-Tuto nerovnost mĹŻĹžeme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, Ã\84Â\8dili
-$d(z,u) + \ell(u,v) \ge d(z,v)$, coĹž je ale obyÄ\8dejnĂĄ trojĂşhelnĂkovĂĄ nerovnost
-pro vzdÄ\82Ä\84lenost v~grafu, kterÄ\82Ä\84 jistÃ\84Â\9b platÄ\82Â.
+Zbývá pÅ\99ijÃt na~to, kde si obstarat nÄ\9bjaký pÅ\99Ãpustný potenciál. PÅ\99idejme do~grafu
+nový vrchol~$z$, přiveďme z~něj hrany nulové délky do~všech ostatních vrcholů
+a~označme~$\psi(v)$ vzdálenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciál
+přípustný, musí pro každou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
+Tuto nerovnost můžeme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, Ä\8dili
+$d(z,u) + \ell(u,v) \ge d(z,v)$, což je ale obyčejná trojúhelníková nerovnost
+pro vzdálenost v~grafu, která jistÄ\9b platÃ.
-JednÄ\82Âm vÄ\82Ë\9dpoÃ\84Â\8dtem nejkratĹÄ\84Ä\82Âch cest v~grafu se zÄ\82Ä\84pornÄ\82Ë\9dmi hranami (tĹÂ\99eba algoritmem BFM)
-tedy dokĂĄĹžeme spoÄ\8dĂtat potenciĂĄl, kterĂ˝ nĂĄm poslouŞà k~redukci vĹĄech hran na~nezĂĄpornĂŠ
-dÄ\82Å lky. To nÄ\82Ä\84m samozĹÂ\99ejmÃ\84Â\9b nepomĹŻĹže, chceme-li jednorÄ\82Ä\84zovÃ\84Â\9b hledat nejkratĹÄ\84Ä\82 cestu,
-ale mĹŻĹže nÄ\82Ä\84m to vÄ\82Ë\9draznÃ\84Â\9b zjednoduĹÄ\84it dalĹÄ\84Ä\82Â, sloĹžitÃ\84Â\9bjĹÄ\84Ä\82 prÄ\82Ä\84ci s~grafem. Jak uvidÄ\82Âme
-v~pĹ\99ĂĹĄtĂ kapitole, mĹŻĹžeme tak napĹ\99Ăklad nalĂŠzt vzdĂĄlenosti mezi vĹĄemi dvojicemi
-vrcholĹŻ v~Ã\84Â\8dase $\O(nm + n^2\log n)$.
+JednÃm výpoÄ\8dtem nejkratÅ¡Ãch cest v~grafu se zápornými hranami (tÅ\99eba algoritmem BFM)
+tedy dokážeme spočítat potenciál, který nám poslouží k~redukci všech hran na~nezáporné
+délky. To nám samozÅ\99ejmÄ\9b nepomůže, chceme-li jednorázovÄ\9b hledat nejkratÅ¡Ã cestu,
+ale může nám to výraznÄ\9b zjednoduÅ¡it dalÅ¡Ã, složitÄ\9bjÅ¡Ã práci s~grafem. Jak uvidÃme
+v~příští kapitole, můžeme tak například nalézt vzdálenosti mezi všemi dvojicemi
+vrcholů v~Ä\8dase $\O(nm + n^2\log n)$.
-Na~zĂĄvÄ\9br tohoto oddĂlu dokĂĄĹžeme jedno pomocnĂŠ tvrzenĂ o~potenciĂĄlech, kterĂŠ
-nĂĄm pomĹŻĹže v~konstrukci algoritmĹŻ typu \ppsp:
+Na~závěr tohoto oddílu dokážeme jedno pomocné tvrzení o~potenciálech, které
+nám pomůže v~konstrukci algoritmů typu \ppsp:
-\s{Lemma:} Pokud $f$ a~$g$ jsou pĹ\99ĂpustnĂŠ potenciĂĄly, pak jsou jimi i:
+\s{Lemma:} Pokud $f$ a~$g$ jsou přípustné potenciály, pak jsou jimi i:
\numlist\ndotted
-\:konvexnĂ kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolnĂŠ $\alpha,\beta\ge 0, \alpha+\beta=1$;
+\:konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$;
\:$\min(f,g)$;
\:$\max(f,g)$.
\endlist
-\proof BuÃ\84Â\8f $uv$ hrana. Potom z~definice pĹÂ\99Ä\82Âpustnosti platÄ\82 $\ell(u,v) \ge f(v) - f(u)$ a $\ell(u,v) \ge g(v) - g(u)$.
-JednotlivĂŠ Ä\8dĂĄsti tvrzenĂ dokĂĄĹžeme takto:
+\proof BuÄ\8f $uv$ hrana. Potom z~definice pÅ\99Ãpustnosti platà $\ell(u,v) \ge f(v) - f(u)$ a $\ell(u,v) \ge g(v) - g(u)$.
+Jednotlivé části tvrzení dokážeme takto:
\numlist\ndotted
-\:Pokud obÃ\84Â\9b strany nerovnosti pro~$f$ vynÄ\82Ä\84sobÄ\82Âme konstantou~$\alpha$, u~nerovnosti pro~$g$
- konstantou~$\beta$ a obÃ\84Â\9b nerovnosti seÃ\84Â\8dteme, dostaneme:
+\:Pokud obÄ\9b strany nerovnosti pro~$f$ vynásobÃme konstantou~$\alpha$, u~nerovnosti pro~$g$
+ konstantou~$\beta$ a obÄ\9b nerovnosti seÄ\8dteme, dostaneme:
$$
(\alpha+\beta) \cdot \ell(u,v) \ge (\alpha f(v) + \beta g(v)) - (\alpha f(u) + \beta g(u)),
$$
- coĹž je pĹÂ\99esnÃ\84Â\9b poĹžadovanÄ\82Ä\84 nerovnost pro pĹÂ\99Ä\82Âpustnost funkce $\alpha f+\beta g$.
-\:OznaÃ\84Â\8dme $h := \min(f,g)$. NechĹĽ bez Ä\82Å\9fjmy na obecnosti $f(u)\le g(u)$. Pokud takÄ\82Å platÄ\82 $f(v)\le g(v)$,
- shoduje se minimum s~funkcÄ\82Â~$f$ a nenÄ\82 co dokazovat. V~opaÃ\84Â\8dnÄ\82Å m pĹÂ\99Ä\82ÂpadÃ\84Â\9b je $h(u) = f(u)$, $h(v) = g(v)$.
- Tehdy si staÄ\8dĂ vĹĄimnout, Ĺže $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, takĹže
- potenciĂĄl~$h$ je pĹ\99ĂpustnĂ˝.
-\:DokĂĄĹžeme analogicky.
+ což je pÅ\99esnÄ\9b požadovaná nerovnost pro pÅ\99Ãpustnost funkce $\alpha f+\beta g$.
+\:OznaÄ\8dme $h := \min(f,g)$. NechÅ¥ bez újmy na obecnosti $f(u)\le g(u)$. Pokud také platà $f(v)\le g(v)$,
+ shoduje se minimum s~funkcÃ~$f$ a nenà co dokazovat. V~opaÄ\8dném pÅ\99ÃpadÄ\9b je $h(u) = f(u)$, $h(v) = g(v)$.
+ Tehdy si stačí všimnout, že $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, takže
+ potenciál~$h$ je přípustný.
+\:Dokážeme analogicky.
\qeditem
\endlist
-\h{Algoritmy pro problĂŠm typu \ppsp}
-
-ZamÃ\84Â\9bĹÂ\99me se nynÄ\82 na~pĹÂ\99Ä\82Âpad, kdy chceme hledat nejkratĹÄ\84Ä\82 cesty mezi zadanou dvojicÄ\82Â
-vrcholĹŻ $s$,~$t$. Obvykle se i v~tĂŠto situaci pouĹžĂvajĂ algoritmy \sssp{} (SSSP) a v~obecnĂŠm
-pĹ\99ĂpadÄ\9b ani nenĂ efektivnÄ\9bjĹĄĂ Ĺ\99eĹĄenĂ znĂĄmo. Existuje ovĹĄem velkĂŠ mnoĹžstvĂ heuristik, kterĂ˝mi
-lze obvykle vÄ\82Ë\9dpoÃ\84Â\8det zrychlit. NÃ\84Â\9bkterÄ\82Å z~nich si pĹÂ\99edvedeme na DijkstrovÃ\84Â\9b algoritmu.
-
-DijkstrĹŻv algoritmus ve~svĂŠ klasickĂŠ podobÄ\9b nevĂ vĹŻbec nic o~cĂlovĂŠm vrcholu a
-prohledÄ\82Ä\84 celÄ\82Ë\9d graf. Hned se nabÄ\82ÂzÄ\82 vyuĹžÄ\82Ât toho, Ĺže od~okamĹžiku uzavĹÂ\99enÄ\82Â
-kterĂŠhokoliv vrcholu se jiĹž jeho ohodnocenĂ nezmÄ\9bnĂ. Pokud tedy uzavĹ\99eme cĂlovĂ˝
-vrchol, mĹŻĹžeme se zastavit.
-
-Jakou Ã\84Â\8dÄ\82Ä\84st grafu prohledÄ\82Ä\84vÄ\82Ä\84me teÃ\84Â\8f? V~metrice danÄ\82Å vzdÄ\82Ä\84lenostmi v~grafu je to nejmenĹÄ\84Ä\82Â
-koule se stĹÂ\99edem ve~vrcholu~$u$, kterÄ\82Ä\84 obsahuje nejkratĹÄ\84Ä\82 cestu (dobĹÂ\99e se to
-pĹÂ\99edstavuje na~hledÄ\82Ä\84nÄ\82 v~silniÃ\84Â\8dnÄ\82 sÄ\82Âti na~rovinnÄ\82Å mapÃ\84Â\9b).
-
-TakÄ\82Å mĹŻĹžeme spustit prohledÄ\82Ä\84vÄ\82Ä\84nÄ\82 z~obou koncĹŻ zÄ\82Ä\84roveĹÂ\88, tedy zkombinovat hledÄ\82Ä\84nÄ\82Â
-od~$s$ v~pĹŻvodnÄ\82Âm grafu s~hledÄ\82Ä\84nÄ\82Âm od~$t$ v~grafu s~obrÄ\82Ä\84cenou orientacÄ\82 hran.
-Oba postupy mĹŻĹžeme libovolnÄ\9b stĹ\99Ădat a zastavĂme se v~okamĹžiku, kdy jsme jeden
-vrchol uzavĹÂ\99eli v~obou smÃ\84Â\9brech. Pozor ovĹÄ\84em na to, Ĺže souÃ\84Â\8det obou ohodnocenÄ\82Â
-tohoto vrcholu nemusÄ\82 bÄ\82Ë\9dt roven $d(v,u)$ -- zkuste vymyslet protipĹÂ\99Ä\82Âklad.
-NejkratĹÄ\84Ä\82 cesta jeĹÄ\84tÃ\84Â\9b mĹŻĹže vypadat tak, Ĺže pĹÂ\99echÄ\82Ä\84zÄ\82 po nÃ\84Â\9bjakÄ\82Å hranÃ\84Â\9b mezi vrcholem
-uzavĹ\99enĂ˝m v~jednom smÄ\9bru a vrcholem uzavĹ\99enĂ˝m ve~smÄ\9bru druhĂŠm (ponechme bez dĹŻkazu).
-StaÄ\8dĂ tedy bÄ\9bhem relaxace zjistit, zda je konec hrany uzavĹ\99enĂ˝ v~opaÄ\8dnĂŠm
-smÄ\9bru prohledĂĄvĂĄnĂ, a~pokud ano, zapoÄ\8dĂtat cestu do~prĹŻbÄ\9bĹžnĂŠho minima.
-
-ObousmÃ\84Â\9brnÄ\82Ë\9d DijkstrĹŻv algoritmus projde sjednocenÄ\82 nÃ\84Â\9bjakÄ\82Å koule okolo~$s$ s~nÃ\84Â\9bjakou
-koulÄ\82 okolo~$t$, kterÄ\82Å obsahuje nejkratĹÄ\84Ä\82 cestu. PrĹŻmÃ\84Â\9bry koulÄ\82 pĹÂ\99itom zÄ\82Ä\84visÄ\82 na tom,
-jak budeme bÃ\84Â\9bhem vÄ\82Ë\9dpoÃ\84Â\8dtu stĹÂ\99Ä\82Âdat oba smÃ\84Â\9bry prohledÄ\82Ä\84vÄ\82Ä\84nÄ\82Â. V~nejhorĹÄ\84Ä\82Âm pĹÂ\99Ä\82ÂpadÃ\84Â\9b samozĹÂ\99ejmÃ\84Â\9b
-mĹŻĹžeme prohledat celĂ˝ graf.
+\h{Algoritmy pro problém typu \ppsp}
+
+ZamÄ\9bÅ\99me se nynà na~pÅ\99Ãpad, kdy chceme hledat nejkratÅ¡Ã cesty mezi zadanou dvojicÃ
+vrcholů $s$,~$t$. Obvykle se i v~této situaci používají algoritmy \sssp{} (SSSP) a v~obecném
+případě ani není efektivnější řešení známo. Existuje ovšem velké množství heuristik, kterými
+lze obvykle výpoÄ\8det zrychlit. NÄ\9bkteré z~nich si pÅ\99edvedeme na DijkstrovÄ\9b algoritmu.
+
+Dijkstrův algoritmus ve~své klasické podobě neví vůbec nic o~cílovém vrcholu a
+prohledá celý graf. Hned se nabÃzà využÃt toho, že od~okamžiku uzavÅ\99enÃ
+kteréhokoliv vrcholu se již jeho ohodnocení nezmění. Pokud tedy uzavřeme cílový
+vrchol, můžeme se zastavit.
+
+Jakou Ä\8dást grafu prohledáváme teÄ\8f? V~metrice dané vzdálenostmi v~grafu je to nejmenÅ¡Ã
+koule se stÅ\99edem ve~vrcholu~$u$, která obsahuje nejkratÅ¡Ã cestu (dobÅ\99e se to
+pÅ\99edstavuje na~hledánà v~silniÄ\8dnà sÃti na~rovinné mapÄ\9b).
+
+Také můžeme spustit prohledávánà z~obou konců zároveÅ\88, tedy zkombinovat hledánÃ
+od~$s$ v~původnÃm grafu s~hledánÃm od~$t$ v~grafu s~obrácenou orientacà hran.
+Oba postupy můžeme libovolně střídat a zastavíme se v~okamžiku, kdy jsme jeden
+vrchol uzavÅ\99eli v~obou smÄ\9brech. Pozor ovÅ¡em na to, že souÄ\8det obou ohodnocenÃ
+tohoto vrcholu nemusà být roven $d(v,u)$ -- zkuste vymyslet protipÅ\99Ãklad.
+NejkratÅ¡Ã cesta jeÅ¡tÄ\9b může vypadat tak, že pÅ\99echázà po nÄ\9bjaké hranÄ\9b mezi vrcholem
+uzavřeným v~jednom směru a vrcholem uzavřeným ve~směru druhém (ponechme bez důkazu).
+Stačí tedy během relaxace zjistit, zda je konec hrany uzavřený v~opačném
+směru prohledávání, a~pokud ano, započítat cestu do~průběžného minima.
+
+ObousmÄ\9brný Dijkstrův algoritmus projde sjednocenà nÄ\9bjaké koule okolo~$s$ s~nÄ\9bjakou
+koulà okolo~$t$, které obsahuje nejkratÅ¡Ã cestu. PrůmÄ\9bry koulà pÅ\99itom závisà na tom,
+jak budeme bÄ\9bhem výpoÄ\8dtu stÅ\99Ãdat oba smÄ\9bry prohledávánÃ. V~nejhorÅ¡Ãm pÅ\99ÃpadÄ\9b samozÅ\99ejmÄ\9b
+můžeme prohledat celý graf.
\h{Algoritmus \astar}
-V~umÄ\9blĂŠ inteligenci se Ä\8dasto pro hledĂĄnĂ nejkratĹĄĂ cesty v~rozsĂĄhlĂ˝ch grafech
-(obvykle stavovĂ˝ch prostorech Ăşloh) pouĹžĂvĂĄ algoritmus nazĂ˝vanĂ˝~\astar{} \cite{hart:astar}.
-JednĂĄ se o~modifikaci Dijkstrova algoritmu, kterĂĄ vyuĹžĂvĂĄ heuristickou funkci
-pro dolnÄ\82 odhad vzdÄ\82Ä\84lenosti do~cÄ\82Âle; oznaÃ\84Â\8dme si ji $\psi(v)$. V~kaĹždÄ\82Å m kroku pak uzavÄ\82Âra
-vrchol~$v$ s~nejmenĹÄ\84Ä\82Âm moĹžnÄ\82Ë\9dm souÃ\84Â\8dtem $h(v)+\psi(v)$ aktuÄ\82Ä\84lnÄ\82Âho ohodnocenÄ\82 s~heuristikou.
+V~umělé inteligenci se často pro hledání nejkratší cesty v~rozsáhlých grafech
+(obvykle stavových prostorech úloh) používá algoritmus nazývaný~\astar{} \cite{hart:astar}.
+Jedná se o~modifikaci Dijkstrova algoritmu, která využívá heuristickou funkci
+pro dolnà odhad vzdálenosti do~cÃle; oznaÄ\8dme si ji $\psi(v)$. V~každém kroku pak uzavÃra
+vrchol~$v$ s~nejmenÅ¡Ãm možným souÄ\8dtem $h(v)+\psi(v)$ aktuálnÃho ohodnocenà s~heuristikou.
-Intuice za tÄ\82Âmto algoritmem je jasnÄ\82Ä\84: pokud vÄ\82Âme, Ĺže nÃ\84Â\9bjakÄ\82Ë\9d vrchol je blÄ\82Âzko
-od~poÃ\84Â\8dÄ\82Ä\84taÃ\84Â\8dnÄ\82Âho vrcholu~$s$, ale bude z~nÃ\84Â\9bj urÃ\84Â\8ditÃ\84Â\9b daleko do cÄ\82Âle~$t$, zatÄ\82Âm ho
-odloĹžÄ\82Âme a budeme zkoumat nadÃ\84Â\9bjnÃ\84Â\9bjĹÄ\84Ä\82 varianty.
+Intuice za tÃmto algoritmem je jasná: pokud vÃme, že nÄ\9bjaký vrchol je blÃzko
+od~poÄ\8dátaÄ\8dnÃho vrcholu~$s$, ale bude z~nÄ\9bj urÄ\8ditÄ\9b daleko do cÃle~$t$, zatÃm ho
+odložÃme a budeme zkoumat nadÄ\9bjnÄ\9bjÅ¡Ã varianty.
-Heuristika se pĹ\99itom volĂ podle konkrĂŠtnĂho problĂŠmu -- napĹ\99. hledĂĄme-li cestu
-v~mapÃ\84Â\9b, mĹŻĹžeme pouĹžÄ\82Ât vzdÄ\82Ä\84lenost do~cÄ\82Âle vzduĹÄ\84nou Ã\84Â\8darou.
+Heuristika se přitom volí podle konkrétního problému -- např. hledáme-li cestu
+v~mapÄ\9b, můžeme použÃt vzdálenost do~cÃle vzduÅ¡nou Ä\8darou.
-Je u~tohoto algoritmu zaruÃ\84Â\8deno, Ĺže vĹždy najde nejkratĹÄ\84Ä\82 cestu? Na to nÄ\82Ä\84m dÄ\82Ä\84 odpovÃ\84Â\9bÃ\84Â\8f
-teorie potenciĂĄlĹŻ:
+Je u~tohoto algoritmu zaruÄ\8deno, že vždy najde nejkratÅ¡Ã cestu? Na to nám dá odpovÄ\9bÄ\8f
+teorie potenciálů:
-\s{VÃ\84Â\9bta:} BÃ\84Â\9bh algoritmu \astar{} odpovÄ\82ÂdÄ\82Ä\84 prĹŻbÃ\84Â\9bhu Dijkstrova algoritmu
-na~grafu redukovanÄ\82Å m potenciÄ\82Ä\84lem~$-\psi$. PĹÂ\99esnÃ\84Â\9bji,
-pokud oznaÃ\84Â\8dÄ\82Âme $h^*$ aktuÄ\82Ä\84lnÄ\82Â ohodnocenÄ\82Â v~\astar{} a $h$ aktuÄ\82Ä\84lnÄ\82Â ohodnocenÄ\82Â
-v~synchronnÄ\9b bÄ\9bĹžĂcĂm Dijkstrovi, bude vĹždy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
+\s{VÄ\9bta:} BÄ\9bh algoritmu \astar{} odpovÃdá průbÄ\9bhu Dijkstrova algoritmu
+na~grafu redukovaném potenciálem~$-\psi$. PÅ\99esnÄ\9bji,
+pokud oznaÄ\8dÃme $h^*$ aktuálnà ohodnocenà v~\astar{} a $h$ aktuálnà ohodnocenÃ
+v~synchronně běžícím Dijkstrovi, bude vždy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
\proof
-IndukcĂ podle doby bÄ\9bhu obou algoritmĹŻ. Na poÄ\8dĂĄtku je $h^*(s)$ i $h(s)$ nulovĂŠ
-a vĹÄ\84echna ostatnÄ\82 $h^*$ a~$h$ jsou nekoneÃ\84Â\8dnÄ\82Ä\84, takĹže tvrzenÄ\82 platÄ\82Â. V~kaĹždÄ\82Å m dalĹÄ\84Ä\82Âm
-kroku \astar{} vybere vrchol~$v$ s~nejmenĹĄĂm $h^*(v) + \psi(v)$, coĹž je tentýŞ vrchol,
-kterĂ˝ vybere Dijkstra ($\psi(s)$ je stĂĄle stejnĂŠ).
-
-UvaĹžujme, co se stane bÃ\84Â\9bhem relaxace hrany $vw$: Dijkstra se pokusÄ\82 snÄ\82ÂĹžit ohodnocenÄ\82 $h(w)$
-o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. UkĂĄĹžeme,
-Ĺže \astar{} udÄ\9blĂĄ totĂŠĹž:
+Indukcí podle doby běhu obou algoritmů. Na počátku je $h^*(s)$ i $h(s)$ nulové
+a vÅ¡echna ostatnà $h^*$ a~$h$ jsou nekoneÄ\8dná, takže tvrzenà platÃ. V~každém dalÅ¡Ãm
+kroku \astar{} vybere vrchol~$v$ s~nejmenším $h^*(v) + \psi(v)$, což je tentýž vrchol,
+který vybere Dijkstra ($\psi(s)$ je stále stejné).
+
+Uvažujme, co se stane bÄ\9bhem relaxace hrany $vw$: Dijkstra se pokusà snÞit ohodnocenà $h(w)$
+o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. Ukážeme,
+že \astar{} udělá totéž:
$$\eqalign{
\delta &= (h^*(w) - \psi(s) + \psi(w)) - (h^*(v) - \psi(s) + \psi(v)) - (\ell(v,w) - \psi(v) + \psi(w)) \cr
&= h^*(w) - \psi(s) + \psi(w) - h^*(v) + \psi(s) - \psi(v) - \ell(v,w) + \psi(v) - \psi(w) \cr
&= h^*(w) - h^*(v) - \ell(v,w).
}$$
-Oba algoritmy tedy aĹž na~posunutĂ danĂŠ potenciĂĄlem poÄ\8dĂtajĂ totĂŠĹž.
+Oba algoritmy tedy až na~posunutí dané potenciálem počítají totéž.
\qed
-\s{DĹŻsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciĂĄl $-\psi$ pĹ\99ĂpustnĂ˝.
+\s{Důsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciál $-\psi$ přípustný.
-NapĹÂ\99Ä\82Âklad pro rovinnou mapu to heuristika danÄ\82Ä\84 euklidovskou vzdÄ\82Ä\84lenostÄ\82Â~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splĹÂ\88uje:
-PĹ\99Ăpustnost poĹžaduje pro kaĹždou hranu $uv$ nerovnost
+NapÅ\99Ãklad pro rovinnou mapu to heuristika daná euklidovskou vzdálenostÃ~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splÅ\88uje:
+Přípustnost požaduje pro každou hranu $uv$ nerovnost
$\ell(u,v) - \psi(v) + \psi(u) \ge 0$,
tedy $\ell(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$.
-JelikoĹž $\ell(u,v) \ge \varrho(u,v)$,
-staÄ\8dĂ dokĂĄzat, Ĺže $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
-coĹž je ovĹĄem trojĂşhelnĂkovĂĄ nerovnost pro metriku~$\varrho$.
+Jelikož $\ell(u,v) \ge \varrho(u,v)$,
+stačí dokázat, že $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
+což je ovšem trojúhelníková nerovnost pro metriku~$\varrho$.
\references
\bye