Asympt. složitost, Reprezentace grafů
LAB 01
B4M33PAL - Ing. David Pařil

Ing. David Pařil
Bývalý student Kybernetiky a robotiky ČVUT FEL
Lektor katedry kybernetiky
Výzkum v oblasti kardiologické chirurgie v Nizozemí
Organizátor Robotických táborů a Robosoutěží
Správce Bastlírny na strahově
Místnost: E-220
Kontakt: parildav@fel.cvut.cz
B4M33PAL
Maximálně 2 absence za semestr!
Podmínkou zápočtu je alespoň 24 bodů z DÚ.
Viz courseware předmětu...
COURSEWARE
Příklad
Big O” notace
Ověřte, že platí:
Graf funkce \(f(n) = 0.5n^2\) pro \(n>4\) tedy leží vždy pod grafem funkce \(g(n) = n^2 - 2n\) a navíc rozdíl g(n) - f(n) roste do nekonečna s rostoucím \(n\).
Dokažte pomocí definice množiny \(O(f(n))\), že i přesto platí:
$$g(n) \in O(f(n))$$
$$\forall n \in \mathbb{N}:\quad n>4 \quad \Rightarrow \quad n^{2}-2n > 0.5\,n^2$$
$$\forall n \in \mathbb{N}:\quad n>4 \quad \Rightarrow \quad n^{2}-2n > 0.5\,n^2$$
$$\quad n^{2}-2n > \frac{1}{2} \,n^2$$
$$-\frac{1}{2} \,n^2$$
$$\frac{1}{2}n^2-2n >0$$
$$n \left(\frac 1 2 n -2\right)>0$$
$$>0$$
$$>0$$
Obě poloviny jsou v rozmezí \(n>4\) striktně kladné \(\rightarrow\) Důkaz
$$\forall n \in \mathbb{N}:\quad n>4 \quad \Rightarrow \quad \textcolor{blue}{n^{2}-2n} > \textcolor{orange}{0.5\,n^2}$$

Příklad
Růst Funkcí
Symbolem \(\lg\) značíme logaritmus o základu 2.
Uspořádejte podle řádu růstu uvedené funkce proměnné \(n\).
Zdůvodněte pořadí každých dvou sousedních funkcí v tomto uspořádání.
\(\lg(n!)\)
\((\sqrt{2})^{\lg(n)}\)
\(2^{\lg(\lg(n))}\)
\(4^{\lg(n)}\)
\(\sqrt{\lg(n)}\)
\(n \lg(n^2)\)
\(n \lg(n)\)
\( (\lg(n))^2\)
Nápověda: potřebujeme se zbavit exponentů a faktoriálu.
Příklad
\(\lg(n!)\)
Jak se zbavit faktoriálu? Dá se to zjednodušit?
Existuje nějaký přibližný odhad \(\lg(n!)\)?
Stirlingův vzorec
= nejznámější aproximace faktoriálu pro vysoké hodnoty...
$$n! \approx \sqrt{2 \pi n}\left(\frac{n}{e}\right)^n$$
Příklad
\(\lg(n!)\)
Stirlingův vzorec
$$n! \approx \sqrt{2 \pi n}\left(\frac{n}{e}\right)^n$$
\(\lg\left[ \sqrt{2 \pi n}\left(\frac{n}{e}\right)^n \right]\) = \(\lg \sqrt{2 \pi n} + \lg\left(\frac{n}{e}\right)^n \)
malé
\(n\lg\left(\frac{n}{e}\right) \quad\rightarrow\quad e\) je zanedbatelné
\(O\left(n\lg\left(n\right)\right)\)
Příklad
\(\lg(n!)\)
Alternativní řešení:
Horní mez: \(\lg k \leq \lg n\) pro všechna \(k\), takže
$$\lg(n!) <= \sum^n_{k=1} \lg k = n \lg n \quad \rightarrow \quad \mathcal{O}(n \lg n)$$
Dolní mez: pro \(k = \frac n 2 + 1, ..., n\) je \(\lg k \geq \lg \frac n 2\) a takových členů je \(\geq \frac n 2\)
$$\lg(n!) \geq \frac n 2 \lg \frac n 2 = \frac n 2 (\lg n - \lg 2) = \Omega(n\lg n)$$
Získáváme tedy řešení \(\Theta(n\lg n)\)
\(\lg(n!)\)
\((\sqrt{2})^{\lg(n)}\)
\(2^{\lg(\lg(n))}\)
\(4^{\lg(n)}\)
\(\sqrt{\lg(n)}\)
\(n \lg(n^2)\)
\(n \lg(n)\)
\( (\lg(n))^2\)
\(\Theta(n\lg n)\)
\(\left(2^{\frac 1 2}\right)^{\lg n}\)
\(\sqrt n\)
\(\lg n\)
\(2^{\lg n^2}\)
\(n^2\)
\(2^{2 \lg n}\)
\(2 n\lg n\)
\(n\lg n\)
\(\sqrt n\)
\(\lg n\)
\(n^2\)
\(\sqrt{\lg(n)}\)
\(2 n\lg n\)
\(n \lg(n)\)
\( (\lg(n))^2\)
\(n\lg n\)
\(\sqrt n\)
\(\lg n\)
\(n^2\)
\(\sqrt{\lg(n)}\)
\(2 n\lg n\)
\(n \lg(n)\)
\( (\lg(n))^2\)
Nový
1
3
\(\lg(n!)\)
\((\sqrt{2})^{\lg(n)}\)
\(2^{\lg(\lg(n))}\)
\(4^{\lg(n)}\)
\(\sqrt{\lg(n)}\)
\(n \lg(n^2)\)
\(n \lg(n)\)
\( (\lg(n))^2\)
Pořadí
Původní
6
4
7
2
3
5

