\input ../sgr.tex

\prednaska{6}{Rychlej¹í algoritmy na minimální kostry}{}

V~této kapitole popí¹eme nìkolik pokroèilej¹ích algoritmù pro problém minimální
kostry. Vesmìs to budou rùzná vylep¹ení klasických algoritmù z~minulé kapitoly.

\h{Upravená verze Borùvkova algoritmu pro rovinné grafy}

Vyjdeme z my¹lenky, ¾e mù¾eme po ka¾dém kroku pùvodního Borùvkova algoritmu vzniklé komponenty
souvislosti grafu kontrahovat do jednoho vrcholu a tím získat men¹í graf, který mù¾eme
znovu rekurzivnì zmen¹ovat. To funguje obecnì, ale uká¾eme, ¾e pro rovinné grafy tak dosáhneme
lineární èasové slo¾itosti.

\s{Pozorování:}
Pokud $F \subseteq {\rm MST}(G)$ (kde ${\rm MST}(G)$ je minimální kostra grafu~$G$), $G'$~je graf vzniklý
z~$G$ kontrakcí podél hran z~$F$, pak kostra grafu~$G$, která vznikne z~${\rm MST}(G')$ zpìtným
expandováním kontrahovaných vrcholù, je ${\rm MST}(G)$. Pokud kontrakcí vzniknou
smyèky, mù¾eme je ihned odstraòovat; pokud paralelní hrany, ponecháme z~nich v¾dy tu nejlehèí.
To nás vede k následujícímu algoritmu:

\s{Algoritmus: MST v rovinných grafech} \cite{mm:mst}
\algo
\:Ke ka¾dému vrcholu najdeme nejlevnìj¹í incidentní hranu -- dostaneme mno¾inu hran $F \subseteq E$.
\:Graf kontrahujeme podle $F$ následovnì:
\::Prohledáme do ¹íøky graf $(V, F)$ a pøiøadíme ka¾dému vrcholu èíslo komponenty, v~ní¾ se nachází.
\::Pøeèíslujeme hrany v~$G$ podle èísel komponent.
\:Odstraníme násobné hrany:
\::Setøídíme hrany lexikograficky pøihrádkovým tøídìním (násobné hrany jsou nyní pospolu).
\::Projdeme posloupnost hran a z~ka¾dého úseku multihran odstraníme v¹echny a¾ na nejlevnìj¹í hranu.
Také odstraníme smyèky.
\:Pokud stále máme netriviální graf, opakujeme pøedchozí kroky.
\:Vrátíme jako MST v¹echny hrany, které se v~prùbìhu algoritmu dostaly do~$F$.
\endalgo

\s{Èasová slo¾itost:}
Oznaème si $n_i$ a $m_i$ poèet vrcholù a hran na~poèátku $i$-té iterace.
Ka¾dý z~krokù 1--7 trvá $\O(m_i)$, proto i celý cyklus algoritmu trvá $\O(m_i)$.
Poèet vrcholù grafu klesá s~ka¾dým cyklem exponenciálnì: $n_i \leq n / 2^i$.
Na~zaèátku ka¾dého cyklu je graf rovinný (kontrakcí hrany v~rovinném grafu se rovinnost
zachovává) a není to multigraf, tak¾e poèet jeho hran je lineární v poètu vrcholù:
$m_i < 3n_i$. Celkovou èasovou slo¾itost dostaneme jako souèet dob trvání
v¹ech cyklù: $\O(\sum_i m_i) = \O(\sum_i n_i) = \O(n)$.

\h{Minorovì uzavøené tøídy}

Pøedchozí algoritmus ve~skuteènosti funguje v~lineárním èase i pro obecnìj¹í tøídy grafù,
ne¾ jsou grafy rovinné. Tím správným universem jsou minorovì uzavøené tøídy:

\s{Definice:}
Graf $H$ je {\I minorem} grafu $G$ (znaèíme $H \preceq G$) $\equiv$ $H$ lze z $G$ získat
mazáním vrcholù èi hran a kontrahováním hran (s~odstranìním smyèek a násobných hran).

\s{Pozorování:}
$H \subseteq G \Rightarrow H \preceq G$.

\s{Definice:}
Tøída grafù $\cal C$ je {\I minorovì uzavøená} $\equiv \forall G,H: G \in {\cal C}, H \preceq G \Rightarrow H \in {\cal C}$.

\s{Vìta:} (Robertson, Seymour)
Pokud je $\cal C$ minorovì uzavøená tøída grafù, existuje koneèná mno¾ina grafù $Z$ taková,
¾e pro ka¾dý graf $G$ platí:
$$G \not\in {\cal C} \iff \exists H \in Z: H \preceq G.$$
Jinými slovy, ka¾dou minorovì uzavøenou tøídu lze charakterizovat {\I koneèným} poètem zakázaných minorù.
To není samo sebou, dokazuje se to dosti obtí¾nì (a~je to jedna z~nejslavnìj¹ích kombinatorických
vìt za~posledních mnoho let), ale plyne z~toho spousta zajímavých dùsledkù.
Pìkné shrnutí této teorie najdete napøíklad v~Diestelove knize~\cite{diestel:gt}.

\s{Pozorování:} Napøíklad pro rovinné grafy jsou tìmi zakázanými minory právì
$K_{3,3}$ a $K_5$. To plyne z~Kuratowského vìty: jedna implikace je triviální,
druhá dá trochu práce: pokud je $K_{3,3} \preceq G$, najde se v~$G$ podgraf
isomorfní nìjakému dìlení~$K_{3,3}$; pokud je $K_5 \preceq G$, podgraf isomorfní
dìlení~$K_5$ se v~$G$ najít nemusí, ale pokud se nenajde, najde se tam podgraf isomorfní
dìlení $K_{3,3}$. (Zkuste si sami.)

\s{Vìta:} (Robertson, Seymour)
Pokud je tøída grafù $\cal C$ minorovì uzavøená a netriviální (alespoò jeden graf v~ní le¾í
a alespoò jeden nele¾í), pak $\exists c > 0: \forall G \in {\cal C}:
\vert E(G) \vert \leq c\cdot  \vert V(G) \vert$.

\s{Dùsledek:}
Jeliko¾ v¹echny grafy vygenerované pøedchozím algoritmem jsou minory grafu ze~vstupu,
mù¾eme pro odhad jejich hustoty pou¾ít pøedchozí vìtu a dostaneme lineární èasovou slo¾itost
dokonce pro ka¾dou netriviální minorovì uzavøenou tøídu grafù.

\h{Jarníkùv algoritmus s Fibonacciho haldou}

Pùvodní Jarníkùv algoritmus s~haldou má díky ní slo¾itost $\O(m\log n)$, to zlep¹íme pou¾itím
Fibonacciho haldy $H$, do~které si pro ka¾dý vrchol sousedící se zatím vybudovaným stromem~$T$
ulo¾íme nejlevnìj¹í z~hran vedoucích mezi tímto vrcholem a stromem~$T$. Tyto hrany bude halda
udr¾ovat uspoøádané podle vah.

\newcount\algcnt
\s{Algoritmus: Jarníkùv algoritmus~\#2 (Fredman, Tarjan \cite{ft:fibonacci})}
\algo
\:Zaèneme libovolným vrcholem $v_0$, $T\leftarrow \{v_0\}$.
\:Do~haldy $H$ umístíme v¹echny hrany vedoucí z~$v_0$.
\:Opakujeme, dokud $H\neq\emptyset$:
\::$vw\leftarrow \<DeleteMin>(H)$, pøièem¾ $v\not\in T, w\in T$.
\::$T\leftarrow T\cup\{vw\}$
\::Pro v¹echny sousedy $u$ vrcholu $v$, kteøí dosud nejsou v~$T$, upravíme haldu:
\:::Pokud je¹tì v~$H$ není hrana incidentní s~$u$, pøidáme hranu~$uv$.
\:::Pokud u¾ tam nìjaká taková hrana je a je-li tì¾¹í ne¾ $uv$, nahradíme ji
hranou~$uv$ a provedeme \<DecreaseKey>.
\global\algcnt=\itemcount
\endalgo

\>Správnost algoritmu pøímo plyne ze~správnosti Jarníkova algoritmu.

\s{Èasová slo¾itost:}
Slo¾itost tohoto algoritmu bude $\O(m+n\log n)$, nebo» vnìj¹í cyklus se provede
nanejvý¹ $n$-krát, za~\<DeleteMin> v~nìm tedy zaplatíme celkem $\O(n\log n)$, za~pøidávání
vrcholù do~$H$ a~nalézání nejlevnìj¹ích hran zaplatíme celkem $\O(m)$ (na~ka¾dou hranu takto
sáhneme nanejvý¹ dvakrát), za~sni¾ování vah vrcholù v~haldì rovnì¾ pouze $\O(m)$
(nanejvý¹ $m$-krát provedu porovnání vah a \<DecreaseKey> v~kroku~\the\algcnt\ za~$\O(1)$).

Toto zlep¹ení je dùle¾itìj¹í, ne¾ by se mohlo zdát, proto¾e nám pro grafy s~mnoha hranami
(konkrétnì pro grafy s~$m=\Omega(n\log n)$) dává lineární algoritmus.

\h{Kombinace Jarníkova a Borùvkova algoritmu}

K~dal¹ímu zlep¹ení dojde, kdy¾ pøed pøedchozím algoritmem spustíme $\log\log n$ cyklù Borùvkova
algoritmu s~kontrahováním vrcholù, èím¾ graf zahustíme.

\s{Algoritmus: Jarníkùv algoritmus~\#3 (pùvod neznámý)}
\algo
\:Provedeme $\log\log n$ cyklù upraveného Borùvkova algoritmu s~kontrahováním hran popsaného vý¹e.
\:Pokraèujeme Jarníkovým algoritmem~\#2.
\endalgo

\s{Èasová slo¾itost:}
Slo¾itost první èásti je $\O(m\log\log n)$.
Poèet vrcholù se po~první èásti algoritmu sní¾í na~$n'\leq n/\log n$ a slo¾itost druhé èásti bude
tedy nanejvý¹ $\O(m+n'\log n'/\log n)=\O(m)$.

\h{Jarníkùv algoritmus s~omezením velikosti haldy}

Je¹tì vìt¹ího zrychlení dosáhneme, omezíme-li Jarníkovu algoritmu \#2 vhodnì
velikost haldy, tak¾e nám nalezne jednotlivé podkostøièky zastavené v~rùstu
pøeteèením haldy. Podle tìchto podkostøièek graf následnì skontrahujeme
a budeme pokraèovat s~mnohem men¹ím grafem.

\s{Algoritmus: Jarníkùv algoritmus~\#4 (Fredman, Tarjan \cite{ft:fibonacci})}
\algo
\:Opakujeme, dokud máme netriviální $G$ (s alespoò jednou hranou):
\::$t\leftarrow\vert V(G)\vert$.
\::Zvolíme $k\leftarrow 2^{2m/t}$ (velikost haldy).
\::$T\leftarrow\emptyset$.
\::Opakujeme, dokud existují vrcholy mimo $T$:
\:::Najdeme vrchol $v_0$ mimo $T$.
\:::Spustíme Jarníkùv alg. \#2 pro celý graf od $v_0$. Zastavíme ho, pokud:
\global\algcnt=\itemcount
\::::$\vert H\vert\geq k$ (byla pøekroèena velikost haldy) nebo
\::::$H=\emptyset$ (do¹li sousedé) nebo
\::::do $T$ jsme pøidali hranu oboustrannì incidentní s~hranami v~$T$ (pøipojili
jsme novou podkostru k~nìjaké u¾ nalezené).
\::Kontrahujeme $G$ podle podkoster nalezených v~$T$.
\endalgo

\s{Pozorování:}
Pokud algoritmus je¹tì neskonèil, je ka¾dá z~nalezených podkoster v~$T$ incidentní s~alespoò $k$ hranami
(do toho poèítáme i vnitøní hrany vedoucí mezi vrcholy podkostry).
Jak to vypadá pro jednotlivá ukonèení:
\numlist\ndotted
\itemcount=\algcnt
\:$\vert H\vert\geq k$ -- v¹echny hrany v~haldì jsou incidentní s~$T$ a navzájem rùzné, tak¾e incidentních je dost.
\:$H=\emptyset$ -- nemù¾e nastat, algoritmus by skonèil.
\:Pøipojím se k~u¾ existující podkostøe -- jen ji zvìt¹ím.
\endlist

\s{Èasová slo¾itost:}
Dùsledkem pøedchozího pozorování je, ¾e poèet podkoster v~jednom prùchodu je nanejvý¹
$2m/k$. Pro $t'$ a $k'$ v následujícím kroku potom platí $t'\leq 2m/k$ a $k'=2^{2m/t'}\geq 2^k$.
Prùchodù bude tedy nanejvý¹ $\log^* n$\foot{$\log^* n$ je inverzní funkce k~\uv{vì¾i
z~mocnin}, èili $\min\{i:\log^{(i)} n<1 \}$, kde $\log^{(i)} n$ je $i$-krát iterovaný
logaritmus.}, proto¾e prùchod s~$k>n$ bude u¾ urèitì poslední.
Pøitom jeden vnìj¹í prùchod trvá $\O(m+t\log k)$, co¾ je pro $k=2^{2m/t}$
rovno $\O(m)$. Celkovì tedy algoritmus pobì¾í v~èase $\O(m\log^{*}n)$.

I~odhad $\log^* n$ je ale pøíli¹ hrubý, proto¾e nezaèínáme s~haldou velikosti~1, nýbr¾
$2^{2m/n}$. Mù¾eme tedy poèet prùchodù pøesnìji omezit funkcí $\beta(m,n)=\min\{i:\log^{(i)}n<m/n\}$
a èasovou slo¾itost odhadnout jako $\O(m\beta(m,n))$. To nám dává lineární algoritmus
pro grafy s~$m\geq n\log^{(k)}n$ pro libovolnou konstantu $k$, jeliko¾ $\beta(m,n)$ tehdy vyjde
omezená konstantou.

\h{Dal¹í výsledky}

\itemize\ibull
\:$\O(m\alpha(m,n))$, kde $\alpha(m,n)$ je obdoba inverzní
  Ackermannovy funkce definovaná podobnì, jako je $\beta(m,n)$ obdobou $\log^*$.
  \cite{chazelle:ackermann}, \cite{pettie:ackermann}
\:$\O({\cal T}(m,n))$, kde ${\cal T}(m,n)$ je hloubka optimálního rozhodovacího stromu
  pro nalezení minimální kostry v~grafech s~patøièným poètem hran a vrcholù
  \cite{pettie:optimal}.
  Jeliko¾ ka¾dý deterministický algoritmus zalo¾ený na~porovnávání vah lze popsat rozhodovacím stromem,
  je tento algoritmus zaruèenì optimální. Jen bohu¾el nevíme, jak optimální stromy vypadají, tak¾e
  je stále otevøeno, zda lze MST nalézt v~lineárním èase. Nicménì jeliko¾ tento algoritmus
  pracuje i na~Pointer Machine, proèe¾ víme, ¾e pokud je lineární slo¾itosti mo¾né dosáhnout, není k~tomu
  potøeba výpoèetní síla RAMu.\foot{O výpoèetních modelech viz pøí¹tí kapitola.}
\:$\O(m)$ pro grafy s~celoèíselnými vahami (na~RAMu) \cite{fw90trans} -- uká¾eme v~jedné
  z~následujících kapitol.
\:$\O(m)$, pokud u¾ máme hrany setøídìné podle vah: jeliko¾ víme, ¾e zále¾í jen na~uspoøádání,
  mù¾eme váhy pøeèíslovat na~$1\ldots m$ a pou¾ít pøedchozí algoritmus.
\:$\O(m)$ randomizovanì v~prùmìrném pøípadì \cite{karger:randomized}.
\:Na~zji¹tìní, zda je zadaná kostra minimální, staèí $\O(m)$ porovnání \cite{komlos:verify} a dokonce
  lze v~lineárním èase zjistit, která to jsou \cite{king:verify}. Z~toho ostatnì vychází pøedchozí
  randomizovaný algoritmus.
\endlist

\references
\bye
