2.2 Reprezentace grafů
RAM a složitost
Definice 2.6 (Výpočetní model RAM)
Výpočetní model RAM
Random Access Machine
- Paměť RAMu tvoří pole celočíselných paměťových buněk adresovatelných celými čísly.
- Program je konečná posloupnost sekvenčně prováděných instrukcí dvou typů:
aritmeticko-logických a řídicích. - Aritmeticko-logické instrukce mají obvykle dva vstupní argumenty a jeden výstupní argument. Argument může být:
- přímá konstanta (s výjimkou výstupního argumentu),
- přímo adresovaná paměťová buňka (adresa je přímo zadána),
- nepřímo adresovaná paměťová buňka (její adresa je uložena v přímo adresované buňce).
- Řídicí instrukce jsou skoky (na konkrétní instrukci programu), podmíněné skoky (například když se dva argumenty instrukce rovnají) a instrukci zastavení programu.
- Na začátku výpočtu obsahuje paměť v určených buňkách vstup a obsah ostatních buněk je nedefinován.
- Potom je program sekvenčně prováděn, instrukce za instrukcí.
- Procesor v každém kroku provede právě jednu instrukci.
- Po zastavení programu je obsah paměti v určených buňkách interpretován jako výstup programu
Definice 2.7 (Složitost programu)
Složitost programu
- Velikost vstupu je počet paměťových buněk, které vstup zabírá.
- Časová složitost programu (v nejhorším případě) pro vstup velikosti \(N\) je maximum z počtu vykonaných instrukcí přes všechny možné (povolené) vstupy velikosti nejvýše \(N\).
- Paměťová složitost programu (v nejhorším případě) pro vstup velikosti \(N\) je maximum z počtu použitých paměťových buněk přes všechny možné (povolené) vstupy velikosti nejvýše \(N\).
Reprezentace grafu
Jak reprezentovat (neorientované) grafy v paměti počítače?
- Matice sousednosti
- Seznam sousedů
Definice 2.8 (Matice sousednosti)
Matice sousednosti
Nechť \(G = (V, E)\) je graf s \(V = \{v_{1}, v_{2}, ... , v_{n}\}\).
Matice sousednosti grafu \(G\) je čtvercová matice \(A_{G} = (a_{i,j} )^{n}_{i,j=1}\)
Pozorování
- \(A_{G}\) je symetrická matice
- Paměťová náročnost reprezentace: \(O(n^{2})\)
Definice 2.9 (Seznam sousedů)
Seznam sousedů
Pro každý vrchol v grafu \(G = (V, E)\) uchováváme seznam jeho sousedů (např. spojový seznam).
Paměťová složitost: \(|V|\) začátků seznamů a dohromady \(2|E|\) prvků v seznamech (každá hrana znamená dva výskyty).
Pozorování
Celkem tedy paměťová složitost: \(O(n + m)\).
Orientovaný graf
Orientované grafy reprezentujeme ve stejných strukturách jako neorientované grafy:
- maticí sousednosti
- seznamem sousedů
pouze místo seznamu sousedů říkáme seznam následníků:
Analýza časové složitosti BFS
Věta 2.1 (O časové složitosti algoritmu BFS_graf)
Věta o časové složitosti BFS
Algoritmus BFS_graf(\(G\)) má při reprezentaci grafu \(G\) seznamem sousedů časovou složitost \(O(|V| + |E|)\).
Důkaz Věty 2.1
- V globálním seznamu stavu vrcholů se každý vrchol vyjme nanejvýš jednou a poté se pustí BFS z něho.
- Každý vrchol je přidán do fronty \(Q\) nejvýše jednou.
- V každé iteraci cyklu \((9)\)–\((16)\) je jeden vrchol odebrán z fronty, tento cyklus má tedy nejvýše \(|V|\) iterací.
- Celkový počet iterací cyklu \((11)\)–\((15)\) je nejvýše dvakrát tolik, kolik je v grafu hran
(neboť pro každý vrchol procházíme jen hrany a vrcholy v jeho komponentě souvislosti). - Celková časová složitost je tedy \(O(|V| + |E|)\).