# Randomizované algoritmy ## Motivace Mějme pole prvků, které je tvořeno stejným počtem prvků **a** a **b** v nejznámém pořadí. Cílem je najít znak **a**. Deterministicky: - $n/2$ kroků v nejhorším případě (pokud napřed budou všechna **b**) Randomizovaně: - kontrola v náhodném pořadí - s velkou pravděpodobností najdeme **a** brzy bez ohledu na vstup - tzv. Las Vegas algoritmus + randomizovaný algoritmus může být jednodušší neý deteministický při stejném nejhorším případě jako deterministický (např. quicksort) + jednoduchou deterministickou heuristikou s dobrými výsledky může být možné převést na algoritmus s dobrým nejhorším případem dodání náhodnosti (např. medián) + někdy náhodnost může řešit problémy, které deterministicky není možné řešit (problémy řešené orákulem) nebo se zdají nemožné Randomizace - vhodný nástroj pro vylepšování algoritmů, které mají špatný nejhorší případ a dobrý průměrný případ - nejhorší případ zůstává, ale závisí na štěstí, ne na pořadí vstupních dat - využití v kryptografii, kvantových výpočtech, hrách, simulacích, ... ## Randomizované algoritmy - dělá nedeterministická, náhodná rozhodnutí - např. uvažuje vstupní data v náhodném pořadí, vybírá alternativu podle prahování na základě náhodného čísla - v určitém momentu dělá náhodný výběr - inkrementální - náhodné pořadí vkládání - D&C - náhodný výběr vzorku - obvykle jednodušší implementace, v praxi často rychlejší Převod na nerandomizovaný alg. - není jasné, jestli je to vždy možné bez zhoršení výkonu - není znám žádný randomizovaný polynomiální algoritmus pro NP-úplné problémy - existují problémy, kde je znám účinný randomizovaný algoritmus, ale není znám účinný deterministický algoritmus - a není známo, zda jde o P nebo NP problém (např. test prvočísel) **Dělení** - randomizované inkrementální algoritmy - lineární programování - rozděl a panuj ### Vzorkování - nezjišťujeme hodnotu pro každou osobu nebo množinu jednotek, ale jen pro některé náhodné nebo nenáhodné - důvody: čas a peníze - ze vzorků odhady pro celou populaci - vzorek musí být dostatečně velký **Náhodné vzorkování** - u všech položek stejná pravděpodobnost výběru - není zkleslení vlivem výběru jednotek do vzorku - používáno u D&C - pro dělení použita náhodně vybraná podmnožina - využíváno pro vyhledávácí datové stuktury a přibližná řešení - typy - jednoduché - každá položka má stejnou šanci na zařazení do výběru - jednoduché, pro malé aplikace snadné, pro velké problematické - systematické (intervalové) - mezi výběry interval, 1. index vybrán náhodně - často v průmyslu nebo obchodu - výhody: dobré rozložení v populaci - nevýhody: úchylky ve struktuře => zkreslení výsledků - stratifikované - rozdělení populace do různých skupin (strat - věk, pohlaví, stát, ...) - vhodné, pokud jsou skupiny jednoduché a dobře porovnatelné, přičemž uvnitř skupiny jsou podobné názory - shlukované - rozdělit populaci na náhodný počet shluků, do vzorku zahrnout všechny jednotky vybraných shluků - z nevybraných shluků se nic nevybírá - výhody: redukce ceny, vzorek lokalizován v několika shlucích - nevýhody: méně přesné výsledky, větší vzorkovací chyba - víceúrovňové - jako shlukové, ale zahrnuje výběr vzorku z každého vybraného shluku (ten se nepoužije celý) - výběr vzorků na nejméně dvou úrovních - v 1. zvoleny velké skupiny - ve 2. jednotky - výhody: pohodlné, ekonomické, účinné - nevýhody: malá přesnost kvůli vyšší vzorkovací chybě ### Jiné dělení randomizovaných **Monte Carlo** - vždy dostaneme odpověď, ne vždy ale správnou - náhodnost použita pro vedení algoritmu k řešení rychlejším způsobem s rizikem chyby - nelze určit, zda odpověď algoritmu je správná - můžeme algoritmus spouštět opakovaně a srovnat výsledky - výstup chápán jako náhodná proměnná - příklad: ověření prvočísla - využijeme hledání dělitele - $a$ z intervalu $2\dots n/2$ takové, že $n$ je dělitelné $a$ - randomizovaný algoritmus - vzorkuje se 10 čísel z intervalu, podle toho odpoví - typy - s jednostrannou chybou - pouze pro rozhodovací problémy - neřekne ano, pokud nemá požadovanou vlastnost - někdy řekne ne, i když má tuto vlastnost - velmi praktické, drastická redukce složitosti - s oboustrannou chybou - nechat algoritmus běžet $t$-krát a vzít převažující výsledek - s neohraničenou chybou - obecný randomizovaný algoritmus - může potřebovat exponenciální počet běhů pro podstatný nárůst pravděpodobnosti úspěchu **Las Vegas** - vždy správná odpověď, ale náhodná doba běhu - náhodnost využita k nalezení kratší cesty ke správné odpovědi - někdy selže - vybraná cesta nevede k řešení - složitost lze chápat jako náhodnou proměnnou - lze jej změnit na Monte Carlo tím, že se po stanoveném čase ukončí a vydá libovolnou odpověď - příklady - randomizovaný quicksort ## Náhodná čísla - na deterministickém zařízení nelze dosáhnout úplné náhodnosti, můžeme doufat jen v pseudonáhodná čísla - **špatný generátor** - vážné důsledky (obzvláště v kryptografii) - nejčastěji lineární kongruentní generátor - $R_{n} = (aR_{n-1} + c) \mod n$ - pro 32 bitů: $R_{0} = 0, a = 1366, c = 150889$ - hodnoty bez znalosti teorie neměnit