Přidání 3. přednášky z PPA2

This commit is contained in:
Filip Znachor 2023-03-03 00:51:46 +01:00
parent 0a03c328cd
commit f6275f44e0
2 changed files with 89 additions and 0 deletions

89
KIV PPA2/Prednaska03.md Normal file
View File

@ -0,0 +1,89 @@
# Výpočetní složitost
- doba výpočtu T(n) v závislosti na vstupu n
- je důležité určit, co je důležité
- zajímá nás, co se děje, když n roste
- různé funkce rostou různě rychle
- druhy algoritmů
- rychle rostoucí funkce = neefektivní algoritmus
- pomalu rostoucí funkce = efektivní algoritmus
- záleží na tom, jestli se funkce vejde pod jinou
- například lineární pod kubickou
- ne hned, ale od nějakého $n_0$ ano
- nezáleží na násobku, jen to $n_{0}$ bude dál
## O-notace
$O(f(n))$ je množina všech funkcí, pro které platí, že $g(n) < c \cdot f(n)$ pro všechna $n > n_0 > 0$ a nějaké $c > 0$.
- je-li $g(n) \in O(f(n))$, pak
- $g(n)$ se vejde pod $f(n)$
- $g(n)$ neroste rychleji než $f(n)$
**Význam O-notace:**
- omezuje funkci jen shora
- je záruka (**nebude to horší než...**)
- příslušnost do $O(f(n))$ implikuje **efektivitu**, pokud $f(n)$ roste dost pomalu
U funkcí nezáleží na přenásobení konstantou, přičtení konstanty ani na základu logaritmu:
| pokud | platí také |
| ---------------------- | ------------------ |
| $g(n) \in O(kf(n))$ | $g(n) \in O(f(n))$ |
| $g(n) \in O(k + f(n))$ | $g(n) \in O(f(n))$ |
| $O(\log_{a}(n)) =$ | $O(\log_{b}(n))$ |
Mezi některými množinami $O(f(n))$ platí tyto vztahy:
$$
O(1) \subset O(\log(n)) \subset O(\sqrt{n}) \subset 0(n) \subset O(n \cdot \log(n)) \subset O(n^2) \subset O(n^3) \subset O(2^n) \subset 0(e^n)
$$
U 0-notace nezáleží na násobku ani na přičtení konstanty či menší funkce, proto se např. $g(n) = 2 \cdot n^2 + 5 \cdot n + 4$ vejde pod $0(n^2)$.
![Zanořování O množin](_assets/zanorovani-o-mnozin.png)
## Omega notace
$\Omega(f(n))$ je množina všech funkcí, pro které platí, že $g(n) > c \cdot f(n)$ pro všechna $n > n_0 > 0$ a nějaké $c > 0$. (jediná změna je ve znaménku větší než)
- Omega notace je opakem O-notace
- funkce $g(n)$ patří do $\Omega(f(n))$ když $g(n)$ roste **stejně rychle nebo rychleji** než $f(n)$
Význam Omega notace:
- omezuje funkci jen zdola
- říká, že **to nebude lepší než...**
- příslušnost do $\Omega(f(n))$ implikuje **neefektivitu**, pokud $f(n)$ roste rychle
Mezi Omega množinami existují **obrácené vztahy** oproti O-množinám.
## Theta notace
Pokud $g(n) \in O(f(n))$ a zároveň $g(n) \in \Omega(f(n))$, pak $g(n) \in \Theta(f(n))$.
- neroste rychleji ani pomaleji - roste stejně rychle
- graf $g(n)$ je od jistého $n_{0}$ možné uzavřít mezi grafy $c_{1} \cdot f(n)$ a $c_{2} \cdot f(n)$
- patrně $c_{1} < c_{2}$
Theta množiny jsou disjunktní - funkce **nemůže patřit do více množin zároveň**.
Výjimka: Pokud $g_{1}(n) = 1000n, g_{2}(n) = n\log(n)$, pak pro všechna realistická n platí $g_{2}(n) < g_{1}(n)$, protože funkce $g_{1}$ bude efektivnější ve **velmi velkých číslech**.
## Důležitá poznámka
Význam funkcí může být:
- čas výpočtu pro jakýkoli vstup velikosti n
- čas výpočtu pro nejlepší možný vstup velikosti n
- čas výpočtu pro nejhorší možný vstup velikosti n
- průměrný čas výpočtu pro vstup velikosti n
- počet instrukcí pro ...
- množství paměti nutné pro zpracování ...
- ...
Je ale potřeba nesrovnávat hrušky s pomeranči.
- Jeden program může mít **v očekávaném případě lepší efektivitu** než jiný **v tom nejhorším případě**, přesto však ten první nemusí být lepší (v nejhorším případě může být mnohem méně efektivní).
## Určení výpočetní složitosti programu
- je potřeba určit funkci $g(n)$
- při určování můžeme zanedbat časy jednotlivých instrukcí, **pokud jsou opravdu konstatní** (nezávislá na parametru n)
- výpočetní složitost neřeší rozdílné výkony počítačů

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB