3.4 Topsort
Definice 3.5 (Topologické uspořádání)
Topologické uspořádání
Topologické uspořádání (TU) orientovaného grafu \(G = (V, E)\)
je takové seřazení vrcholů \(V = \{v_{1}, ... , v_{n}\}\), že pro každou orientovanou hranu \((v_{i}, v_{j} ) \in E\) platí \(i \lt j\).
- Jinými slovy, pokud vrcholy zakreslíme horizontálně v pořadí topologického uspořádání, budou všechny orientované hrany směřovat zleva doprava.
- Topologické uspořádání se používá především pro plánování pořadí provedení navzájem závislých úloh/výpočtů.
Cyklické závislosti
Získaný orientovaný graf však může obsahovat cyklus (orientovanou kružnici)
Pozorování
- Pokud graf obsahuje cyklus, nelze tuto úlohu zjevně vyřešit.
- Graf \(G\) může mít více topologických uspořádání
Definice 3.6 (Orientovaná kružnice)
Orientovaná kružnice
Nechť \(n \geq 1\). Orientovaná kružnice délky \(n\) (s \(n\) vrcholy) je orient. graf \((\{1, ... , n\}\), \(\{(i, i + 1) | i \in \{1, ... , n − 1\}\} \cup \{(n, 1)\})\).
Definice 3.7 (Acyklický graf)
Acyklický graf
Orientovaný graf \(G\) nazveme acyklický, pokud neobsahuje jako podgraf orientovanou kružnici.
angl. Directed Acyclic Graph (DAG)
Definice 3.8 (Zdroj a stok)
Zdroj a stok
- Zdroj je takový vrchol orientovaného grafu, do kterého nevede žádná hrana.
- Stok je takový vrchol orientovaného grafu, ze kterého nevede žádná hrana
Věta 3.5 (o existenci zdroje a stoku)
Věta o existenci zdroje a stoku
- Nechť \(G = (V, E)\) je orientovaný acyklický graf. Potom \(G\) obsahuje aspoň jeden zdroj a aspoň jeden stok.
Důkaz Věty 3.5
- Sporem pro existenci zdroje (pro stok analogické).
- Předpokládejme, že v \(G\) neexistuje zdroj.
- Zvolme libovolný vrchol \(v_{1} \in V\) . Do něj, dle předchozího předpokladu, vede alespoň jedna orientovaná hrana z nějakého vrcholu \(v_{2}\).
- Do \(v_{2}\) také musí vést orientovaná hrana z nějakého vrcholu \(v_{3}\), a tak dále.
- Nejpozději po \(n\) krocích se však musí nějaký vrchol zopakovat.
- To ale znamená existenci cyklu v \(G\), čímž dostáváme SPOR.
Algoritmus 3.1 (Topsort)
Algoritmus Topsort
Existence zdroje v orientovaném acyklickém grafu vede přímočaře na algoritmus konstrukce topologického uspořádání takového grafu.
Vstup
Orientovaný graf \(G\).
Výstup
Nějaké topologické uspořádání \(G\), pokud byl acyklický
Detekce cykličnosti v opačném případě.
Idea
- počítej vstupní stupně vrcholů (tj. počet hran, ve kterých je vrchol následníkem),
- zdroje zařazuj do fronty,
- odebírej vrcholy z fronty, zařazuj je do výstupního pořadí a odebírej je z grafu a to znamená, že jejich následníkům snižuj vstupní stupně.
- Pokud po vyprázdnění fronty zbyly v grafu nějaké vrcholy, byl v něm orientovaný cyklus.
Algoritmus
Věta 3.6 (o správnosti algoritmu TopSort)
Věta o správnosti algoritmu TopSort
Algoritmus TopSort(\(G\)) spuštěný na orientovaný graf \(G\) doběhne v konečném čase a buď vygeneruje korektní topologické uspořádání acyklického grafu nebo detekuje existenci orientovaného cyklu.
Důkaz Věty 3.6
- Předpokládejme, že \(G\) je orientovaný graf a předpokládejme, že na počátku v kroku \((5)\) existuje aspoň jeden zdroj \(z\) a že všechny zdroje zařadíme do fronty \(Q\).
- Vnitřek cyklu \((7)-(11)\) realizuje odebrání \(1\) zdroje z fronty \(Q\), jeho vyjmutí z grafu \(G\), jeho vložení do výsledného uspořádání a identifikaci případných nových zdrojů a jejich zařazení do \(Q\).
- Existence hrany \((v_{i}, v_{j})\) znemožňuje vložit vrchol \(v_{j}\) do fronty \(Q\) před vrcholem \(v_{i}\), protože \(v_{j}\) by v takovém okamžiku mělo \(\delta [v_{j}] \geq 1\) a podmínkou vložení do \(Q\) je \(\delta [v_{j}] = 0\)
- Pokud v okamžiku vyprázdnění fronty jsou zpracovány všechny vrcholy grafu \(G\), našli jsme TU orientovaného acyklického grafu (RETURN).
- Pokud je fronta prázdná a přesto zbývají nějaké nezpracované vrcholy ve zbytku \(G\), pak ve zbytku \(G\) nejsou žádné zdroje, čili každý vrchol má vstupní hranu/-y a musí existovat orientovaný cyklus, plus případně z něj dostupné podgrafy. Vrcholy tohoto zbytkového grafu nelze topologicky uspořádat.
- Algoritmus tedy správně detekuje existenci cyklu a skončí v konečném čase.
- V obou případech algoritmus pracuje korektně a zastaví se.
Věta 3.7 (o složitosti algoritmu TopSort)
Věta o složitosti algoritmu TopSort
Algoritmus TopSort(\(G\)), kde \(G = (V, E)\) je orientovaný graf reprezentovaný pomocí pole následníků, má časovou i paměťovou složitost \(O(|V| + |E|)\).
Důkaz Věty 3.7
- Výpočet pole vstupních stupňů na řádcích \((3),(4)\) trvá \(\Theta (|E|)\).
- Počáteční vložení zdrojů do \(Q\) na řádku \((5)\) trvá \(O(|V|)\).
- Každý vrchol je vložen do \(Q\) nejvýše 1x, proto vybírání z \(Q\) a výpis na výstup na řádcích \((6)\)–\((8)\) trvá \(O(|V|)\).
- Každá hrana může být odebrána z grafu nejvýše 1x, proto operace na řádcích \((9)\)–\((11)\) trvají \(O(|E|)\).
- Celková časová složitost je tedy \(O(|V|+|E|)\).
- Graf \(G\), pole \(\delta\)[], fronta \(Q\), to vše zabere \(O(|V| + |E|)\) paměti.
K zamyšlení
- Jak vypadají orientované grafy s právě dvěma topologickými uspořádáními?
- Jak vypadají orientované grafy s právě třemi topologickými uspořádáními?
- Fungoval by algoritmus TopSort i s jinou strukturou než frontou? Co třeba se zásobníkem?
- Navrhněte, jak modifikovat algoritmus DFS pro orientované grafy, aby vytvořil TU grafu.
- Nápověda 1: Vezmu-li orientovaný acyklický graf a nějaké jeho TU, jakou vlastnost musí mít poslední vrchol v TU?
- Nápověda 2: Připusťme, že TU lze konstruovat odzadu.