Příklad
Průchod polem
Algoritmus \(A\) projde celým polem délky \(N\) a prvek s indexem \(k\) zpracuje za \(ck\) milisekund. Konstanta \(c\) je stále stejná.
Určete asymptotickou složitost zpracování celého pole.
Pole:
Prvek \(k\)
Zpracování \(c \cdot k\) ms
Pole:
\(c\)
\(2c\)
\(3c\)
\(Nc\)
\(+\)
\(+\)
\(\dotsm\)
\(\dotsm\)
\(+\)
$$\frac{c + Nc}2 \cdot N$$
Průměrná hodnota × počet prvků
\(\Theta(N^2)\)
Příklad
Průchod maticí
Algoritmus \(P\) projde celým 2D polem velikosti \(N\times N\) a prvek na pozici \((k,m)\) zpracuje za:
A) \(c(k+m)\) milisekund.
B) \(c(km)\) milisekund.
Konstanta \(c\) je stále stejná.
Určete asymptotickou složitost zpracování celého pole.
\(k\)
\(m\)
\(k\)
\(m\)
Varianta A) \(c(k+m)\)
Odhad: určitě musí být větší než \(\Theta(N^2)\)
$$ \sum_{k=1}^N \sum_{m=1}^N \textcolor{green}{c}(k+m) $$
$$ \sum_{m=1}^N k + \sum_{m=1}^N m $$
$$ N k + \frac{N+1}{2} N $$
$$ \textcolor{green}{c} \sum_{k=1}^N \left[ N k + \frac{N+1}{2} N \right]$$
$$ \textcolor{green}{c} \left( N \cdot \frac{N+1}{2} N + \frac{N+1}{2} N^2 \right)$$
$$ \textcolor{green}{c} \left( N+1 \right) N^2$$
\(k\)
\(m\)
Varianta B) \(c(km)\)
Odhad: jaký řád?
Přibližně horší o řád: \(\approx \Theta(N^4)\)
Přesné řešení: \(c \cdot \frac {N^2}{4} (N+1)^2\)
Příklad
Převody grafových reprezentací
Popiště jednotlivé reprezentace orientovaného grafu v paměti počítače které znáte. Pro každou možnou dvojici reprezentací R1 a R2 navrhněte pseudokód, který vzájemný převod provede, a určete, jaká bude jeho asymptotická složitost.
\(n\) uzlů a \(m\) hran
a | b | c | d | e | |
---|---|---|---|---|---|
a | 0 | 1 | 0 | 1 | 0 |
b | 1 | 0 | 1 | 0 | 1 |
c | 0 | 1 | 0 | 0 | 1 |
d | 1 | 0 | 0 | 0 | 1 |
e | 0 | 1 | 1 | 1 | 0 |
Matice sousednosti
a |
---|
b |
c |
d |
e |
b
d
a
c
e
b
e
a
e
Seznam sousedů
c
b
d
\(n\) uzlů a \(m\) hran
a | b | c | d | e | |
---|---|---|---|---|---|
a | 0 | 1 | 0 | 1 | 0 |
b | 1 | 0 | 1 | 0 | 1 |
c | 0 | 1 | 0 | 0 | 1 |
d | 1 | 0 | 0 | 0 | 1 |
e | 0 | 1 | 1 | 1 | 0 |
Matice sousednosti
a |
---|
b |
c |
d |
e |
b
d
a
c
e
b
e
a
e
Seznam sousedů
c
b
d
Matice -> Seznam
Seznam -> Matice
A ← n×n nuly
for u in 1..n:
for v in adj[u]:
A[u][v] ← 1
adj ← n prázdných seznamů
for u in 1..n:
for v in 1..n:
if A[u][v] = 1:
append v to adj[u]
adj ← n prázdných seznamů
for u in 1..n:
for v in 1..n:
if A[u][v] = 1:
append v to adj[u]
A ← n×n nuly
for u in 1..n:
for v in adj[u]:
A[u][v] ← 1
\(\Theta(N^2)\)
\(\Theta(n+2m)\)
Za předpokladu, že nemusíme alokovat paměť
... jinak \(\Theta(N^2)\)
Příklad
DFS/BFS se sekvenčním přístupem
Předpokládejte, že máte k dispozici neorientovaný graf \(G = (V,E)\),
který je reprezentován seznamem hran.
Seznam hran není nijak uspořádán!
Přístup k jeho jednotlivým prvkům je pouze sekvenční (nelze přistupovat pomocí indexu).
Určete asymptotickou složitost BFS a DFS.
Přípomenutí:
Jaká je asymptotická složitost klasického BFS a DFS?
BFS(G, s):
for v in V: visited[v] ← false
Q ← empty queue
visited[s] ← true
enqueue(Q, s)
while Q not empty:
u ← dequeue(Q)
for v in adj[u]:
if not visited[v]:
visited[v] ← true
enqueue(Q, v)
DFS(G, s):
for v in V: visited[v] ← false
DFSvisit(s)
DFSvisit(u):
visited[u] ← true
for v in adj[u]:
if not visited[v]:
DFSvisit(v)
Správná odpověď: \(\Theta(n + m)\)
\(n\) uzlů a \(m\) hran
Neorientovaný graf \(G = (V,E)\) je reprezentován seznamem hran.
$$ \langle v_1, v_4 \rangle, \langle v_2, v_5 \rangle, \langle v_2, v_6 \rangle, ...$$
Pro každý uzel musí být prozkoumán celý seznam hran:
$$O(\lvert V\rvert \cdot \lvert E\rvert)$$
Cvičení:
Mějme neorientovaný graf na 2D mřížce o velikosti \(N \times N\). Určete, jak velký zásobník/fronta je potřeba alokovat pro BFS/DFS worst-case-scenario při dané konfiguraci?
start
cíl
start
cíl
start
cíl
BFS:
Počet uzlů jedné vrstvy je nejvýš \(\Theta(N)\).
DFS:
Může jít přes všechny uzly bez návratu - v zásobníku drží celou cestu: \(\Theta(N^2)\).
Příklad
Hledání minimální kostry
Napište pseudokód Jarníkova algoritmu, určete jeho časovou složitost a najděte pomocí něj minimální kostru následujícího grafu:

3
1
4
2
1
D
E
C
B
A
3
1
4
2
1
D
E
C
B
A
Prim / Jarník
Jarnik(G, start):
for v in V:
key[v] ← +∞
parent[v] ← NIL
inT[v] ← false
key[start] ← 0
H ← min-heap všech vrcholů podle key[·]
while H není prázdný:
u ← extract_min(H) // nejmenší key
inT[u] ← true // u přidáme do stromu
for (v, w_uv) in adj[u]: // všechny hrany z u
if not inT[v] and w_uv < key[v]:
parent[v] ← u
key[v] ← w_uv
decrease_key(H, v, key[v])
return { (parent[v], v) | v ∈ V \ {start} }
3
1
4
2
1
D
E
C
B
A
Vybereme náhodný startovní bod:
Visited
Open
3
1
4
2
1
D
E
C
B
A
Expandujeme nejlevnější hranou
Visited
Open
3
1
4
2
1
D
E
C
B
A
Pokračujeme...
Visited
Open
3
1
4
2
1
D
E
C
B
A
Pokračujeme...
Visited
Open
3
1
4
2
1
D
E
C
B
A
Hotová minimální kostra
Visited
Open