From: Martin Mares Date: Tue, 21 Nov 2006 21:26:33 +0000 (+0100) Subject: Vylepseni po prednasce. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=d6fa81adb567e608a19e513b92d51486b593b12c;p=ga.git Vylepseni po prednasce. --- diff --git a/6-borjar/6-borjar.tex b/6-borjar/6-borjar.tex index 3662e65..56e6dcf 100644 --- a/6-borjar/6-borjar.tex +++ b/6-borjar/6-borjar.tex @@ -1,6 +1,6 @@ \input ../sgr.tex -\prednaska{6}{Vylep¹ení Borùvkova a Jarníkova algoritmu}{zapsali Petr ©koda a Tomá¹ Gavenèiak} +\prednaska{6}{Rychlej¹í algoritmy na~minimální kostry}{zapsali Petr ©koda a Tomá¹ Gavenèiak} \h{Upravená verze Borùvkova algoritmu pro rovinné grafy} @@ -32,8 +32,8 @@ Ozna 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 poèet hran rovinného grafu je lineární v poètu vrcholù, tak¾e -platí $m_i < 3n_i$. Celkovou èasovou slo¾itost dostaneme jako souèet doby trvání +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 doby trvání v¹ech cyklù: $\O(\sum_i m_i) = \O(\sum_i n_i) = \O(n)$. \h{Minorovì uzavøené tøídy} @@ -42,8 +42,9 @@ P 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$ $\equiv$ $H$ lze z $G$ získat -mazáním vrcholù èi hran a kontrahováním hran. Znaèíme $H \preceq G$. +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. +\foot{Zde myslíme kontrakci s~odstranìním násobných hran.} \s{Pozorování:} $H \subseteq G \Rightarrow H \preceq G$. @@ -72,17 +73,17 @@ a alespo \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 tak, ¾e pøedchozí -algoritmus má lineární èasovou slo¾itost dokonce pro ka¾dou netriviální minorovì uzavøenou -tøídu grafù. +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ù. %%%Tomas Gavenciak \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 budeme ukládat trojice $(v,w,w(vw))$ vrcholù $v$ sousedících -s~dosavadní podkostrou $T$ pøes hranu $vw$, $w\in T$, která bude navíc nejlevnìj¹í mo¾ná. +Fibonacciho haldy $H$, do~které si budeme ukládat trojice $(v,w,w(vw))$ vrcholù $v$ sousedících +s~dosavadní podkostrou $T$ pøes hranu $vw$, $w\in T$, která bude navíc nejlevnìj¹í mo¾ná. +Tyto trojice bude halda udr¾ovat uspoøádané podle vah. \newcount\algcnt \s{Algoritmus: Jarníkùv algoritmus~\#2 (Fredman, Tarjan)} @@ -94,18 +95,18 @@ s~dosavadn \::$T:=T\cup\{vw\}$ \::Pro v¹echny sousedy $u\in E\backslash T$ vrcholu $v$ upravím haldu: \:::Pokud je $u$ v~$H$ nový, pøidáme jej spolu s~nejlevnìj¹í hranou vedoucí z~$u$ do~$T$. -\:::Pokud u¾ $u$ v~$H$ je a $uv$ je levnìj¹í ne¾ pùvodní nejlevnìj¹í hrana z~$u$ +\:::Pokud u¾ $u$ v~$H$ je a $uv$ je levnìj¹í ne¾ pùvodní nejlevnìj¹í hrana z~$u$ do~$T$, nahradím jeho záznam v~$H$ za~$(u,v,w(uv))$ a provedu $\(u,w(uv))$. \global\algcnt=\itemcount -\endalgo +\endalgo -Správnost algoritmu pøímo plyne ze~správnosti Jarníkova algoritmu. +\>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» vnitøní cyklus se provede -nanejvý¹ $n$-krát, za~\ v~nìm tedy zaplatíme $\O(n\log n)$, za~pøidávání -vrcholù do~$H$ a~nalezání nejlevnìj¹ích hran zaplatíme $\O(m)$ (na~ka¾dou hranu takto -sáhneme nanejvý¹ dvakrát), za~sni¾ování vah vrcholù v~haldì rovnì¾ pouze $\O(m)$ +Slo¾itost tohoto algoritmu bude $\O(m+n\log n)$, nebo» vnitøní cyklus se provede +nanejvý¹ $n$-krát, za~\ v~nìm tedy zaplatíme celkem $\O(n\log n)$, za~pøidávání +vrcholù do~$H$ a~nalezá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 \ v~$\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 @@ -113,8 +114,8 @@ Toto zlep \h{Kombinace Jarníkova a Borùvkova algoritmu} -K~dal¹ímu zlep¹ení dojde, kdy¾ nejprve spustíme $\log\log n$ cyklù Borùvkova algoritmu -s~kontrahováním vrcholù, tímto dojde k~velkému sní¾ení poètu vrcholù. +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 @@ -125,15 +126,14 @@ s~kontrahov \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)$. Nyní ji¾ máme lineární algoritmus i~pro grafy -s~$m\geq n\log\log n$. +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ì +Je¹tì vìt¹ího zrychlení dosáhneme, omezíme-li Jarníkovu algoritmu \#2 vhodnì velikost haldy a takto budeme bìhem jednoho Jarníkova algoritmu skládat pouze -jednotlivé podkostøièky zastavené v rùstu pøeteèením haldy, podle kterých -graf následnì skontrahujeme a budeme pokraèovat s mnohem men¹ím grafem. +jednotlivé podkostøièky zastavené v rùstu pøeteèením haldy, podle kterých +graf následnì zkontrahujeme a budeme pokraèovat s mnohem men¹ím grafem. \s{Algoritmus: Jarníkùv algoritmus~\#4 (Fredman, Tarjan)} \algo @@ -143,52 +143,62 @@ graf n \::$T=\emptyset$ \::Opakuji, dokud existují vrcholy mimo $T$: \:::Najdu vrchol $v_0$ mimo $T$. -\:::Spustím Jarníkùv alg. \#2 pro celý graf od $v_0$, zastavím ho, pokud: +\:::Spustím Jarníkùv alg. \#2 pro celý graf od $v_0$. Zastavím ho, pokud: \global\algcnt=\itemcount -\::::$\vert H\vert\geq k$ (pøekroèena vel. haldy) nebo +\::::$\vert H\vert\geq k$ (byla pøekroèena velikost haldy) nebo \::::$H=\emptyset$ (do¹li sousedé) nebo -\::::do $T$ jsem pøidal hranu oboustrannì incidentní s~hranami v~$T$ (pøipojil +\::::do $T$ jsem pøidal hranu oboustrannì incidentní s~hranami v~$T$ (pøipojil jsem novou podkostru k~nìjaké u¾ nalezené). -\::Skontrahuji $G$ podle podkoster nalezených v~$T$. +\::Zkontrahuji $G$ podle podkoster nalezených v~$T$. \endalgo \s{Pozorování:} -Ka¾dá z~nalezených podkoster v~$T$ je incidentní s~alespoò $k$ hranami (a~nebo -algoritmus u¾ konèí). +Pokud algoritmus je¹tì neskonèil, je ka¾dá z~nalezených podkoster v~$T$ incidentní s~alespoò $k$ hranami. Jak to vypadá pro jednotlivá ukonèení: \numlist\ndotted \itemcount=\algcnt -\:$\vert H\vert\geq k$ -- bylo u¾ pøidáno dost vrcholù. -\:$H=\emptyset$ -- nalezena celá kostra, konèím. +\:$\vert H\vert\geq k$ -- v¹echny hrany v~haldì jsou incidentní s~$T$, 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 pozorování je, ¾e poèet podkoster v~jednom prùchodu je nanejvý¹ +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í. Jeden vnìj¹í prùchod trvá $\O(m+t\log k)$, zvolím-li tedy $k=2^{2m/t}$, potom bude mít jeden prùchod slo¾itost $\O(m)$. Celková slo¾itost bude $\O(m\log^{*}n)$. -Podrobnìj¹í analýza pak dá je¹tì o~nìco lep¹í výsledek, a~to $\O(m\beta(m,n))$, kde -$\beta(m,n)=\min\{i:\log^{(i)}n