FAV-ZCU/KIV PPA2/Prednaska13.md

102 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vypočítatelnost, složitost problémů
**Motivace**
- spousta algoritmů řazení
- různé složitosti
- stále stejný problém
- existuje pro daný problém lepší (rychlejší) algoritmus?
**Problém**
- množina vstupů A a množina výstupů B
- $A \times B$ - kartézský součin
- pro danou dvojici $(a, b), a \in A, b \in B$ říká, zda pro vstup a je b řešením problému
- podmnožina $X = \{ (\{1\}, 1), (\{1,2\}, 1), (\{2,3\}, 2), \dots \}$
- hledáme takové $b \in B$ pro dané $a \in A$, že $(a, b) \in X$
- problém řeší algoritmus
- a je vstup
- b je výstup
- algoritmus musí vrátit nic, pokud pro $a \in A$ neexistuje žádné $b \in B$ tak, že $(a, b) \in X$
- rozhodovací problém
- určuje, zda existuje řešení hlavního problému
- máme druhou množinu $X'$, která označuje, jestli existuje $(a, b) \in X$, například $X' = \{((10, 15), \text{true}), ((7, 3), \text{false})\}$
- určitě není složitější než hlavní problém
**Existuje pro každý problém algoritmus?**
- Záleží na programovacím jazyce?
- každý algoritmus může být vykonán tzv. Turingový strojem
- pokud v nějakém jazyce jde implementovat Turinguův stroj, pak lze popsat libovolný algoritmus
**Problém zastavení** (halting problem)
- $A:$ všechny možné programy v Javě včetně hodnot parametrů
- $B: \{\text{true}, \text{false}\}$
- $X:$ skončí program po konečném počtu kroků?
- problém je algoritmicky nerozhodnutelný
**Algoritmická neřešitelnost**
- pro řešení některých problémů prokazatelně neexistuje žádný algoritmus
- než začneme problém řešit, zamysleme se, zda je vůbec řešitelný
- má smysl hledat efektivnější algoritmus?
**Stromová reprezentace**
- list
- permutace vstupů
- všechny permutace musí být možné
- počet permutací: $n!$
- výška stromu
- maximální počet provedených operací
+ nejlepší možný strom
- nutný počet listů: $n!$
- největší možný počet listů: $2^h$ (úplný strom)
+ $n! = 2^h$
+ $\log_{2}(n!) = h$
+ platí $\log_{2}(n!) \in \Omega(n \log(n))$ (Stirlingova aproximace)
+ tedy $h \in \Omega(n \log(n))$
+ nemůže tedy existovat lepší řadící algoritmus než se složitostí $\Omega(n \log(n))$
**Třída problémů P**
- pro řešení problému v této třídě existuje (polynomiální) algoritmus se složitostí $\mathcal{O}(n^k)$
**Třída problémů NP**
- pro řešení problému v této třídě existuje nedeterministický algoritmus s polynomiální složitostí $\mathcal{O}(n^k)$
- "řeší" rozhodovací úlohy
- binární výstup, ale jiná interpretace
- `true`: ano, řešení obecné úlohy existuje
- `false`: nevíme
- nedeterministický skok
- provede náhodné volby a ověří, jestli je to správně
- pokud je řešením pro vstup $a \in A$
- `true`, pak musí existovat posloupnost náhodných voleb (tzv. certifikát) taková, která povede na odpověď `true`
- `false`, pak nesmí existovat posloupnost náhodných voleb taková, která povede na odpověď `true`
**Polynomiální převoditelnost**
- problém $X_{1}$ je polynomiálně převoditelný na $X_{2}$, když $X_{1}(a) = X_{2}(f(a))$
- funkce $f()$ musí být vyhodnotitelná v polynomiálním čase
+ vstup pro problém $X_{1}$ je možné funkcí $f()$ převést na vstup pro problém $X_{2}$
+ problém $X_{1}$ je možné vyřešit algoritmem řešícím $X_{2}$
+ je-li $X_{2}$ polynomiální, pak je i $X_{1}$ polynomiální
+ z hlediska polynomiality není $X_{1}$ složitější než $X_{2}$
**Cookova-Levinova věta**
- každá NP úloha je polynomiálně převoditelná na problém splnitelnosti logické formule
- důkaz (náznak)
- algoritmus ověřující řešení obecné úlohy lze popsat Turingovým strojem
- Turingův stroj lze popsat logickou formulí
- splnitelnost formule implikuje existenci řešení obecné úlohy
- důsledky
- pokud by existoval polynomiální algoritmus na SAT (satisfyability), pak by existoval polynomiální algoritmus na všechny NP problémy
- NP je velmi široká třída problémů a nezdá se pravděpodobné, že by pro všechny existoval polynomiální algoritmus
- není to ale nemožné
**NP-úplné problémy** (NP-Complete, NPC)
- množina problémů, na které lze převést všechny NP problémy
- SAT je NPC (krátká formulace Cookovy-Levinovy věty)
- dı́ky tomu lze NP-úplnost dokázat snadněji
- stačı́ ukázat, že SAT je převoditelná na daný NP problém X
- tranzitivitou převoditelnosti je dokázáno, že všechny NP jsou převoditelné na X
**NP-těžké problémy** (NP-Hard)
- problémy které jsou přinejmenšı́m tak těžké jako NP-úplné
- obecné problémy odpovı́dajı́cı́ NP-úplným rozhodovacı́m úlohám
- tzn. v polynomiálnı́m čase ověřı́me řešenı́, které ale musı́me uhodnout
- v praxi častějšı́ než NP-úplné
- stejné praktické důsledky jako NP-úplnost